如何在运行时获取 FMX TComboBox 的 Item.LookupData 和 SelectedValue(作为整数)?

How to get Item.LookupData and SelectedValue (as integer) of an FMX TComboBox at runtime?

FMX 表格上有一个 ComboBox。它以以下方式与数据源(table 绑定 id-integer 和 speciality - varchar 字段)-

object LinkFillControlToField1: TLinkFillControlToField
      Category = 'Quick Bindings'
      Control = ComboBox1
      Track = True
      FillDataSource = BindSourceDB1
      FillValueFieldName = 'id'
      FillDisplayFieldName = 'speciality'
      AutoFill = True
      BufferCount = -1
      AutoBufferCount = False
      FillExpressions = <>
      FillHeaderExpressions = <>
      FillBreakGroups = <>
    end

访问所选 speciality 的值很简单(来自 ComboBox1.Selected.Text),但我无法找到访问所选项目的 id 值的方法额外 SQL 请求。它存储在 TComboBox 或其 ListBox 的什么位置? SelectedValue 存储在哪里以及如何获取它(作为整数)?

tm。 您必须在组合的 SelectedValue 与其他控件之间设置实时绑定 link。 我附上了绑定编辑器的截图。 标签将显示 ID。

我目前正在使用以下方式解决问题。 我按以下方式处理 OnFillingListItem 事件并将 ID 号存储在 ComboBox 项目中。我使用 Tag 属性 虽然它实际上并不好。

procedure TForm1.LinkFillControlToField1FillingListItem(Sender: TObject;
  const AEditor: IBindListEditorItem);
begin
  (AEditor.CurrentObject as TListBoxItem).Tag :=
    YourLookuptable.FieldByName('id').AsInteger;
end;

稍后我从 ListBox1.Selected.Tag 获取项目 ID。这给了我一个可靠的 ID。

您可以通过定义绑定的 TLinkFillControl 访问所选项目的 id 值:

procedure TForm1.ComboBox1Change(Sender: TObject);
var
    Id: Integer;
begin
    if TryStrToInt(LinkFillControlToField1.BindList.GetSelectedValue.AsString, Id) then
      ShowMessage(IntToStr(Id));
end;

如果绑定Item.LookupData,则BindList.GetSelectedValue下发对应的绑定数据。如果我没记错的话 Delphi 将值内部存储在字典中。

ComboBox1.ItemIndex 是你所需要的。

要获取与所选项目关联的文本,您可以执行以下操作:

Text := ComboBox1.Items[ ComboBox1.ItemIndex ];

参见:http://docwiki.embarcadero.com/Libraries/Sydney/en/FMX.ListBox.TCustomComboBox.ItemIndex