Delphi - 清除所有TEdit的命令

use*_*049 3 delphi

我有很多TEdit.是否有任何命令可以清除所有TEdit而无需手动清除它就像这样做

edit1.clear;
edit2.clear;
Run Code Online (Sandbox Code Playgroud)

我不喜欢那样做因为我有很多领域..有人能帮助我吗?

Dal*_*kar 9

您必须遍历窗体或容器的控件以清除它们.

有几种方法可以实现这一目标.

表格是设计时放置在其上的所有组件的所有者.您可以循环遍历所有Form组件以清除它们:

procedure ClearEdits(Owner: TWinControl);
var i: integer;
begin
  for i := 0 to Owner.ComponentCount - 1 do
    if Owner.Components[i] is TEdit then TEdit(Owner.Components[i]).Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClearEdits(Self);
end;
Run Code Online (Sandbox Code Playgroud)

另一种方法是遍历Parent容器(也可以是Form),但在这种情况下,您必须以递归方式清除编辑,因为Parent仅在控件列表中保存其直接子项.

procedure ClearEdits(Parent: TWinControl);
var i: integer;
begin
  for i := 0 to Parent.ControlCount - 1 do
    begin
      if Parent.Controls[i] is TEdit then TEdit(Parent.Controls[i]).Clear
      else
      if Parent.Controls[i] is TWinControl then ClearEdits(TWinControl(Parent.Controls[i]));
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClearEdits(Self);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClearEdits(SomePanel);
end;
Run Code Online (Sandbox Code Playgroud)


Rem*_*eau 5

其他答案可以让您遍历“父级/所有者”容器TEdit来动态查找控件。尽管这样做确实可行,但是每次您要清除TEdit控件时,它都会有一些开销。

您应该改为将所需的TEdit控件添加到数组中,或者TList一次在窗体创建时添加,然后可以在需要时遍历该数组/列表。与动态地寻找控件相比,这将更快,开销更少并且更准确。

private
  MyEdits : TList;

procedure TMyForm.FormCreate(Sender: TObject);
begin
  MyEdits := TList.Create;
  // fill list as needed...
end;

procedure TMyForm.FormDestroy(Sender: TObject);
begin
  MyEdits.Free;
end;

procedure TMyForm.ClearEdits;
var
  i: integer;
begin
  for i := 0 to MyEdits.Count - 1 do
    TEdit(MyEdits[i]).Clear;
end;
Run Code Online (Sandbox Code Playgroud)

填充数组/列表时,可以TEdit单独添加控件:

procedure TMyForm.FormCreate(Sender: TObject);
begin
  MyEdits := TList.Create;
  MyEdits.Add(Edit1);
  MyEdits.Add(Edit2);
  MyEdits.Add(Edit3);
  ...
end;
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用类似于其他答案所示的循环,例如:

procedure TMyForm.FormCreate(Sender: TObject);
var
  i: integer;
begin
  MyEdits := TList.Create;
  for i := 0 to ComponentCount - 1 do
    if Components[i] is TEdit then
      MyEdits.Add(Components[i]);
end; 
Run Code Online (Sandbox Code Playgroud)

或者甚至可以重写Form的Notification()方法来检测何时TEdit创建每个方法:

procedure TMyForm.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;
  if (Operation = opAdd) and (AComponent is TEdit) then
  begin
    if MyEdits = nil then MyEdits := TList.Create;
    MyEdits.Add(AComponent);
  end;
end;
Run Code Online (Sandbox Code Playgroud)