var Form1: TForm1;implementation{ ************************************ TForm1 ************************************ } procedure TForm1.Button1Click(Sender: TObject); var i: Integer; const contrlClassArry:array[0..2] of Tcontrolclass=(TMonthcalendar,Tmemo,Tcolorbox);begin for i:=0 to controlcount-1 do if (controls[i] is Tmonthcalendar) or (controls[i] is Tmemo) or (controls[i] is Tcolorbox) then controls[i].free; createcontrolobj(contrlclassarry[RadioGroup1.itemindex]); end;procedure TForm1.createcontrolobj(controlClass:TcontrolClass); var AcontrolObj: Tcontrol; begin AcontrolObj:=controlclass.create(self); AcontrolObj.parent:=self; AcontrolObj.name:=AcontrolObj.classname; AcontrolObj.setbounds(10,10,250,150); label1.caption:=AcontrolObj.classname; end;{$R *.dfm}end.
堆上的对象实体中包含类应用----前4个字节的VPTR对象引用是一种特殊指针....
类引用使用来表示类类型的 比如说在传递参数的时候 你不知道你实际传递的是 tbutton 还是 Tedit 但是该函数的实现中 你必须考虑到他们都有可能被传递 所以你需要一个类型来标识你要传递的参数的类型 这就应该使用类类型 即类引用 典型的例子是 procedure TApplication.CreateForm(InstanceClass: TComponentClass ; var Reference); //////TComponentClass 即是类类型 var Instance: TComponent; begin Instance := TComponent(InstanceClass.NewInstance); TComponent(Reference) := Instance; try Instance.Create(Self); except TComponent(Reference) := nil; raise; end; if (FMainForm = nil) and (Instance is TForm) then begin TForm(Instance).HandleNeeded; FMainForm := TForm(Instance); end; end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls;type
TcontrolClass=class of Tcontrol;
TForm1 = class (TForm)
Button1: TButton;
Label1: TLabel;
RadioGroup1: TRadioGroup;
procedure Button1Click(Sender: TObject);
private
procedure createcontrolobj(controlClass:TcontrolClass);
end;
var
Form1: TForm1;implementation{
************************************ TForm1 ************************************
}
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer; const
contrlClassArry:array[0..2] of Tcontrolclass=(TMonthcalendar,Tmemo,Tcolorbox);begin
for i:=0 to controlcount-1 do
if (controls[i] is Tmonthcalendar) or (controls[i] is Tmemo) or (controls[i] is Tcolorbox) then
controls[i].free;
createcontrolobj(contrlclassarry[RadioGroup1.itemindex]);
end;procedure TForm1.createcontrolobj(controlClass:TcontrolClass);
var
AcontrolObj: Tcontrol;
begin
AcontrolObj:=controlclass.create(self);
AcontrolObj.parent:=self;
AcontrolObj.name:=AcontrolObj.classname;
AcontrolObj.setbounds(10,10,250,150);
label1.caption:=AcontrolObj.classname;
end;{$R *.dfm}end.
典型的例子是
procedure TApplication.CreateForm(InstanceClass: TComponentClass ; var Reference);
//////TComponentClass 即是类类型
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(Self);
except
TComponent(Reference) := nil;
raise;
end;
if (FMainForm = nil) and (Instance is TForm) then
begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance);
end;
end;