設計時に形式でtdatasetを埋め込みます
-
09-10-2019 - |
質問
データベースサーバーに実際のテーブルを描画することなく、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に表示する値を設定し、値プロパティを使用してデータベースに保存されている実際の値を設定します。