如何为每个 TEdit 设置特定的文本?
How to set a specific text to every TEdit?
我是超级新手并尝试编写以下代码,将每个 TEdit.Text
设置为代码
中提到的一个
procedure TForm2.Button1Click(Sender: TObject);
var
i : integer;
Edit : TEdit;
begin
for i := 0 to Edit.ComponentCount - 1 do
begin
with Edit.Components[i] do
begin
Text := 'Done';
end;
end;
end;
我做错了什么?
我做错了什么?几乎所有事情。我认为您想要实现的是在表单上的所有 TEdits 中放置相同的文本。因此,您需要检查 TForm 中的所有组件(不是 Edit!),并检查每个组件是否真的是 Tedit,如果是,则分配文本。像这样:
procedure TForm2.Button1Click(Sender: TObject);
var
i:integer;
begin
for i := 0 to ComponentCount - 1 do
begin
if Components[ I ] is TEdit then
begin
(Components[ I ] as TEdit).Text := 'Done';
end;
end;
end;
顺便说一句 - 避免使用 'with'。它只是造成歧义和混乱。
以下是我能看到的错误:
- 您从未为
Edit
赋值。
- 通常表单拥有所有组件,因此
TEdit
拥有的组件为零。
Edit.Components[i]
是 TComponent
类型,它没有 Text
属性。如果您的代码编译通过,那么 Text
实际上就是表单的代码。你应该从这一点吸取的教训是永远不要再使用 with
。
您应该使用如下代码解决此问题:
procedure TForm2.Button1Click(Sender: TObject);
var
i: Integer;
Edit: TEdit;
begin
for i := 0 to ComponentCount-1 do begin
if Components[i] is TEdit then begin
Edit := TEdit(Components[i]);
Edit.Text := 'Done';
end;
end;
end;
请注意,这里我们使用的是表单本身的 ComponentCount
和 Components[]
。我们已经删除了邪恶的 with
语句。在首先使用 is
运算符检查组件的类型后,我们不得不将组件转换为类型 TEdit
的引用。
只要表单拥有在其中找到的所有编辑,这种方法就会奏效。但是,如果您动态创建控件,或者如果您使用框架或父窗体,那么这种基于通过 Components[]
的所有权的方法将不会产生所有控件。在这种更复杂的情况下,您需要使用 ControlCount
和 Controls[]
.
使用 parent/child 关系进行迭代
您可以遍历表单的所有子控件,如果当前控件是 TEdit
,则设置其文本。如果当前控件是一个窗口控件,它可能有自己的子控件,你需要为这个控件重做同样的事情。因此,让我们使用递归:
procedure SetAllEdits(AParent: TWinControl; const AText: string);
var
i: Integer;
begin
for i := 0 to AParent.ControlCount - 1 do
if AParent.Controls[i] is TCustomEdit then
TCustomEdit(AParent.Controls[i]).Text := AText
else if AParent.Controls[i] is TWinControl then
SetAllEdits(TWinControl(AParent.Controls[i]), AText);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetAllEdits(Self, 'test');
end;
还有其他方法,比如子class编辑控件和让新的class响应广播消息。
D. Heffernan 的回答已经很好了,我正在努力让初学者更容易理解。
在这段代码中,我们通过命令:aEdit := TEdit(aComponent)对TComponent进行"typecast"TEdit,因为TEdit继承自TComponent。
您从迭代(for ...)中得到的是 TComponent,而不是 TEdit。你通过"typecast"得到TEdit。
procedure TForm2.Button1Click(Sender: TObject);
var
i : Integer;
aComponent : TComponent;
aEdit : TEdit;
begin
for i := 0 to ComponentCount-1 do
begin
aComponent := Components[i];
if aComponent is TEdit then
begin
aEdit := TEdit(aComponent);
aEdit.Text := 'Done';
end;
end;
end;
我是超级新手并尝试编写以下代码,将每个 TEdit.Text
设置为代码
procedure TForm2.Button1Click(Sender: TObject);
var
i : integer;
Edit : TEdit;
begin
for i := 0 to Edit.ComponentCount - 1 do
begin
with Edit.Components[i] do
begin
Text := 'Done';
end;
end;
end;
我做错了什么?
我做错了什么?几乎所有事情。我认为您想要实现的是在表单上的所有 TEdits 中放置相同的文本。因此,您需要检查 TForm 中的所有组件(不是 Edit!),并检查每个组件是否真的是 Tedit,如果是,则分配文本。像这样:
procedure TForm2.Button1Click(Sender: TObject);
var
i:integer;
begin
for i := 0 to ComponentCount - 1 do
begin
if Components[ I ] is TEdit then
begin
(Components[ I ] as TEdit).Text := 'Done';
end;
end;
end;
顺便说一句 - 避免使用 'with'。它只是造成歧义和混乱。
以下是我能看到的错误:
- 您从未为
Edit
赋值。 - 通常表单拥有所有组件,因此
TEdit
拥有的组件为零。 Edit.Components[i]
是TComponent
类型,它没有Text
属性。如果您的代码编译通过,那么Text
实际上就是表单的代码。你应该从这一点吸取的教训是永远不要再使用with
。
您应该使用如下代码解决此问题:
procedure TForm2.Button1Click(Sender: TObject);
var
i: Integer;
Edit: TEdit;
begin
for i := 0 to ComponentCount-1 do begin
if Components[i] is TEdit then begin
Edit := TEdit(Components[i]);
Edit.Text := 'Done';
end;
end;
end;
请注意,这里我们使用的是表单本身的 ComponentCount
和 Components[]
。我们已经删除了邪恶的 with
语句。在首先使用 is
运算符检查组件的类型后,我们不得不将组件转换为类型 TEdit
的引用。
只要表单拥有在其中找到的所有编辑,这种方法就会奏效。但是,如果您动态创建控件,或者如果您使用框架或父窗体,那么这种基于通过 Components[]
的所有权的方法将不会产生所有控件。在这种更复杂的情况下,您需要使用 ControlCount
和 Controls[]
.
您可以遍历表单的所有子控件,如果当前控件是 TEdit
,则设置其文本。如果当前控件是一个窗口控件,它可能有自己的子控件,你需要为这个控件重做同样的事情。因此,让我们使用递归:
procedure SetAllEdits(AParent: TWinControl; const AText: string);
var
i: Integer;
begin
for i := 0 to AParent.ControlCount - 1 do
if AParent.Controls[i] is TCustomEdit then
TCustomEdit(AParent.Controls[i]).Text := AText
else if AParent.Controls[i] is TWinControl then
SetAllEdits(TWinControl(AParent.Controls[i]), AText);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetAllEdits(Self, 'test');
end;
还有其他方法,比如子class编辑控件和让新的class响应广播消息。
D. Heffernan 的回答已经很好了,我正在努力让初学者更容易理解。 在这段代码中,我们通过命令:aEdit := TEdit(aComponent)对TComponent进行"typecast"TEdit,因为TEdit继承自TComponent。
您从迭代(for ...)中得到的是 TComponent,而不是 TEdit。你通过"typecast"得到TEdit。
procedure TForm2.Button1Click(Sender: TObject);
var
i : Integer;
aComponent : TComponent;
aEdit : TEdit;
begin
for i := 0 to ComponentCount-1 do
begin
aComponent := Components[i];
if aComponent is TEdit then
begin
aEdit := TEdit(aComponent);
aEdit.Text := 'Done';
end;
end;
end;