2010-04-13 83 views
1

我想在delphi中存储一组值,但我希望能够使用它们的名称而不是分配的编号来解决它们。在德尔福存储一组数值

例如,“OldValues”的阵列将让我做

OldValue[1] := InflationEdit.Text; 

理想但是,我想有存储在“Data.Inflation.OldValue”例如一个值。对于每个标识符(如通货膨胀),都有一个OldValue,NewValue和StoredValue。大约有12个这样的标识符。

有没有什么方法可以存储这样的值?这样我就可以做这样的事情:

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

回答

2

一个类真的会在这类问题上非常方便。喜欢的东西;

// 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; 
... 
+0

在什么地方“//通胀记录”部分的单位去了? – chendriksen 2010-04-13 09:58:22

+0

在设备的型号部分 – gath 2010-04-13 10:09:02

+0

解决了!记录后,我拿走了分号。JIC任何人都有同样的问题! – chendriksen 2010-04-13 10:27:59

1

这可能会为你工作:

  • 数据集具有字段。
  • 字段具有OldValue和Value。
  • 字段可以是持久的(所以它们被声明并且你有代码完成)。
  • TClientDataSet(它是一个DataSet)基本上只是一个具有零个或多个记录的内存表。

--jeroen

+0

不投票,因为这是一个有效的答案。但是,对于三个字符串的十几条记录,每个CDS对我来说似乎都是过度的。 – 2010-04-13 20:19:59

+0

我使用带有持久字段的ClientDataSets,即使对于单行数据集,通常包装在DataModule中。它使用起来非常简单,并且具有与UI简单绑定的优点。示例:带验证的配置对话框。轻松导出到XML配置文件。随着Delphi 2009中新的泛型(在Delphi 2010中最终稳定),我期望为此提供全新的解决方案。 – 2010-04-15 08:06:04

1
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

什么版本的德尔福?如果是Delphi 2009或更新版本,则可以使用TDictionary

将您的名称存储为Key并将OldValue和NewValue成员存储为值。

MyDictionary: TDictionary<string, TMyClass>; 

按名称搜索TMyClass的给定实例:

MyDictionary.Items[SomeName];