我正在寻找一种方法来为delphi中的TDBLookupComboBox提供ListSource,而不需要在数据库服务器上有一个实际的表来绘制该列表。组合框的DataField是1个字符的字段,包含编码值,例如'A'='驾驶执照','B'='护照','C'='图书馆卡'等。也就是说该表仅包含A,B或C.该应用程序负责在GUI中显示“Drivers License”。通常,数据库可能有一个查找表但该数据库没有,我无法添加一个。我的想法是数据库查找控件的DataSource和ListSource不必是同一个数据库,所以如果可以在我的表单中定义一个包含查找数据的小表,那么我可以使用它不需要真正的数据库表。
是否有人知道delphi组件允许在表单上定义TDataSet而不在其后面有任何实际数据文件?
答案 0 :(得分:6)
我知道有不同的内存数据集。 Delphi附带了TClientDataSet,您可以按照自己的方式使用它。您必须使用可执行文件部署midas.dll才能工作,或者必须在uses子句中包含MidasLib,以便在可执行文件中静态链接此库(运行时不需要midas.dll)。
要从TClientDataSet获得所需内容,您可以创建字段并:
代码示例:
procedure TFrom1.Init;
begin
cdsIDType.CreateDataSet;
cdsIDType.InsertRecord('A', 'Drivers License');
cdsIDType.InsertRecord('B', 'Passport');
//etcetera.
end;
答案 1 :(得分:2)
另一种解决方案是使用TComboBox而不是TDBLookupComboBox。使用TDictionary定义简单的内存查找。
type
TMyForm = class(TForm)
MyComboBox: TComboBox;
MyDataset: TSimpleDataSet;
procedure MyComboBoxChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
ComboLookup: TDictionary<string, Char>;
end;
implementation
{$R *.dfm}
procedure TMyForm.FormCreate(Sender: TObject);
var
Key: string;
begin
ComboLookup := TDictionary<string, Char>.Create;
ComboLookup.Add('Drivers License', 'A');
ComboLookup.Add('Passport', 'B');
ComboLookup.Add('Library Card', 'C');
for Key in ComboLookup.Keys do
begin
MyComboBox.Items.Add(Key);
end;
end;
procedure TMyForm.MyComboBoxChange(Sender: TObject);
begin
// This may be wrong didn't bother to look
//up the correct way to change a field's value in code.
MyDataset.Fields.FieldByName('IDCard').AsString := ComboLookup[MyComboBox.Text];
end;
您可以使用TComboBox.Items.AddObject而不是单独的查找表,但您必须创建一个包装类来将char存储为TObject或使用Chr将其转换为整数然后将其转换为TObject但是在我看来,上述内容更为简单。
答案 2 :(得分:1)
使用TClientDataset并定义字段,然后连接到数据源。 在表单的oncreate事件中执行以下操作: 执行clientdataset的createdataset方法,然后用A,B,C数据填充它。
答案 3 :(得分:-1)
如果您使用jvcl,您可以在不涉及数据集的情况下完成所需的操作。只需使用TjvDBComboBox,使用Items属性设置您希望UI显示的值,并使用Values属性设置存储在数据库中的实际值。