希望能通过传入类名参数或者类参考实例也好,反正在函数中能够生成对应的类实例。老是显示抽象类错误,快郁闷死了。。能有classforname该多好啊(该死的DELPHI)。有什么好的办法代码如下:
-------------
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
list: TList;
{ Private declarations }
public
{ Public declarations }
end; C_BASE = class(TObject)
public
constructor create; virtual; abstract;
procedure doit; virtual; abstract;
end;
classC = class of C_BASE; C_A = class(C_BASE)
private
ii: Integer;
public
aa: string;
a0: string;
constructor create; overload;
procedure doit; override;
end;
classA = class of C_A; C_B = class(C_BASE)
public
bb: string;
constructor create; overload;
procedure doit; override;
end;
classB = class of C_B; procesBASE = procedure (any: C_BASE);var
Form1: TForm1;implementation{$R *.dfm}constructor C_A.create;
begin
Self.aa := 'iamaa';
Self.ii := 555;
Self.a0 := 'nbads';
end;procedure C_A.doit;
begin
ShowMessage(Self.aa);
ShowMessage(Self.a0);
end;constructor C_B.create;
begin
self.bb := 'bbii';
end;procedure C_B.doit;
begin
ShowMessage(self.bb);
end;procedure doany(var any: C_BASE; cls: classC);
var
innerbase: C_BASE;
begin
innerbase := any.create;
ShowMessage(innerbase.ClassName);
//<<<<<<<<<<<<<<<<<<<<<<<怎样在这里产生一个C_BASE子类实例啊?????
//cls.InstanceSize
any.doit;
end;/////////////////////////////////////////////////////////////procedure TForm1.Button1Click(Sender: TObject);
var
ca: C_A;
cb: C_BASE;
cla: classA;
clb: classB;
clc: classC;
begin
ca := C_A.create;
clc := clb;
doany(C_BASE(ca), clc);
ca.Free;
// cb := C_BASE.create;
// doany(cb, clb);
// cb.Free;
//
// ca := cb;
end;end.
-------------
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
list: TList;
{ Private declarations }
public
{ Public declarations }
end; C_BASE = class(TObject)
public
constructor create; virtual; abstract;
procedure doit; virtual; abstract;
end;
classC = class of C_BASE; C_A = class(C_BASE)
private
ii: Integer;
public
aa: string;
a0: string;
constructor create; overload;
procedure doit; override;
end;
classA = class of C_A; C_B = class(C_BASE)
public
bb: string;
constructor create; overload;
procedure doit; override;
end;
classB = class of C_B; procesBASE = procedure (any: C_BASE);var
Form1: TForm1;implementation{$R *.dfm}constructor C_A.create;
begin
Self.aa := 'iamaa';
Self.ii := 555;
Self.a0 := 'nbads';
end;procedure C_A.doit;
begin
ShowMessage(Self.aa);
ShowMessage(Self.a0);
end;constructor C_B.create;
begin
self.bb := 'bbii';
end;procedure C_B.doit;
begin
ShowMessage(self.bb);
end;procedure doany(var any: C_BASE; cls: classC);
var
innerbase: C_BASE;
begin
innerbase := any.create;
ShowMessage(innerbase.ClassName);
//<<<<<<<<<<<<<<<<<<<<<<<怎样在这里产生一个C_BASE子类实例啊?????
//cls.InstanceSize
any.doit;
end;/////////////////////////////////////////////////////////////procedure TForm1.Button1Click(Sender: TObject);
var
ca: C_A;
cb: C_BASE;
cla: classA;
clb: classB;
clc: classC;
begin
ca := C_A.create;
clc := clb;
doany(C_BASE(ca), clc);
ca.Free;
// cb := C_BASE.create;
// doany(cb, clb);
// cb.Free;
//
// ca := cb;
end;end.
解决方案 »
- Delphi 控件的拖动
- delphi网页填表 是否能按照图片名称去点击呢
- 如何用DELPHI模拟复制IE的HTML内容进入剪贴板
- 很菜的问题:用数据模块有什么好处?
- 为什么这个复制文件函数在复制硬盘上的文件没问题,而复制光盘的文件就出现了任何文件夹(包括其中的文件)都不会被复制?
- 有没有沈阳的朋友,帮帮忙,先谢谢了
- 有关speetbution按钮加入图片问题
- 如何不使用ADO组件,在delphi程序中直接调用ADO的方法,就如VB操作ADO一样方便??
- 奇怪的浏览器问题
- 为什么在DLL中用IS判断从EXE主程序中传进来的对象类型失败了?
- image控件增加鼠标移进和移出事件,除了建立一个Class外还有其它好办法吗?
- 有没有一个控件即能接收图片也能接收文字?
var
innerbase: C_BASE;
begin
innerbase := C_BASE(any.NewInstance);
ShowMessage(innerbase.ClassName);
//<<<<<<<<<<<<<<<<<<<<<<<怎样在这里产生一个C_BASE子类实例啊?????
//cls.InstanceSize
any.doit;
end;
具体原因,楼主可以看李维写的INSIDE VCL,楼主应该有较好的JAVA或C++基础,仍建议在学DELPHI的时候,平心静气.可以说,DELPHI本身只是一种工具而已,真正会让您得益的,是它背后的风格,文化,思路等潜在的东西.-------------------------------------------------------- C_BASE = class(TObject)
public
constructor create; //virtual; abstract;
procedure doit; virtual; abstract;
end; classC = class of C_BASE; C_A = class(C_BASE)
private
ii: Integer;
public
aa: string;
a0: string;
constructor create; //overload;
procedure doit; override;
end;
classA = class of C_A; C_B = class(C_BASE)
public
bb: string;
constructor create; //overload;
procedure doit; override;
end;
classB = class of C_B; procesBASE = procedure (any: C_BASE);var
Form1: TForm1;implementation{$R *.dfm}constructor C_A.create;
begin
aa := 'iamaa';
ii := 555;
a0 := 'nbads';
end;procedure C_A.doit;
begin
ShowMessage(Self.aa);
ShowMessage(Self.a0);
end;constructor C_B.create;
begin
bb := 'bbii';
end;procedure C_B.doit;
begin
ShowMessage(self.bb);
end;procedure doany(var any: C_BASE; cls: classC);
var
innerbase: C_BASE;
begin
innerbase := cls.create;
ShowMessage(innerbase.ClassName);
//cls.InstanceSize
any.doit;
end;/////////////////////////////////////////////////////////////procedure TForm1.Button1Click(Sender: TObject);
var
ca: C_A;
cb: C_BASE;
cla: classA;
clb: classB;
clc: classC;
begin
ca := C_A.create;
// clc := clb;
// clc := classB; doany(C_BASE(ca), C_B); ca.Free;// cb := C_BASE.create;
// doany(cb, clb);
// cb.Free;
//
// ca := cb;
end;
{ C_BASE }constructor C_BASE.create;
begin
//
end;
做得正确: TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
list: TList;
{ Private declarations }
public
{ Public declarations }
end; C_BASE = class(TObject)
public
procedure doit; virtual; abstract;
end;
classC = class of C_BASE; C_A = class(C_BASE)
private
ii: Integer;
public
aa: string;
a0: string;
constructor create;
procedure doit; override;
end;
classA = class of C_A; C_B = class(C_BASE)
public
bb: string;
constructor create;
procedure doit; override;
end;
classB = class of C_B; procesBASE = procedure (any: C_BASE);var
Form1: TForm1;implementation{$R *.dfm}constructor C_A.create;
begin
Self.aa := 'iamaa';
Self.ii := 555;
Self.a0 := 'nbads';
end;procedure C_A.doit;
begin
ShowMessage(Self.aa);
ShowMessage(Self.a0);
end;constructor C_B.create;
begin
self.bb := 'bbii';
end;procedure C_B.doit;
begin
ShowMessage(self.bb);
end;procedure doany(var any: C_BASE; cls: classC);
var
innerbase: C_BASE;
begin
innerbase := C_BASE(any.NewInstance);
ShowMessage(innerbase.ClassName);
//<<<<<<<<<<<<<<<<<<<<<<<怎样在这里产生一个C_BASE子类实例啊?????
//cls.InstanceSize
innerbase.doit;
end;/////////////////////////////////////////////////////////////procedure TForm1.Button1Click(Sender: TObject);
var
ca: C_A;
cb: C_BASE;
cla: classA;
clb: classB;
clc: classC;
begin
ca := C_A.create;
clc := clb;
doany(C_BASE(ca), clc);
ca.Free;
// cb := C_BASE.create;
// doany(cb, clb);
// cb.Free;
//
// ca := cb;
end;