在设计时以形式嵌入tdataset
-
09-10-2019 - |
题
我正在寻找一种提供Delphi中TDBlookupCombobox的列表资源的方法,而没有在数据库服务器上使用实际表格以从列表中绘制该列表。组合框的数据场是一个1个字符字段,其中包含一个编码值,例如'a'='drivers许可证','b'='passport','c'=“库卡”等。该表仅包含A,B或C。该应用程序负责在GUI中显示“驾驶执照”。通常,数据库可能有一个查找表,但是该数据库没有,我不能添加一个。我的想法是,数据库查找控件的数据源和列表源不一定是同一数据库,因此,如果可以在我的表单中定义包含查找数据的小表格,那么我可以使用它不需要真实的数据库表。
有谁知道允许在表单上定义tdataset而没有任何实际数据文件的Delphi组件?
解决方案
另一种解决方案是使用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代替单独的查找表我认为更简单。
其他提示
我知道有不同的内存数据集。 Delphi带有TCLIENTDATASET,您可以使用所需的方式。您必须使用可执行文件部署MIDAS.DLL才能工作,或者必须将Midaslib包含在您的使用条款中,才能在可执行文件中静态地链接此库(在运行时不需要MIDAS.DLL)。
为了从TCLIENTDATASET获得想要的东西,您可以创建字段,并且:
- 将记录存储在XML文件中(例如,使用您制作的另一个辅助工具)。在运行时,加载数据使用TCLIENTDATASET的LOADFROMFILE方法。此外,您可以将此XML存储为使用$ R指令的资源,并在运行时操纵此资源,以使用包含的数据为您的客户端喂食您的客户端,以防止使用EXE对XML文件的部署(以及可能的修改)。
- 使用创建的方法,并在运行时插入/填充记录
代码样本:
procedure TFrom1.Init;
begin
cdsIDType.CreateDataSet;
cdsIDType.InsertRecord('A', 'Drivers License');
cdsIDType.InsertRecord('B', 'Passport');
//etcetera.
end;
使用tclientdataset并定义字段,然后连接到数据源。在表单的发行事件中,执行以下操作:执行客户端dataset的创建方法,然后用A,B,C数据填充它。
如果您使用 JVCL, ,如果不涉及数据集,就可以完成您想要的。只需使用tjvdbcombobox,使用项目属性设置您要显示的值,并使用值属性来设置存储在数据库中的实际值。