我希望根据一个字符串,来创建该类的对象,例如我给定'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.
此文章由 http://www.ositren.com 收集整理 ,地址为:
http://www.ositren.com/htmls/67922.html