Delphi - 清除所有TEdit的命令

时间:2017-03-06 11:23:38

标签: delphi

我有很多TEdit。是否有任何命令可以清除所有TEdit而无需像执行此操作那样手动清除它

edit1.clear;
edit2.clear;

我不喜欢这样做,因为我有很多领域..有人可以帮助我吗?

3 个答案:

答案 0 :(得分:8)

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

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

表格是设计时放置在其上的所有组件的所有者。您可以循环遍历所有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;

另一种方法是遍历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;

答案 1 :(得分:4)

其他答案让您循环遍历父/所有者容器,动态查找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;

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

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

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

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; 

或者您甚至可以覆盖表单的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;

答案 2 :(得分:2)

你可以做这样的事情

procedure TFormMain.ClearAllEditFields;
var
  i: Integer;
begin
  for i := 0 to ControlCount -1 do
  begin
    if Controls[ i ] is TEdit then
    begin
      (Controls[ i ] as TEdit).Clear;
    end;
  end;
end;