delphi 更改在ListBoxItem布局中动态创建的标签文本

j1dl9f46  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(118)

我在列表框中动态创建ListBoxItem。在ListboxItem里面我创建了布局(其中3个)和标签。现在我尝试搜索并找到一个特定的标签并更改其文本。我知道如何做到这一点,在某种程度上不使用布局与控制,但使他们看起来更好,我使用布局。(ListBoxItem parenting->Layout parenting->Label)检查我下面用于搜索标签的代码并更改文本。

var e,h : integer;
      item : TListBoxItem;
      Ctrl:   TControl;
      Lbl :  TLabel absolute Ctrl;
      layout : TLayout absolute Ctrl;
  begin
  item := ListBox1.ListItems[itemNum]; // specific listboxitem
   for h:=0 to item.ControlsCount-1 do
     begin
      Ctrl:=item.Controls[h];
        if Ctrl is TLayout then
          begin
           if layout.Name='lout3' then  // i found the layout named "lout3" that i have 4 labels in
            begin
             for e:=0 to layout.ControlsCount-1 do  // i check that the control count is correct(4)
               begin
                Ctrl:=layout.Controls[e];   // but at this line error occur "Argument out of range"
                if Ctrl is TLabel then
                   begin
                     if Lbl.Name='qty1' then
                      begin
                      if ed_pos1.Text='' then
                       begin
                       Lbl.Text:=ed_pos1.TextPrompt;
                       end
                      else
                       begin
                       Lbl.Text:= ed_pos1.Text;
                       end;
                      end;
                     if Lbl.Name='qty2' then
                      begin
                      if ed_pos2.Text='' then
                       begin
                       Lbl.Text:=ed_pos2.TextPrompt;
                       end
                      else
                       begin
                       Lbl.Text:= ed_pos2.Text;
                       end;
                      end;
                     if Lbl.Name='qty3' then
                      begin
                      if ed_pos3.Text='' then
                       begin
                       Lbl.Text:=ed_pos3.TextPrompt;
                       end
                      else
                       begin
                       Lbl.Text:= ed_pos3.Text;
                       end;
                      end;
                   end;
                 end;
               end;
             end;
           end;
          end;

在那行布局中,控件没有controlCount之前说的4个条目。它在e=0时进入循环,第二次进入循环,e=1,它崩溃并显示错误消息。任何帮助将不胜感激。

hlswsv35

hlswsv351#

首先,你使用绝对关键字,这使得它很容易拍自己的脚。当你有两个变量(layoutLbl)指向一个变量(Ctrl)时,情况更是如此。
代码中的问题是,您在第一次循环中将Ctrl设置为布局,然后在第二次循环中再次重用该变量并分配Ctrl:=layout.Controls[e],由于absolute指令,基本上转换为Ctrl:=Ctrl.Controls[e],并且布局变量在第二次循环迭代中不再拥有实际的布局控制。
你应该为第二个循环使用单独的变量。我建议你不要使用绝对值,直接使用适当的变量进行类型转换。
您甚至可以避免类型转换,这取决于您使用的属性。例如,layout可以很容易地被声明为TControl,你只需要检查它的类型以确保你正在访问布局,但你不必类型转换它。

var e,h : integer;
      item : TListBoxItem;
      layout : TControl;
      Lbl :  TLabel;
  begin
  item := ListBox1.ListItems[itemNum]; 
   for h:=0 to item.ControlsCount-1 do
     begin
       layout := item.Controls[h]; 
       if layout is TLayout then
         begin
           if layout.Name='lout3' then  
            begin
             for e:=0 to layout.ControlsCount-1 do  
               begin
                if layout.Controls[e] is TLabel then
                   begin
                     Lbl := TLabel(layout.Controls[e]);
                   ...

相关问题