2012-04-09 44 views
3

我正在嘗試創建一個Delphi網格,以允許在每行的數據可能具有不同數據類型的數據庫網格中顯示和編輯。我想爲每個數據類型顯示一個特定的控件,例如當數據類型是DateTime時,我想顯示我的自定義編輯控件,允許在日曆中輸入日期或彈出日曆。在每行中有不同數據類型的Delphi網格,動態顯示

的數據看起來是這樣的:

Name DataType DateValue StringValue BooleanValue  
--------------------------------------------------------- 
A  Date  1/1/2007 
B  String     asdf 
C  Boolean        True 

...並在db,該表爲每個可能的類型的值的列。所以,有一個BooleanValueDateValue

我想要做的是在網格中顯示一個'值'列,顯示適當的編輯控制取決於'DataType'是哪一行。因此,電網應該是這樣的:

Name DataType Value  
--------------------------- 
A  Date  1/1/2007 
B  String  asdf 
C  Boolean True 

看來我需要顯示不同的編輯控件(允許用戶編輯Value列)的每一行動態基礎上,DataType列的值。我知道那裏有更先進的網格來處理這類問題,但是這些功能不會允許任何東西,但Delphi可以提供的開箱即用功能。

關於如何做這種工作的任何想法?

+0

這聽起來像是你將被超載網格的「的OnDraw」事件 – paulsm4 2012-04-09 18:47:45

+2

試圖找到一個開箱即用解決方案或第三方控制,這是毫無意義的。你所說的不符合數據表概念。 – 2012-04-09 18:50:22

+0

數據庫中的字段是什麼類型?串? – 2012-04-09 19:29:59

回答

4

就我個人而言,在這種情況下,我不會直接在TDBGrid內進行編輯,因爲您的表格不是DB標準化的(在任何情況下我都沒有使用它)。我將使用計算字段顯示期望值在網格中,並動態創建表格中的每個字段類型的TDBxxxEdit(例如,您自己的TDBTreeEdit例如,TDBRichEdit或DB圖像拾取編輯器,等等...?)。

在你想使用的TDBGrid自己的控件,並替換默認TInplaceEdit編輯器,你可以參考下面的文章情況:Adding components to a DBGrid,以及相關文章:Displaying and editing MEMO fiels in Delphi's TDBGrid

3

顯示所有數據的同一列很容易。您可以簡單地添加計算的字符串字段,並根據您在該行中存儲的內容更改值。

編輯比較複雜。如果你想擁有一個就地編輯器,那麼你將面臨一個受到傷害的世界......我已經做到了,這是一種痛苦,需要很長時間。如果你想顯示一個對話框來編輯這個值,那就容易多了。您可以將一個列對象添加到網格中,並且可以將已附加到calc字段的列設置爲顯示一個按鈕。單擊按鈕時,只需顯示該行所需的編輯對話框,並在關閉對話框時提交編輯。

還有其他方法可以完成這項工作,但我會說上述方法是最短的方法。其他方式可能包括自定義繪製事件以在一列中顯示數據,攔截點擊以創建您自己的編輯器等,等等,等等......

0

添加計算字段後。
樣品:

procedure OnCalculate(DataSet:TDataSet); 
begin 
    case IndexText(DataSet['ValueType'],['Date','String','Boolean']) of 

    0:DataSet['DateValue']:=StrToDateTime(DataSet['Value']); // also converting 
    1:DataSet['StringValue']:=DataSet['Value']; 
    2:DataSet['BooleanValue']:= MatchText(DataSet['Value'],['1','True','T','Y','Yes']); 
{etc datatypes} 
    end; 
end;