德尔福更改标签标题不起作用

时间:2015-01-20 15:24:59

标签: delphi delphi-xe

所以我需要在我的表单上找到一些动态创建的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表示代码正在执行

2 个答案:

答案 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

的所有这些用途