Delphi 在设计时将TDataSet嵌入表单中

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中为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类,但这并没有增加我程序的内存使用量,也不需要我向安装程序添加任何内容。这使得这个解决方案比我更可取。