You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi FMX中如何获取ListView点击项绑定的idDrink字段

FMX ListView绑定SQLite后获取选中项的idDrink字段

我正在开发一款FMX应用,已经把ListView绑定到SQLite数据库的表上,所有饮品能正常加载到ListView,点击列表项时绑定字段显示正常。现在需要获取点击项对应的绑定字段idDrink,用来拼接所有配料字段并添加到Memo中。我偏好使用Visual Bindings,但部分操作需要代码实现,目前的代码如下:

procedure TForm2.lvDrinksListviewItemClick(const Sender: TObject;
const AItem: TListViewItem);
var

  idDrink: string;
  strDrinks: string;
  listviewindex: string;
  instructions: String;
  ingredients: String;
begin
  qryDrinks.SQL.Text := 'select * From drinks ';
  qryDrinks.Open();
  listviewindex := (TListViewItem(lvDrinksListview.Selected).Text);
  idDrink := qryDrinks.Fields[0].AsString;
  TListViewItem(lvDrinksListview.Selected).Text := listviewindex ;  /// Here i need to set the idDrink to := the listview selected item
  instructions := qryDrinks.Fields[9].AsString;
  ingredients := qryDrinks.Fields[17].AsString + sLineBreak + qryDrinks.Fields
    [18].AsString + #13 + qryDrinks.Fields[19].AsString;
  showmessage(idDrink);
  showmessage((listviewindex));
  Memo4.Lines.Add(ingredients);
  qryDrinks.Next;
  qryDrinks.Close();

  TabControl1.ActiveTab := tiDrinksIngreediantsAndDirections;
end;

解决方案

因为你用了Visual Bindings,ListView的每个Item其实已经和数据集的记录绑定了,不需要重新全表查询,直接通过绑定的数据集定位到选中项对应的记录即可。

方法1:利用绑定的数据集直接获取

如果你的ListView是通过TBindSourceDB绑定到qryDrinks,那么点击项时,数据集已经自动定位到对应的记录了,直接读取字段即可:

procedure TForm2.lvDrinksListviewItemClick(const Sender: TObject;
const AItem: TListViewItem);
var
  idDrink: string;
  ingredients: string;
begin
  // 绑定关系已自动将qryDrinks定位到选中项对应的记录
  idDrink := qryDrinks.FieldByName('idDrink').AsString;
  
  // 拼接配料字段,用FieldByName代替索引,可读性更强
  ingredients := qryDrinks.FieldByName('strIngredient1').AsString + sLineBreak +
                 qryDrinks.FieldByName('strIngredient2').AsString + sLineBreak +
                 qryDrinks.FieldByName('strIngredient3').AsString;
  
  Memo4.Lines.Clear;
  Memo4.Lines.Add('配料:');
  Memo4.Lines.Add(ingredients);
  Memo4.Lines.Add(sLineBreak + '制作步骤:');
  Memo4.Lines.Add(qryDrinks.FieldByName('strInstructions').AsString);
  
  TabControl1.ActiveTab := tiDrinksIngreediantsAndDirections;
end;

方法2:通过ListViewItem的TagString存储额外字段

如果绑定没有自动定位数据集,可以把idDrink存储到ListViewItem的TagString属性中:

  1. 打开Visual Bindings设计器
  2. 找到ListViewItem的绑定配置,将idDrink字段绑定到TagString属性
  3. 点击事件中直接读取该属性:
procedure TForm2.lvDrinksListviewItemClick(const Sender: TObject;
const AItem: TListViewItem);
var
  idDrink: string;
begin
  idDrink := AItem.TagString;
  
  // 用idDrink精准查询对应记录
  qryDrinks.Close;
  qryDrinks.SQL.Text := 'SELECT strIngredient1, strIngredient2, strIngredient3, strInstructions FROM drinks WHERE idDrink = :id';
  qryDrinks.ParamByName('id').AsString := idDrink;
  qryDrinks.Open;
  
  if not qryDrinks.Eof then
  begin
    Memo4.Lines.Clear;
    Memo4.Lines.Add('配料:');
    Memo4.Lines.Add(qryDrinks.FieldByName('strIngredient1').AsString);
    Memo4.Lines.Add(qryDrinks.FieldByName('strIngredient2').AsString);
    Memo4.Lines.Add(qryDrinks.FieldByName('strIngredient3').AsString);
    Memo4.Lines.Add(sLineBreak + '制作步骤:');
    Memo4.Lines.Add(qryDrinks.FieldByName('strInstructions').AsString);
  end;
  qryDrinks.Close;
  
  TabControl1.ActiveTab := tiDrinksIngreediantsAndDirections;
end;

注意事项

  • 避免使用select *,只查询需要的字段,提升查询性能
  • 优先用FieldByName代替字段索引,避免因表结构变动导致代码出错,同时提升可读性
  • 若使用Visual Bindings,优先利用绑定的自动定位机制,减少重复数据库查询操作

内容的提问来源于stack exchange,提问作者grant1842

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:11:19