Хранение набора значений в Delphi - PullRequest
1 голос
/ 13 апреля 2010

Я пытаюсь сохранить набор значений в Delphi, но я хочу иметь возможность обращаться к ним, используя их имя вместо назначенного номера.

Например, массив 'OldValues' позволил бы мне сделать

OldValue[1] := InflationEdit.Text;

В идеале, однако, я бы хотел, чтобы значение хранилось, например, в Data.Inflation.OldValue Для каждого идентификатора, такого как Инфляция, есть OldValue, NewValue и StoredValue. Существует около 12 таких идентификаторов.

Есть ли какой-нибудь способ, которым я мог бы хранить такие значения? тогда я мог бы сделать что-то вроде:

Data.Inflation.NewValue := Data.Inflation.OldValue;
Data.Inflation.NewValue := InflationEdit.Text;

Ответы [ 4 ]

2 голосов
/ 13 апреля 2010

Класс действительно очень пригодился бы для такого рода проблем. что-то вроде;

// Inflation record
TInflation = record
  NewValue,
  OldValue:string;
end;

/ data class
Tdata = class(object)
private
  Inflation:TInflation;
  // other properties
  ...
public
 constructor ...

end;

data := TData.create(nil)

data.Inflation.NewValue :=  data.inflation.OldValue;
...
1 голос
/ 13 апреля 2010

Какая версия Delphi?Если это Delphi 2009 или новее, вы можете использовать TDictionary .

. Сохраните свое имя как ключ и объект с членами OldValue и NewValue в качестве значения.

MyDictionary: TDictionary<string, TMyClass>;

Поиск заданного экземпляра TMyClass по имени:

MyDictionary.Items[SomeName];
1 голос
/ 13 апреля 2010
type
  TIndentifier = class
  private
    FOldValue: string;
    FNewValue: string;
    FStoredValue: string;
  public
    constructor Create(const OldValue, NewValue, StoredValue: string); 
    property OldValue: string read FOldValue write FOldValue;
    property NewValue: string read FNewValue write FNewValue;
    property StoredValue: string read FStoredValue write FStoredValue;
  end;

Это ваш базовый класс. Вы используете это для каждого значения. Тогда у вас есть два варианта. Вы можете просто сделать это так:

var
  Values: TStringList;
begin
  Values.AddObject('SomeValue', TIndentifier.Create('OldValue', 'NewValue', 'StoredValue'));

Это напоминает мне, насколько похож на швейцарский нож TStringList :). Будьте осторожны, чтобы освободить объекты в старых версиях delphi, или установите TStringList в качестве владельца объектов в последних версиях.

Или вы можете иметь список объектов, если вам нужно больше, чем просто имя:

   type   
      TValue = class(TIndentifier) 
      private
        FName: string;   
      public
        property Name: string read FName write FName;    
      end;

    var
      Value: TValue;    
      Values: TObjectList;   
    begin   
      Value := TValue.Create('OldValue', 'NewValue', 'StoredValue');   
      Value.Name := 'SomeValue';  
      Values.Add(Value);

Но что мне действительно нравится в таких случаях, так это мощь XML. Это экономит так много кода, но с другой стороны скрывает объявления. С моим SimpleStorage вы можете сделать что-то вроде этого:

    var
      Value: IElement;
      Storage: ISimpleStorage:
    begin
      Storage := CreateStorage;
      Value := Storage.Ensure(['Values', 'SomeValue']); 
      Value.Ensure('OldValue').AsString := 'OldValue';
      Value.Ensure('NewValue').AsString := 'NewValue';
      Value.Ensure('StoredValue').AsString := 'StoredValue';
1 голос
/ 13 апреля 2010

Это может работать для вас:

  • Наборы данных имеют поля.
  • Поля имеют OldValue и Value.
  • Поля могут быть постоянными (поэтому они объявляются, и у вас есть завершение кода на них).
  • TClientDataSet (который является DataSet) - это просто таблица в памяти, содержащая ноль или более записей.

- Йерун

...