我有很多TEdit。是否有任何命令可以清除所有TEdit而无需像执行此操作那样手动清除它
edit1.clear;
edit2.clear;
我不喜欢这样做,因为我有很多领域..有人可以帮助我吗?
答案 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;