gpt4 book ai didi

mysql - 根据数据库查询调用 TEdit 对象

转载 作者:行者123 更新时间:2023-11-29 01:43:45 25 4
gpt4 key购买 nike

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

最佳答案

使用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's idea并将所有编辑添加到列表中:

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,它是一个数据组件。打开链接的数据集会自动将所有电话号码添加到网格中。通过某些设置,网格可能看起来像是彼此下方的几个编辑。

关于mysql - 根据数据库查询调用 TEdit 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12815962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com