如何为每个TEdit设置特定的文本?

时间:2018-03-09 11:40:36

标签: delphi firemonkey

我是超级新手,并尝试编写以下代码,将每个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;

我做错了什么?

4 个答案:

答案 0 :(得分:5)

以下是我可以看到的错误:

  1. 您永远不会为Edit分配值。
  2. 通常,表单拥有所有组件,因此TEdit将拥有零个拥有的组件。
  3. Edit.Components[i]属于TComponent类型,没有Text属性。如果您的代码编译,那么Text实际上是表单的代码。从这一点你应该学到的教训是永远不再使用with
  4. 您应该使用以下代码解决此问题:

    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声明。在首次使用TEdit运算符检查组件的类型后,我们必须将组件强制转换为is类型的引用。

    只要表单拥有其中的所有编辑内容,此方法就可以使用。但是,如果您动态创建控件,或者使用框架或父级表单,则此方法(基于Components[]的所有权将不会产生所有控件。在更复杂的情况下,您需要使用ControlCountControls[]使用父/子关系进行迭代。

答案 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;