3

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

有谁知道允许在表单上定义 TDataSet 而没有任何实际数据文件的 delphi 组件?

4

4 回答 4

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;
于 2010-10-18T21:51:37.127 回答
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 但以上是在我看来更简单。

于 2010-10-19T14:43:38.510 回答
1

使用 TClientDataset 并定义字段,然后连接到数据源。在表单的 oncreate 事件中执行以下操作:执行 clientdataset 的 createdataset 方法,然后用 A、B、C 数据填充它。

于 2010-10-18T21:46:55.610 回答
-1

如果您使用jvcl,您可以在不涉及数据集的情况下完成您想要的。只需使用 TjvDBComboBox,使用 Items 属性设置您希望 UI 显示的值,并使用 Values 属性设置存储在数据库中的实际值。

于 2010-10-18T21:43:50.327 回答