form:="TForm".Create(nil)如何将上面的"TForm"转换成TForm???请各位帮忙。
解决方案 »
- 我的应用服务器现在终于稳定下来了!不过在Win2000下有问题。
- 如何让加入到TImageList的中的图片自动适应大小
- 一个初学者的问题
- 请问:专业安装程序制作软件 InstallShield 的最新版是多少————在线等待!!!
- 急求:一张桌子的各个组成部分的费用
- ??? 寻找凭证录入的控件 ...
- 愿跟各位delphi高手交流,望多赐教--QQ:228653143
- 请问,在一个EDIT里输入算式,比如25*52,如何动态的计算这个算式的结果??
- 请问哪里有Btrieve 数据库ODBC驱动下载?
- 如何在程序中调用,使用windows下的应用软件,如录音机。方法越多越好,谢谢
- ADO中如何删除所有记录 举个例子 好吗
- 如何得到Windows Media Player9控件的缓冲值?
編一个类厂
构造函数可通过一个类引用类型的变量进行调用,这允许创建编译时类型并不确定的对象。比如,
type TControlClass = class of TControl;
function CreateControl(ControlClass: TControlClass;
const ControlName: string; X, Y, W, H: Integer): TControl;
begin
Result := ControlClass.Create(MainForm);
with Result do
begin
Parent := MainForm;
Name := ControlName;
SetBounds(X, Y, W, H);
Visible := True;
end;
end;
CreateControl 函数需要一个类引用类型的参数,它指定创建何种控件,函数使用这个参数来调用构造函数。因为类标志符(类名)表示一个类引用的值,所以能使用它作为参数来调用CreateControl 创建一个实例。比如,
CreateControl(TEdit, 'Edit1', 10, 10, 100, 20);
使用类引用来调用的构造函数通常是虚方法,实际调用的构造函数(指实现)由运行时类引用的类型决定。
我希望根据一个字符串,来创建该类的对象,例如我给定'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;initializationRegisterClasses([TQRDBText]);finalization
UnregisterClasses([TQRDBText]);
end.