Delphi动态创建一个tlable - 将其放在表单

时间:2018-04-16 15:19:50

标签: delphi exception-handling

我想动态创建标签。我跟着:how to dynamically create a component in delphi such as TLabel or TEdit ...etc

我已被这样的标签删除了:

 listofnames[i]:=TLabel.create(quiz2);
 listofnames[i].parent:=quiz2;
 listofnames[i].caption:=quiz.getsubjectname(i);
 listofnames[i].height:=25;
 listofnames[i].Width:=85;
 listofnames[i].left:=8;
 listofnames[i].top:=135+i*30;
 listofnames[i].OnClick:=labelclicked;

在我单位顶部的表格中我有这个:

 type
  Tlblarr=array of TLabel;
  TQuiz2 = class(TForm)
  //published section
    Q2LTitle: TLabel;
    Q2LIntro1: TLabel;
    Q2LMon: TLabel;
    Q2LTue: TLabel;
    Q2LWed: TLabel;
    Q2LFri: TLabel;
    Q2LThurs: TLabel;
    Q2LSun: TLabel;
    Q2LSat: TLabel;
    Q2ButStart: TButton;
    Q2LSubList: TLabel;
    Q2ButFin: TButton;
   //all above are other things on my form
    listofnames:Tlblarr;
  //array of dynamicly create labels
    procedure Q2ButStartClick(Sender: TObject);
    procedure labelclicked(Sender:TObject);
    procedure timeslotclicked(Sender:TObject);
    procedure Q2ButFinClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    clickedfirst:string;
    numberofsub:integer;
    numberofextra:integer;
   public
  end;

我收到以下错误:

  

已发布字段listofnames不是类或接口类型

所以我假设它不打算发表?但是,如果我将它移到公共或私人部分,我会得到一个不同的错误:

  

异常类EClassNotFound,消息'未找到类TLabel'

我离开的例子没有提到它,所以我认为这是我不知道的常识。我已经浏览了互联网上的两个错误的原因,大多数人的问题与我的不同或解决方案不起作用 - 将标签放在已发布的位置似乎是最常见的。这两个错误都以相同的方式发生:它编译并在运行时立即绘制异常。我相信这是因为Application.CreateForm(TQuiz2,Quiz2)这一行。这是在Project1部分 - 我从未编入或触摸过的部分,直到调试程序才显示。

有人可以指出标签数组肯定要发布的地方,以及我可以找到有关如何调试此错误的更多信息。我查看了http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Classes_EClassNotFound.htmlhttp://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/cm_cannot_publish_xml.html,但我仍然无法理解。

1 个答案:

答案 0 :(得分:2)

对于运行时构造的字段对象,它们进入私有或受保护(或非常罕见的公共)部分。这取决于您希望它们对其他形式或降序形式可见的方式(表单可以像其他类一样继承)。除非你有充分的理由把它放在其他地方,否则把它放在私人的位置。

classname和private之间的声明是针对设计时字段的,因此它会在.dfm文件中查找这些对象的属性。

顺便说一句,Delphi中的惯例是用F开始一个字段变量,所以FListOfNames:Tlblarr; FClickedOnFirst等