我想动态创建标签。我跟着: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.html和http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/cm_cannot_publish_xml.html,但我仍然无法理解。
答案 0 :(得分:2)
对于运行时构造的字段对象,它们进入私有或受保护(或非常罕见的公共)部分。这取决于您希望它们对其他形式或降序形式可见的方式(表单可以像其他类一样继承)。除非你有充分的理由把它放在其他地方,否则把它放在私人的位置。
classname和private之间的声明是针对设计时字段的,因此它会在.dfm文件中查找这些对象的属性。
顺便说一句,Delphi中的惯例是用F开始一个字段变量,所以FListOfNames:Tlblarr; FClickedOnFirst等