如何为每个 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'。它只是造成歧义和混乱。

以下是我能看到的错误:

  1. 您从未为 Edit 赋值。
  2. 通常表单拥有所有组件,因此 TEdit 拥有的组件为零。
  3. 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;

请注意,这里我们使用的是表单本身的 ComponentCountComponents[]。我们已经删除了邪恶的 with 语句。在首先使用 is 运算符检查组件的类型后,我们不得不将组件转换为类型 TEdit 的引用。

只要表单拥有在其中找到的所有编辑,这种方法就会奏效。但是,如果您动态创建控件,或者如果您使用框架或父窗体,那么这种基于通过 Components[] 的所有权的方法将不会产生所有控件。在这种更复杂的情况下,您需要使用 ControlCountControls[].

使用 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;