所以我需要在我的表单上找到一些动态创建的TLabel组件,并更改它们的标题但我必须做错了。请检查下面的代码并帮助我,我只是不知道还有什么可以尝试:
procedure TmainForm.setLabelCaptionForPanel(pan:TPanel; ordin: integer);
var
j:integer;
begin
for j := 0 to mainform.ComponentCount - 1 do
begin
if mainform.Components[j] is TLabel then
if StartsText('Layernumber',mainform.Components[j].Name) then
begin
if mainform.Components[j].GetParentComponent = pan then
begin
(Mainform.Components[j] as TLabel).Caption := IntToStr(ordin);
end;
end;
end;
end;
我根本不明白这个问题 如果我只是尝试这段代码:
lbx:=TLabel.Create(self);
lbx:=FindComponent('Layernumber1') as TLabel;
lbx.Caption:='jkjkghgkjghk';
它像魅力一样...... 那么我做错了什么?
请...
修改
我将备忘录行添加到代码中:
procedure TmainForm.setLabelCaptionForPanel(pan:TPanel; ordin: integer);
var
j:integer;
lbx:TLabel;
begin
memo1.lines.Add('Setting layer lbl caption on panel:'+pan.name+', to:'+IntToStr(ordin));
//lbx:=TLabel.Create(self);
//lbx:=FindComponent(vt.FieldValues['Layernumber']+) as TLabel;
for j := 0 to ComponentCount - 1 do
begin
if Components[j] is TLabel then
if StartsText('Layernumber',Components[j].Name) then
begin
Memo1.Lines.Add('Component label found:'+mainform.Components[j].Name);
Memo1.Lines.Add('Having parent:'+TLabel(Mainform.Components[j]).Parent.Name);
if Components[j].GetParentComponent = pan then
begin
Memo1.Lines.Add('Labem found (name):'+Components[j].Name+' with caption:'+TLabel(Components[j]).Caption);
Memo1.Lines.Add('Has parent:'+pan.Name);
// Memo1.Lines.Add('xxx...:'+TLabel(Mainform.Components[j]).name+' - '+TLabel(Mainform.Components[j]).Caption+' -> '+IntToStr(ordin));
(Components[j] as TLabel).Caption := IntToStr(ordin);
Memo1.Lines.Add('Done');
end;
end;
end;
end;
我在面板的OnMouseUp事件中运行该过程 我的备忘录在运行时看起来像这样:
Senderul:Layeru0
Searching on panel:Layeru0
Panelul:Layeru0 - cu captionul obtinut=0
GetNumar de layere=3
Layer panel gasit este:Layeru3
Setting layer lbl caption on panel:Layeru3, to:3
Component label found:Layernumber0
Having parent:Layeru0
Component label found:Layernumber1
Having parent:Layeru1
Component label found:Layernumber2
Having parent:Layeru2
Component label found:Layernumber3
Having parent:Layeru3
Labem found (name):Layernumber3 with caption:3
Has parent:Layeru3
Done
Layer panel gasit este:Layeru0
Setting layer lbl caption on panel:Layeru0, to:2
Component label found:Layernumber0
Having parent:Layeru0
Labem found (name):Layernumber0 with caption:0
Has parent:Layeru0
Done
Component label found:Layernumber1
Having parent:Layeru1
Component label found:Layernumber2
Having parent:Layeru2
Component label found:Layernumber3
Having parent:Layeru3
Layer panel gasit este:Layeru2
Setting layer lbl caption on panel:Layeru2, to:1
Component label found:Layernumber0
Having parent:Layeru0
Component label found:Layernumber1
Having parent:Layeru1
Component label found:Layernumber2
Having parent:Layeru2
Labem found (name):Layernumber2 with caption:2
Has parent:Layeru2
Done
Component label found:Layernumber3
Having parent:Layeru3
Layer panel gasit este:Layeru1
Setting layer lbl caption on panel:Layeru1, to:0
Component label found:Layernumber0
Having parent:Layeru0
Component label found:Layernumber1
Having parent:Layeru1
Labem found (name):Layernumber1 with caption:1
Has parent:Layeru1
Done
Component label found:Layernumber2
Having parent:Layeru2
Component label found:Layernumber3
Having parent:Layeru3
您可能会看到“完成”' line表示代码正在执行
答案 0 :(得分:2)
var
i: integer;
begin
for i := 0 to pan.ControlCount -1 do
begin
if (pan.Controls[i] is TLabel) and
(pan.Controls[i].Name = 'YOURLABEL' + IntToStr(i)) then
TLabel(pan.Controls[i]).Caption := 'Do whatever you want';
end;
end;
答案 1 :(得分:0)
(Mainform.Components[j] as TLabel).Caption := IntToStr(ordin);
这将更改该标签控件的标题。由于您报告代码无法更改标签,因此我们只能断定此代码未执行,或者它正在错误的标签上执行。
您可以通过单步执行代码来缩小问题范围。首先在这一行设置一个断点:
if StartsText('Layernumber',mainform.Components[j].Name) then
如果该断点未触发,则mainform
拥有的任何组件都不属于TLabel
类型。
然后转到
if mainform.Components[j].GetParentComponent = pan then
如果某个断点没有触发,那么mainform
拥有的所有标签都不会以'Layernumber'
开头。
等等。您可以使用此技术来理解为什么Caption
的赋值没有执行,或者为什么它在错误的组件上执行。
这段代码当然非常可怕。当然你可以做得更好。为什么要创建标签然后忘掉它的全部内容。通过记住表单变量中对标签的引用,让自己的生活变得简单。
FLabelNumber1 := TLabel.Create(Self);
...
然后您可以丢弃问题中的所有代码并直接使用FLabelNumber1
。
为了给你更多的鼓励,我可以诚实地说,在15年的Delphi软件发货过程中,我从未发过名为FindComponent
的代码。
顺便说一句,你几乎肯定不应该使用mainform
全局变量。您的代码以TmainForm
的方法执行。因此它已经可以通过隐式Self
变量访问表单对象。请花点时间删除mainform
。