Delphi 在设计时将TDataSet嵌入表单中
我正在寻找一种在delphi中为TDBLookupComboBox提供ListSource的方法,而不必在数据库服务器上使用实际的表来绘制列表。组合框的数据字段是一个1个字符的字段,其中包含编码值,例如“a'=”驾照“、”B'=”护照“、”C'=”图书卡“、等等。也就是说,该表仅包含a、B或C。应用程序负责在GUI中显示“驾照”。通常一个数据库可能有一个查找表,但这个数据库没有,我不能添加一个。我的想法是,DB查找控件的DataSource和ListSource不必是同一个数据库,因此,如果可以在我的表单中定义一个包含查找数据的小表,那么我可以使用该表,而不需要实际的数据库表Delphi 在设计时将TDataSet嵌入表单中,delphi,data-binding,tdataset,Delphi,Data Binding,Tdataset,我正在寻找一种在delphi中为TDBLookupComboBox提供ListSource的方法,而不必在数据库服务器上使用实际的表来绘制列表。组合框的数据字段是一个1个字符的字段,其中包含编码值,例如“a'=”驾照“、”B'=”护照“、”C'=”图书卡“、等等。也就是说,该表仅包含a、B或C。应用程序负责在GUI中显示“驾照”。通常一个数据库可能有一个查找表,但这个数据库没有,我不能添加一个。我的想法是,DB查找控件的DataSource和ListSource不必是同一个数据库,因此,如果可以
有谁知道delphi组件允许在表单上定义TDataSet而不需要任何实际数据文件吗?如果使用,则可以在不涉及数据集的情况下完成所需操作。只需使用TJVDBCOMBOX,使用Items属性设置希望UI显示的值,并使用values属性设置存储在数据库中的实际值。使用TClientDataset并定义字段,然后连接到数据源。 在表单的oncreate事件中,执行以下操作:
执行clientdataset的createdataset方法,然后用A、B、C数据填充它。我知道内存中有不同的数据集。Delphi附带TClientDataSet,您可以按照自己的方式使用它。为了工作,您必须将midas.dll与可执行文件一起部署,或者必须在uses子句中包含MidasLib,以便在可执行文件中静态链接此库(运行时不需要midas.dll) 要从TClientDataSet获取所需内容,可以创建字段和:
- 将记录存储在xml文件中(例如,使用您制作的另一个辅助工具)。在运行时,使用TClientDataSet的LoadFromFile方法加载数据。此外,您可以使用$R指令将此xml存储为资源,并在运行时操作此资源以向ClientDataSet提供包含的数据,以防止使用exe部署(以及可能的修改)xml文件
- 使用CreateDataSet方法并在运行时插入/填充所需的记录
procedure TFrom1.Init;
begin
cdsIDType.CreateDataSet;
cdsIDType.InsertRecord('A', 'Drivers License');
cdsIDType.InsertRecord('B', 'Passport');
//etcetera.
end;
另一种解决方案是使用TComboBox而不是TDBLookupComboBox。使用t字典定义简单的内存内查找
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;
类型
TMyForm=类(TForm)
MyComboBox:TComboBox;
MyDataset:TSimpleDataSet;
程序变更(发送方:ToObject);
过程表单创建(发送方:ToObject);
私有的
组合查找:t字典;
结束;
实施
{$R*.dfm}
程序TMyForm.FormCreate(发送方:TObject);
变量
键:字符串;
开始
ComboLookup:=TDictionary.Create;
ComboLookup.Add('driverslicense','A');
ComboLookup.Add('Passport','B');
ComboLookup.Add('Library Card','C');
用于组合查找中的键。键执行
开始
MyComboBox.Items.Add(Key);
结束;
结束;
程序TMyForm.MyComboxChange(发送方:ToObject);
开始
//这可能是错的,我懒得看
//找到在代码中更改字段值的正确方法。
MyDataset.Fields.FieldByName('IDCard').AssString:=ComboLookup[MyComboBox.Text];
结束;
您可以使用TComboBox.Items.AddObject而不是单独的查找表,但您必须创建一个包装类来将字符存储为TObject,或者使用Chr将其转换为整数,然后将其强制转换为TObject,但我认为上述方法更简单。这是一个技术上正确的答案,然而,它使我的程序的内存使用量大大增加,安装程序的大小(这是一个问题,因为我用电子方式分发程序)。我用Delphi 2007做了一个简单的测试,也看到了你认为安装程序的大小有多大的增加。将TClientDataSet组件和MidasLib添加到uses子句exe中会增加约320Kb,而安装程序(使用inno setup+lzma制作)会增加约120Kb。除非你用的是3.44“磁盘,我认为如此大的尺寸值得您使用ClientDataSet获得的功能。这不是我要求的,但这是一个很好的解决方案。我唯一的问题是TDictionary似乎不适用于Delphi Win32。我怀疑你是在建议使用.Net类。最后,我为自己创建了一个小字典类,允许我使用这个解决方案。尽管必须创建自己的dictionary类,但这并没有增加我程序的内存使用量,也不需要我向安装程序添加任何内容。这使得这个解决方案比我更可取。