質問

データベースサーバーに実際のテーブルを描画することなく、DelphiのTDBlookupComboBoxにリストソースを提供する方法を探しています。コンボボックスのデータフィールドは、「a」= 'ドライバーライセンス'、「b '='パスポート」、「c」= 'ライブラリカードなどのコード化された値を含む1文字フィールドです。テーブルにはA、B、またはCのみが含まれていることは、アプリケーションにGUIに「ドライバーライセンス」を表示する責任があります。通常、データベースには検索テーブルがある場合がありますが、このデータベースはそうではなく、追加できません。私の考えは、DBルックアップ制御のデータソースとリストソースは同じデータベースである必要はないということです。したがって、ルックアップデータを含む私のフォームの小さなテーブルを定義できる場合、それを使用できます。実際のデータベーステーブルは必要ありません。

実際のデータファイルを背後に持っていない形式でTDATASETを定義できるDelphiコンポーネントを知っている人はいますか?

役に立ちましたか?

解決

別のソリューションは、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をトブジェストとして保存するためにラッパークラスを作成するか、chrを使用して整数に変換してから、それをキャストしてくださいが、上記は上記です。私の意見ではより簡単です。

他のヒント

さまざまなインメモリデータセットがあることを知っています。 DelphiにはTclientDatasetが付属しています。これは、必要な方法で使用できます。動作するために実行可能ファイルでmidas.dllを展開する必要があります。または、このライブラリを実行可能ファイルに静的にリンクするには、使用節にmidaslibを含める必要があります(実行時にはmidas.dllは必要ありません)。

TclientDatasetから必要なものを取得するには、フィールドを作成できます。

  • レコードをXMLファイルに保存します(たとえば、作成した別の補助ツールを使用して)。実行時に、TclientDatasetのLoadFromFileメソッドを使用してデータをロードします。さらに、このXMLは$ rディレクティブを使用してリソースとして保存し、実行時にこのリソースを操作して、クライアントダタセットに含まれるデータをフィードして、XMLファイルの展開(および可能な変更)をEXEで防止できます。
  • createdAtaSetメソッドを使用し、実行時に必要なものを記録に挿入/入力します

コードサンプル:

procedure TFrom1.Init;
begin
  cdsIDType.CreateDataSet;
  cdsIDType.InsertRecord('A', 'Drivers License');
  cdsIDType.InsertRecord('B', 'Passport');
  //etcetera.
end;

TclientDatasetを使用してフィールドを定義し、DataSourceに接続します。フォームのCreateイベントでは、これを行います。ClientDataSetのcreatedAtaSetメソッドを実行し、A、B、Cデータを入力します。

使用する場合 JVCL, 、あなたが望むものは、データセットを含めることなく達成することができます。 TJVDBComboBoxを使用して、項目プロパティを使用してUIに表示する値を設定し、値プロパティを使用してデータベースに保存されている実際の値を設定します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top