我是超级新手,并尝试编写以下代码,将每个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;
我做错了什么?
答案 0 :(得分:5)
以下是我可以看到的错误:
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[]
使用父/子关系进行迭代。
答案 1 :(得分:3)
我做错了什么?几乎所有事情。我认为你想要实现的是将相同的文本放在表单上的所有TEdits中。因此,您需要遍历TForm中的所有组件(而不是编辑!)并检查每个组件是否真的是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'。它只是模糊不清和混乱。
答案 2 :(得分:2)
您可以迭代表单的所有子控件,如果当前控件是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;
还有其他方法,例如子类化编辑控件并让新类响应广播的消息。
答案 3 :(得分:1)
D. Heffernan的答案已经很好了,我试图让初学者更容易理解。 在这段代码中,我们做了"类型转换"通过命令TEdit到TComponent:aEdit:= TEdit(aComponent),因为TEdit继承自TComponent。
你从迭代(for ...)获得的是TComponent,而不是TEdit。你得到TEdit" typecast"它
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;