我有一个包含7个TEdit的表单,名称为EditPhone1,EditPhone2等。 在相同的表单中,我查询数据库以获取数据以填充这些TEdits。当然,我事先无法知道查询将返回多少结果。 在循环查询的rowcount时如何调用各种TEdit对象?
答案 0 :(得分: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
字符串硬编码到源中,这会导致各种可维护性问题。例如:考虑重命名编辑。
要不依赖于组件名称,您可以使用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;
如果将来添加修改,仍需要进行一些维护。
您还可以遍历表单中的所有编辑内容,找到标记为要添加到列表中的编辑内容,而不是明确地添加它们:
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;
但要保持这些标签的最新状态是另一个负担。
我建议您使用TDBGrid
这是一个数据组件。打开链接数据集将自动将所有电话号码添加到网格中。通过一些设置,网格可能看起来像是彼此之间的几个编辑。
答案 1 :(得分: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);
您还可以动态创建所需的TEdits,并在创建时分配Tag属性,稍后在运行时查找此代码。
答案 2 :(得分:1)
我建议使用DBCtrlGrid
。您将控件放在其上一行,并重复控件以获得与数据集一样多的行。
答案 3 :(得分:0)
.RowCount
返回的TDataset
属性)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;
...