在LiveBindings情况下,如何将AdapterBindSource中包含的标签显示到网格列?

时间:2017-10-29 18:57:15

标签: delphi livebindings firemonkey-fm3

我们有一个包含字段(作为整数)的成员表来定义"成员资格的状态"通过他的身份。例如:0表示非活动,1表示活动,2表示生命时间,3表示退休,4表示特殊成就等,

我们使用LiveBindings将StringGrid附加到Members表。因此,在网格中我们看到状态的ID号(1或2或等)。但我们希望看到"标签"那个状态(例如:LifeTime)而不是他的身份。

有关信息,"状态标签"不能存储在Lookup表中,因为它必须用不同的语言翻译。

我创建了一个包含状态ObjMemberStatus:TObjectList<TMemberStatus>;的对象 使用 TAdapterBindSource。

保存会员标签

我可以使用 TDataGenerator 将此信息分配给ComboBox。在这种情况下,我认为这是使用ComboBox的方法,这对此非常有效。

我的问题是:如何将AdapterBindSource中包含的标签显示到网格列中?

我已经执行了一些搜索,但我没有看到如何直接使用LiveBindings。也许我已经错过了一些事情。

我也在帮助中看到我们可以添加该方法: 查找(范围查找,关键字段,键值,结果字段) 到CustumFormat属性。但没有示例显示如何使用该CustumFormat方法。我在网上搜索了它,似乎没有记录。

子问题,有没有办法绕过或挂钩一些代码到LiveBindings数据分配到组件进程?

2 个答案:

答案 0 :(得分:0)

你似乎正在制造恶劣天气。

我很欣赏翻译的复杂性,但最直接的做法是简单地应用KISS原则并在数据集中添加计算字段,该数据集提供会员身份的文本表示。

要处理翻译,最简洁的方法当然是为不同的语言设置一个单独的成员资格状态表,并选择在运行时使用的语言。如果您不想对此感到困扰,只需使用Values的{​​{1}}属性在网格DataSet的OnCalcFields事件中查找翻译。

更新说您可以将计算字段添加到FDQuery但不添加到FDMemtable是不正确的。以下代码工作正常:

TStringList

并在实时绑定的StringGrid中正确显示列ID和描述。

答案 1 :(得分:0)

正如我在评论中所说,我已经使用查找字段与包含代码和本地化描述的memtable链接。

但是最近我使用了另一种方法,在你的情况下可能更容易实现。我用这样的东西连接代码字段的GetText和SetText事件:

Procedure TSomeLookupFieldHandler.LookupFieldHandleGetText(Sender: TField; Var Text: String; DisplayText: Boolean);
Var
  v: Variant;
Begin
  Text := '';
  If (DataSet <> Nil) And Not Sender.IsNull Then Begin
    DataSet.Active := True;
    v := DataSet.Lookup(KeyFieldName, Sender.Value, ResultFieldName);
    If Not VarIsNull(v) And Not VarIsEmpty(v) Then
      Text := v;
  End;
End;

Procedure TSomeLookupFieldHandler.LookupFieldHandleSetText(Sender: TField; Const Text: String);
Var
  v: Variant;
Begin
  If Text.IsEmpty Or (DataSet = Nil) Then
    Sender.Clear
  Else Begin
    DataSet.Active := True;
    v := DataSet.Lookup(ResultFieldName, Text, KeyFieldName);
    If Not VarIsNull(v) And Not VarIsEmpty(v) Then
      Sender.Value := v
    Else
      Sender.Clear;
  End;
End;

TSomeLookupFieldHandler对象有一个对它可以用来进行查找的DataSet的引用(我有很多像这样工作的字段)。我根据需要实例化了一个这样的对象。

如果您希望该字段是只读的,我不确定是否需要SetText事件处理程序。我的不是。

本地化描述仍然需要在某些数据集中,如TFDMemTable ...但您可以轻松修改它以在TStringList或TObjectList或其他容器上进行查找。

要使用此功能,您需要实例化此类的对象,然后连接字段或字段:

lfh := TSomeLookupFieldHandler.Create(<Some parameters to setup the lookup dataset>);

SomeField.GetText:=lfh.LookupFieldHandleGetText;
SomeField.SetText:=lfh.LookupFieldHandleSetText;

SomeDataSet.FieldByName('code').GetText:=lfh.LookupFieldHandleGetText;
SomeDataSet.FieldByName('code').SetText:=lfh.LookupFieldHandleSetText;

如果要连接许多字段,那么它更容易在TSomeLookupFieldHandler上添加一个新方法,该方法接受TField参数并进行设置。