3

我正在尝试创建一个 Delphi 网格,以允许在 db 网格中显示和编辑每行可能具有不同数据类型的数据。我想为每种数据类型显示一个特定的控件,例如当数据类型是 DateTime 时,我想显示我的自定义编辑控件,它允许在其中键入日期或弹出日历。

数据看起来像这样:

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

...并且在数据库中,该表为每种可能的值类型都有一个列。所以,有一个BooleanValueDateValue,等等。

我想做的是在网格中显示一个“值”列,根据该行的“数据类型”显示适当的编辑控件。因此,网格应如下所示:

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

看来我需要根据Value列的值动态地为每一行显示不同的编辑控件(以允许用户编辑列)DataType。我知道有更高级的网格可以处理这类问题,但是除了 Delphi 开箱即用的功能之外,这些功能不会允许任何事情。

关于如何制作这样的东西的任何想法?

4

3 回答 3

4

Personally, I would not go for editing directly inside the TDBGrid in this case, since your Table is not DB normalized (I don't use it in any case actually). I would have used a Calculated field to display the desired value in the grid, And dynamically created the TDBxxxEdits on the form for each field type (How about your own TDBTreeEdit for example, a TDBRichEdit, or a DB Image pickup editor, etc...?).

In case you do want to use your own controls on the TDBGrid, and replace the default TInplaceEdit editor, you can refer the following article: Adding components to a DBGrid, and a related article: Displaying and editing MEMO fiels in Delphi's TDBGrid

于 2012-04-09T20:33:42.273 回答
3

在同一列中显示所有数据非常容易。您可以简单地添加一个计算字符串字段,并根据您在该行中存储的内容更改值。

编辑要复杂一些。如果您想拥有一个就地编辑器,那么您将面临一个痛苦的世界……我已经做到了,这很痛苦,而且需要很多时间。如果您想显示一个对话框来编辑该值,那就容易多了。您可以将列对象添加到网格中,并且可以设置已附加到计算字段的列以显示按钮。单击按钮时,您只需显示该行所需的编辑对话框,并在对话框关闭时提交编辑。

还有其他方法可以完成这项工作,但我会说上述方法是最短的方法。其他方式可能包括自定义绘制事件以在一列中显示您的数据,拦截点击以创建您自己的编辑器等...

于 2012-04-09T22:00:33.763 回答
0

after add calculated fields .
Sample:

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;
于 2012-04-10T05:15:19.427 回答