我是超级新手,并尝试编写以下代码,该代码将每个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;
我究竟做错了什么 ?
最佳答案
这是我可以看到的错误:
您永远不会为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
语句。在首先使用TEdit
运算符检查组件的类型之后,我们不得不将组件转换为类型为is
的引用。只要表单拥有在其中找到的所有编辑内容,此方法便会起作用。但是,如果您动态创建控件,或者使用框架或父窗体,则这种基于
Components[]
所有权的方法将不会产生所有控件。在这种更复杂的情况下,您需要使用ControlCount
和Controls[]
使用父/子关系进行迭代。关于delphi - 如何为每个TEdit设置特定的文本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49192967/