3

データベースサーバー上にそのリストを描画するための実際のテーブルがなくても、デルファイのTDBLookupComboBoxにListSourceを提供する方法を探しています。コンボボックスのDataFieldは、「A」=「運転免許証」、「B」=「パスポート」、「C」=「図書館カード」などのコード化された値を含む1文字のフィールドです。テーブルにはA、B、またはCのみが含まれていること。アプリケーションは、GUIに「運転免許証」を表示する責任があります。通常、データベースにはルックアップテーブルがありますが、このデータベースにはルックアップテーブルがなく、追加できません。私の考えでは、DBルックアップコントロールのDataSourceとListSourceは同じデータベースである必要はないため、ルックアップデータを含む小さなテーブルをフォームで定義できる場合は、それを使用できます。実際のデータベーステーブルは必要ありません。

TDataSetを実際のデータファイルを背後に持たずにフォーム上で定義できるようにするデルファイコンポーネントを知っている人はいますか?

4

4 に答える 4

6

異なるメモリ内データセットがあることを知っています。DelphiにはTClientDataSetが付属しており、好きなように使用できます。動作させるには、実行可能ファイルとともにmidas.dllをデプロイする必要があります。または、実行可能ファイルにこのライブラリを静的にリンクするには、uses句にMidasLibを含める必要があります(実行時にmidas.dllは必要ありません)。

TClientDataSetから必要なものを取得するには、フィールドを作成して次のことを行います。

  • レコードをxmlファイルに保存します(たとえば、作成した別の補助ツールを使用して)。実行時に、TClientDataSetのLoadFromFileメソッドを使用してデータをロードします。さらに、このxmlを$ Rディレクティブを使用してリソースとして保存し、実行時にこのリソースを操作して、含まれているデータを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

別の解決策は、TDBLookupComboBoxではなくTComboBoxを使用することです。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 に答える