首页  编辑  

如何根据名字来动态创建对象?

Tags: /超级猛料/Language.Object Pascal/面向对象和类、VCL核心/   Date Created:

回答一个鬼佬的提问写的代码。

我希望根据一个字符串,来创建该类的对象,例如我给定'TButton',那么能在运行的时候,动态创建Button出来?不要告诉我用if来判断或者用case来判断等等~,那样的话,有几百个控件的话,岂不是晕倒?

请参考下面的代码,下面的代码演示了三种控件的动态创建,若需要动态创建其他的,请修改那个数组常量即可:

function DynCreateControlByName ( AClassName : string ; AOwner : TWinControl = nil ): TControl ;

const

  /// You can add any class if you want!

 ControlClass       : array [ 0 .. 2 ] of TPersistentClass = ( TButton , TEdit , TLabel );

var

 Cls               : TControlClass ;

begin

 Result := nil ;

 RegisterClasses ( ControlClass );

 Cls := TControlClass ( GetClass ( AClassName ));

  if Cls = nil then exit ;

 Result := Cls . Create ( AOwner );

end ;

procedure TForm1 . Button1Click ( Sender : TObject );

var

 Control           : TControl ;

begin

 Control := DynCreateControlByName ( Edit1 . Text );

  if Control <> nil then

    with Control do

    begin

     Parent := Self ;

     Left := Random ( Self . Width ) - Width ;

     Top := Random ( Self . Width ) - Height ;

     Perform ( WM_SETTEXT , Length ( Edit1 . Text ), integer ( pchar ( Edit1 . Text )));

     Show ;

    end ;

end ;

---------------------------------------

procedure TForm1.Button2Click(Sender: TObject);

begin

 TWinControlClass(FindClass('TQRDBText')).Create(Self);

end;

initialization

 RegisterClasses([TQRDBText]);

finalization

 UnregisterClasses([TQRDBText]);

end.