【问题标题】:Delphi FDQuery selecting rows without the column nameDelphi FDQuery 选择没有列名的行
【发布时间】:2018-06-10 14:10:45
【问题描述】:

我在表单上有一些代码,它根据数据库中的列名创建一堆标签

我正在尝试编写另一段代码,它使用 FDQuery 来选择所有记录,然后根据每行中的值创建标签

目前我有以下。

  while not FDQuery1.Eof do
  begin
    while recordCount < colTotal do
    begin
      newLabel := TLabel.Create(Self);
      newLabel.Parent := panel3;
      newLabel.Align := TAlignLayout.Top;
      newLabel.Text := FDQuery1.FieldByName('Torque2').AsString;
      newLabel.Margins.Top := 10;
      newLabel.Margins.Left := 10;
      newLabel.Margins.Right := 10;
      inc(recordCount);
      FDQuery1.Next;
    end;
  end;

我怎样才能让它动态地创建一个带有每一行结果的标签,而我不需要像我在这里那样实际放置像“torque2”这样的列名。

例如,在我的表单上,标签将按如下方式创建

row1 
row2 
row3
row4
row5 

因为现在这段代码只是简单地循环一个行值

谢谢

【问题讨论】:

  • FdQuery1.Fields 属性有一个集合。你试过了吗?

标签: sqlite delphi firemonkey firedac


【解决方案1】:

您可以通过 Fields 属性访问元组值,而不是基于名称的 FieldByName 方法,该属性是基于 0 的索引集合属性。

FireDAC 提供了更有效的数据访问方式。在客户端获取所有元组后,您可以通过这种方式遍历内部数据存储:

var
  S: string;
  Row, Col: Integer;
begin
  for Row := 0 to FDQuery1.Table.Rows.Count - 1 do
    for Col := 0 to FDQuery1.Table.Columns.Count - 1 do
      S := FDQuery1.Table.Rows[Row].GetData(Col);
end;

恕我直言,这更容易阅读,也节省了大量时间,因为它不会移动数据集光标。缺点可能是您需要在客户端获取元组。

【讨论】:

  • 谢谢!!不敢相信我以前没见过这个
  • 不客气!无论如何,尝试考虑使用一些层,例如TGridPanelLayout。它使您的任务(构建基于标签的网格)变得更加容易。除了这个迭代之外,FireDAC 提供了内部存储迭代,它更高效,更容易在代码中读取。如果您有兴趣,我可以在这篇文章中添加一个示例。
  • 我有兴趣看看
  • 我添加了内部存储迭代的示例。 Here is a method 可以将 FireDAC 数据集对象填充到 TGridPanelLayout 控件中。
  • @MartynA,FireDAC 的内部存储非常强大且高效。实际上,它似乎受到了 DataTable 类的 C# 实现的启发(很多事情都以相同的方式进行)。因此,like this one 的问题立即让我想到了“怪别的,而不是 FireDAC” 之类的答案:)
猜你喜欢
  • 2023-03-23
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
相关资源
最近更新 更多