В ситуации LiveBindings, как я могу отображать метки, содержащиеся в AdapterBindSource, в столбец сетки?

У нас есть таблица членов, содержащая поле (как целое) для определения «статуса членства» по его идентификатору. Например: 0 для неактивных, 1 для активных, 2 для LifeTime, 3 для выхода на пенсию, 4 для исключительных достижений и т. Д.

У нас есть привязка StringGrid к таблице Members с LiveBindings. Итак, в сетке мы видим номер идентификатора (1 или 2 или т. Д.). Но мы хотим увидеть «Ярлыки» этого статуса (например: LifeTime), а не его идентификатор.

Для информации, «метка статуса» не может храниться в таблице поиска, потому что она должна быть переведена на другой язык.

Я создал объект, содержащий статус, ObjMemberStatus:TObjectList<TMemberStatus>;
который содержит метки подписки, используя TAdapterBindSource.

Я смог передать эту информацию в ComboBox с помощью TDataGenerator . Я думаю, что это способ сделать с ComboBox в этой ситуации, и это работает очень хорошо для этого.

Мой вопрос: как я могу отобразить метку, содержащуюся в AdapterBindSource, в столбец сетки?

Я выполнил поиск, и я не видел, как это сделать непосредственно с LiveBindings. Возможно, я упустил что-то.

Я также видел в помощи, что мы можем добавить этот метод: Lookup (просмотр области, ключевые поля, значения ключа, поля результатов) в свойство CustumFormat. Но ни один пример не показывает, как использовать этот метод CustumFormat. Я ищу в Интернете для этого, и он кажется недокументированным.

Sub-Questions, есть способ обойти или перехватить некоторый код в привязке данных LiveBindings к процессу компонентов?

delphi,livebindings,firemonkey-fm3,

1

Ответов: 2


0

Вы, кажется, делаете тяжелую погоду.

Я понимаю, что есть сложность перевода, но наиболее простой задачей является просто применить принцип KISS и добавить вычисленное поле в набор данных, который предоставляет текстовое представление статуса членства.

Для обработки перевода самым чистым способом было бы, конечно, иметь отдельную таблицу текстов статуса членства для разных языков и выбрать язык для использования во время выполнения. Если вы не хотите, чтобы вас это беспокоило, просто используйте Valuesсвойство a TStringListдля поиска переводов в событии OnCalcFields сетки DataSet.

Обновление Неправильно утверждать, что вы можете добавлять расчетные поля в FDQuery, но не в FDMemtable. Следующий код работает нормально:

procedure TForm1.FDMemTable1CalcFields(DataSet: TDataSet);
begin
  DataSet.FieldByName('Description').AsString := IntToStr(DataSet.FieldByName('ID').AsInteger);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  F : TField;
begin
  F := TIntegerField.Create(Self);
  F.FieldName := 'ID';
  F.FieldKind := fkData;
  F.DataSet := FDMemTable1;

  F := TStringField.Create(Self);
  F.Size := 80;
  F.FieldName := 'Description';
  F.FieldKind := fkInternalCalc;
  F.DataSet := FDMemTable1;

  FDMemTable1.CreateDataSet;
  FDMemTable1.InsertRecord([1]);
  FDMemTable1.InsertRecord([2]);
end;

и корректно отображает как столбцы, ID, так и описание в строковой привязке в реальном времени.


0

Как я уже сказал в комментариях, я сделал это с полем поиска, связанным с памятью, содержащей код и локализованное описание.

Но в последнее время я использовал другой подход, который, возможно, может быть проще реализовать в вашем случае. Я подключаю события 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 и выполняет настройку.

Дельфы, LiveBindings, FireMonkey-фм3,
Похожие вопросы