2

我有一个包含 7 个 TEdit 的表单,名称为 EditPhone1、EditPhone2 等。在同一表格中,我查询数据库以获取数据以填充这些 TEdit。当然,我无法提前知道查询将返回多少个结果。循环查询的行数时如何调用各种 TEdit 对象?

4

4 回答 4

2

使用FindComponent将组件名称“转换”为组件本身:

var
  Edit: TEdit;
  I: Integer;
begin
  DataSet.First;
  I := 1;
  while not DataSet.Eof do
  begin
    Edit := TEdit(FindComponent(Format('EditPhone%d', [I])));
    if Edit <> nil then
      Edit.Text := DataSet.FieldValues['PhoneNo'];
    DataSet.Next;
    Inc(I);
  end;

现在,这需要将EditPhone%d字符串硬编码到源代码中,这会导致各种可维护性问题。例如:考虑重命名编辑。

备选方案 1:

为了不依赖组件名称,您可以利用TLama 的想法并将所有编辑添加到列表中:

uses
  ... , Generics.Collections;

type
  TForm1 = class(TForm)
    EditPhone1: TEdit;
    ...
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FEdits: TList<TEdit>;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FEdits := TList<TEdit>.Create;
  FEdits.AddRange([EditPhone1, EditPhone2, EditPhone3, EditPhone4, EditPhone5,
    EditPhone6, EditPhone7]);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FEdits.Free;
end;

procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
var
  I: Integer;
begin
  DataSet.First;
  I := 0;
  while (not DataSet.Eof) and (I < FEdits.Count) do
  begin
    FEdits[I].Text := DataSet.FieldValues['PhoneNo'];
    DataSet.Next;
    Inc(I);
  end;
end;

这仍然需要一些维护,以防将来添加编辑。

备选方案 2:

您还可以遍历表单中的所有编辑以查找标记为要添加到列表中的编辑,而不是显式添加它们:

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  FEdits := TList<TEdit>.Create;
  for I := 0 to ComponentCount - 1 do
    if (Components[I] is TEdit) and (TEdit(Components[I]).Tag = 1) then
      FEdits.Add(TEdit(Components[I]));
end;

但是让这些标签保持最新是另一个负担。

备选方案 3:

我建议你使用TDBGrid一个数据组件。打开链接的数据集会自动将所有电话号码添加到网格中。使用某些设置,网格可能看起来像彼此下方的几个编辑。

于 2012-10-11T18:46:34.740 回答
1

例如,您可以使用 Tag 属性来查找所需的组件。将所有 TEdit 的标签从 1 设置为 7(或更多),并通过以下方式查找组件:

Var I: Integer;
    MyEdit : TEdit;

For I = 0 To Self.ComponentCount - 1 Do
 if (Self.Components[I] IS TEdit) AND (Self.Components[I] AS TEdit).Tag = YourTag
   MyEdit = (Self.Components[I] AS TEdit);

您还可以根据需要动态创建如此多的 TEdit,并在创建时分配 Tag 属性,并稍后在运行时通过此代码找到它。

于 2012-10-10T09:24:04.603 回答
1

我建议使用DBCtrlGrid. 您将一行的控件放置在其上,它会重复数据集所具有的行数的控件。

于 2012-10-10T09:28:07.900 回答
0
  1. 获取查询结果(通常使用return.RowCount的属性)TDataset
  2. 获得行数后,进行迭代以制作TEdit和设置文本属性

这是代码示例:

...
For i:=0 to RowCount do
Begin
 A:=TEdit.Create(self);
 A.Parent:=AForm;
 A.Top:=i*14;
 A.Text:=ADataset.Field(i).AsString;
End;
...
于 2012-10-10T09:32:13.283 回答