正如我在评论中所说,我已经使用与包含代码和本地化描述的 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 参数并进行设置。