【问题标题】:increment a variable in while loop? (not an array)在while循环中增加一个变量? (不是数组)
【发布时间】:2017-12-15 17:02:43
【问题描述】:

我在对话页面中有很多 EditControl。它们被称为 Edit1、Edit2 等。是否可以像使用数组一样使用 while 循环从这些控件中获取值?我知道对于一个数组,您可以执行以下操作:

begin
// Loop 5 times
  for i := 1 to (10 div 2) do
    ShowMessage(Edit[i].Text); <- here I need to get value of Edit1, Edit2, et cetera
end;

如何用字符串而不是数组来做到这一点?

【问题讨论】:

  • 谢谢,但它给了我一个未声明的标识符:'组件计数' - FastReport 可能不支持
  • 如果您在另一个类中使用Form1.ComponentCount,而不是编辑控件的所有者,则需要使用它。
  • 为什么是while循环还是for循环很重要?这对你来说似乎一点也不重要。看起来很重要的是您希望通过名称来引用组件,这个主题已经在这里讨论了数百次。做一些研究。但是,几乎总是最好不要以这种方式使用该名称。在其他容器中使用数组的方法通常更好。

标签: delphi fastreport


【解决方案1】:

确保没有ComponentCount,毕竟它是TComponent 属性。如果存在,请使用下面的代码并将名称 Form1 替换为您的 Object Parent of Edits 的名称。

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
   for i := 0 to Form1.ComponentCount -1 do
      if Form1.Components[i].Name = 'Edit' + IntToStr(i+1) then
         TEdit(Form1.Components[i]).Text := 'NewTextEdit' + IntToStr(i+1);
end;

【讨论】:

    【解决方案2】:

    如果您想搜索表单中的所有 TEdit,您可以执行以下操作:

    var
        i: Integer;
    begin
        for i := 0 to Self.ComponentCount- 1 do
            if Self.Components[i] is TEdit then
                ShowMessage(TEdit(Self.Components[i]).Text);
    end;
    

    如果您的 TEdits 放置在其他控件(如 GroupBoxes、Panel 等)上,并且您想在这些控件内进行搜索,那么您应该这样做:

    var
        i: Integer;
    begin
        for i := 0 to gbx1.ControlCount - 1 do
            if gbx1.Controls[i] is TEdit then
                ShowMessage(TEdit(gbx1.Controls[i]).Text);
    end;
    

    或者您可以在多个 TWinControls 中搜索:

    var
        i: Integer;
    begin
        for i := 0 to Self.ControlCount - 1 do    
        begin    
            //TEdits are in TGroupBox
            if Self.Controls[i] is TGroupBox then
                ReadEdits(TGroupBox(Self.Controls[i]))
            //TEdits are in TPanel
            else if Self.Controls[i] is TPanel then
                ReadEdits(TPanel(Self.Controls[i]))
            else ... (other possible Parent Controls)  
        end
    end;
    
    procedure TForm1.ReadEdits(aParent: TWinControl);
    var
        i: Integer;
    begin
        for i := 0 to aParent.ControlCount - 1 do
            if aParent.Controls[i] is TEdit then
                ShowMessage(TEdit(aParent.Controls[i]).Text)
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2020-01-21
      相关资源
      最近更新 更多