2010-10-18 31 views
3

我正在尋找一種方法來爲delphi中的TDBLookupComboBox提供一個ListSource,而不需要在數據庫服務器上有一個實際的表來從中繪製該列表。用於組合框的DataField是包含諸如'A'='駕駛執照','B'='護照','C'='圖書館卡'等編碼值的1個字符的字段。也就是說該表只包含A,B或C.該應用程序負責在GUI中顯示'驅動程序許可證'。通常情況下,數據庫可能有查找表,但這個數據庫沒有,我不能添加一個。我的想法是,用於數據庫查找控件的DataSource和ListSource不必是同一個數據庫,所以如果可以在我的表單中定義一個包含查找數據的小表,那麼我可以使用它不需要真正的數據庫表。在設計時在表單中嵌入一個TDataSet

有誰知道一個delphi組件允許在窗體上定義一個TDataSet,但它沒有任何實際的數據文件嗎?

回答

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但上述更簡單,在我看來。

+0

這不是我要求的,但它是一個很好的解決方案。我唯一的問題是TDictionary doesn Delphi Win32似乎不可用,我懷疑你是在建議使用.Net類,最後我爲自己創建了一個小型的字典類,這讓我可以使用這個解決方案。並沒有增加我的程序的內存使用量,也沒有要求我向我的安裝程序添加任何東西,這使得這種解決方案更適合我。 – 2010-10-21 16:13:43

-1

如果您使用jvcl,您可以在不涉及數據集的情況下完成所需操作。只需使用TjvDBComboBox,使用Items屬性設置想要UI顯示的值,然後使用Values屬性設置存儲在數據庫中的實際值。

1

使用TClientDataset並定義字段,然後連接到數據源。 在表單的oncreate事件中,執行以下操作: 執行clientdataset的createdataset方法,然後使用A,B,C數據填充它。

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; 
+0

這是一個技術上正確的答案,但它顯着增加了我的程序的內存使用量和安裝程序的大小(這是一個問題,因爲我以電子方式分發程序。) – 2010-10-21 16:10:24

+0

我用Delphi做了一個簡單的測試2007年也看到你認爲安裝程序的規模顯着增加。添加TClientDataSet組件和MidasLib以使用子句exe增長〜320Kb,安裝程序(使用inno setup + lzma製作)增長〜120Kb。除非你使用3.44「軟盤分發它,否則我認爲這樣的增加值得你使用ClientDataSets獲得的能力。 – jachguate 2010-10-21 23:14:11

相關問題