基于数据库查询调用TEdit对象

时间:2012-10-10 09:19:38

标签: mysql delphi delphi-xe2

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

4 个答案:

答案 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字符串硬编码到源中,这会导致各种可维护性问题。例如:考虑重命名编辑。

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

答案 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)

  1. 获取查询结果(通常使用.RowCount返回的TDataset属性)
  2. 获取行数后,执行迭代以生成TEdit并设置文本属性
  3. 以下是代码示例:

    ...
    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;
    ...