我有很多TEdit.是否有任何命令可以清除所有TEdit而无需手动清除它就像这样做
edit1.clear;
edit2.clear;
Run Code Online (Sandbox Code Playgroud)
我不喜欢那样做因为我有很多领域..有人能帮助我吗?
您必须遍历窗体或容器的控件以清除它们.
有几种方法可以实现这一目标.
表格是设计时放置在其上的所有组件的所有者.您可以循环遍历所有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)
其他答案可以让您遍历“父级/所有者”容器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)
| 归档时间: |
|
| 查看次数: |
3931 次 |
| 最近记录: |