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

时间:2010-10-18 21:24:16

标签: delphi data-binding tdataset

我正在寻找一种方法来为delphi中的TDBLookupComboBox提供ListSource,而不需要在数据库服务器上有一个实际的表来绘制该列表。组合框的DataField是1个字符的字段,包含编码值,例如'A'='驾驶执照','B'='护照','C'='图书馆卡'等。也就是说该表仅包含A,B或C.该应用程序负责在GUI中显示“Drivers License”。通常,数据库可能有一个查找表但该数据库没有,我无法添加一个。我的想法是数据库查找控件的DataSource和ListSource不必是同一个数据库,所以如果可以在我的表单中定义一个包含查找数据的小表,那么我可以使用它不需要真正的数据库表。

是否有人知道delphi组件允许在表单上定义TDataSet而不在其后面有任何实际数据文件?

4 个答案:

答案 0 :(得分:6)

我知道有不同的内存数据集。 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;

答案 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属性设置存储在数据库中的实际值。