我在列表框中动态创建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,它崩溃并显示错误消息。任何帮助将不胜感激。
1条答案
按热度按时间hlswsv351#
首先,你使用绝对关键字,这使得它很容易拍自己的脚。当你有两个变量(
layout
和Lbl
)指向一个变量(Ctrl
)时,情况更是如此。代码中的问题是,您在第一次循环中将
Ctrl
设置为布局,然后在第二次循环中再次重用该变量并分配Ctrl:=layout.Controls[e]
,由于absolute
指令,基本上转换为Ctrl:=Ctrl.Controls[e]
,并且布局变量在第二次循环迭代中不再拥有实际的布局控制。你应该为第二个循环使用单独的变量。我建议你不要使用绝对值,直接使用适当的变量进行类型转换。
您甚至可以避免类型转换,这取决于您使用的属性。例如,
layout
可以很容易地被声明为TControl
,你只需要检查它的类型以确保你正在访问布局,但你不必类型转换它。