Delphi更改标签标题不起作用

用户名

因此,我需要在表单上找到一些动态创建的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

您可能会看到“完成”行表示代码正在执行

大卫·赫弗南(David Heffernan)
(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未执行或为什么在错误的组件上执行。

这段代码阅读起来当然很恐怖。当然,您可以做得更好。为什么要创建标签,然后忘掉所有标签。记住在form变量中对标签的引用,使自己的生活变得简单。

FLabelNumber1 := TLabel.Create(Self);
...

然后,您可以丢弃问题中的所有代码并FLabelNumber1直接使用

为了给您更多的鼓励,我可以坦白地说,在交付Delphi软件超过15年的时间里,我从未交付过称为的代码FindComponent


顺便说一句,您几乎可以肯定不应该使用mainform全局变量。您的代码以的方法执行TmainForm因此,它已经可以通过隐式Self变量访问表单对象请花时间删除的所有这些使用mainform

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章