rt

解决方案 »

  1.   

    对象是类的动态实例,对象总是被动态分配到堆上。因此一个对象引用就如同一个句柄或一个指针。但你分本一个对象引用给一个变量时,Delphi公复制引用,而不是象。下面的程序说明了对象引用和类引用的不同。
    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.
      

  2.   

    堆上的对象实体中包含类应用----前4个字节的VPTR对象引用是一种特殊指针....
      

  3.   

    类引用使用来表示类类型的 比如说在传递参数的时候 你不知道你实际传递的是 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;