代码之家  ›  专栏  ›  技术社区  ›  William Leader

在设计时将TDataset嵌入表单中

  •  3
  • William Leader  · 技术社区  · 14 年前

    我正在寻找一种方法来为Delphi中的tdblookupcomboBox提供一个listsource,而不需要在数据库服务器上有一个实际的表来从中提取该列表。组合框的数据字段是一个1个字符的字段,其中包含一个编码值,如“A”=“Drivers License”、“B”=“Passport”、“C”=“Library Card”等,也就是说,该表只包含A、B或C。应用程序负责在GUI中显示“Drivers License”。通常,一个数据库可能有一个查找表,但这个数据库没有,我不能添加一个。我的想法是,数据库查找控件的数据源和listsource不必是同一个数据库,因此如果可以在我的窗体中定义一个包含查找数据的小表,那么我可以使用不需要真正的数据库表。

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   anon    14 年前

    另一种解决方案是使用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;
    

    您可以使用tcomboxbox.items.addobject而不是单独的查阅表格,但您必须创建一个包装类来将char存储为tobject,或者使用chr将其转换为整数,然后将其转换为tobject,但在我看来,上述方法更简单。

        2
  •  6
  •   jachguate    14 年前

    我知道内存中有不同的数据集。Delphi附带了tclientdataset,您可以按照自己的方式使用它。为了工作,必须将midas.dll与可执行文件一起部署,或者必须将midaslib包含在uses子句中,以便在可执行文件中静态链接此库(运行时不需要midas.dll)。

    要从tclientdataset获取所需的内容,可以创建字段并:

    • 将记录存储在一个XML文件中(例如使用您制作的另一个辅助工具)。在运行时,使用tclientdataset的loadfromfile方法加载数据。此外,您可以使用$R指令将此XML存储为资源,并在运行时操作此资源以向客户端数据集提供包含的数据,以防止用您的exe部署(以及可能的修改)XML文件。
    • 使用CreateDataset方法并使用运行时所需的内容插入/填充记录

    代码示例:

    procedure TFrom1.Init;
    begin
      cdsIDType.CreateDataSet;
      cdsIDType.InsertRecord('A', 'Drivers License');
      cdsIDType.InsertRecord('B', 'Passport');
      //etcetera.
    end;
    
        3
  •  1
  •   Francis Lee    14 年前

    使用tclientdataset并定义字段,然后连接到数据源。 在窗体的onCreate事件中,执行以下操作: 执行clientDataSet的createDataset方法,然后用A、B、C数据填充它。

        4
  •  -1
  •   jachguate    14 年前

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