回答一个鬼佬的提问写的代码。
我希望根据一个字符串,来创建该类的对象,例如我给定'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.