如何把一个类型作为参数进行传递?
想了很久没想明白
想了很久没想明白
解决方案 »
- 问:如何用delphi把一个文件接制作成exe运行文件
- delphi返回值的问题
- 界面编辑器Extlib 2.0 与TiPipe控件结合编程的问题
- 怎样用Delphi将sql自定义函数加入到数据库中?
- 100分 求计算机连接打印机的状况的程序
- 放分,看我讲不讲信誉。
- 用过TVideoCap组件,或是用过VFW的朋友请进来。。
- 请教:如下代码在WIN98下运行正常,在WIN2K下不行,而且什么提示都没有,何故?
- 给我一个例子1000分相送
- ×××××××××怎样把FLOAT类型的值四舍五入?××××××××××××
- 引入realplayer Activex控件后,如何控制其视频播放框的位置?
- 那里有Windows Media Player控件的使用帮助文档?
var
i :integer;
begin
if s = 'integer' then
i := 1
else
i := 0;
end;
......
end;TMyClass2 = class(TMyClass)
......
end;TMyClassRef = class of TMyClass; // 声明Class-reference types procedure f(MyClass: TMyClassRef);
begin
.....
end;
调用的时候可以:f(TMyClass);
f(TMyClass2); // TMyClass 的派生类也行!
TSomeProcType = procedure (var AI:Integer);
....
procedure SomeProcWithTypeParams(ASomeProcType:TSomeProcType);
....procedure SomeProcWithTypeParams(ASomeProcType:TSomeProcType);
begin
ShowMessage(IntToStr(PInteger(@ASomeProcType)));
end;这里就是将一个类型(过程类型)做为参数传递给相应方法进行处理!
在函数中通过判断传进来的类型的类名,例如:
if Sender=Edit2 then
TEdit(Sender).Text:='hehe';
在函数中通过判断传进来的类型的类名,例如:
function LoadData(Sender:TObject);
begin
if Sender=Edit2 then
TEdit(Sender).Text:='hehe';
......
End;
有时类的操作作用于其自身,这不同于作用于类的实例(即对象)。例如,当用类引用调用构造器方法时。对于这样的情况,总是可以明确指定要用的类的名称,但有时必需声明变量或参数把类作为值处理,并且这种情况下需要类引用类型(class-reference types)。
类引用类型类引用类型有时叫做元类(metaclass),表示类引用类型的结构具有如下形式class of type这里的type是任何类类型。标识符type自身表示一个值,它的类型是type类。如果type1是type2的祖先,那么type2的类与type1的类是赋值兼容的。因此,type TClass = class of TObject;var AnyObj: TClass;这里声明一个叫做AnyObj的变量,用于可以保存对任何类的引用。(类引用类型的定义不能直接出现在变量声明或参数列表声明中。)可以把值nil赋给任何类引用类型的变量。要明白类引用类型是如何被使用的,可以查看TCollection(Classes单元中)的构造器声明:type TCollectionItemClass = class of TCollectionItem; ...constructor Create(ItemClass: TCollectionItemClass);这里的声明表明,要创建TCollection的实例对象,就必需向构造器传递TCollectionItem类或自该类派生的类的名称。编译时,想要调用类或对象的类方法或者虚拟的构造器,而不知道其实际类型时,类引用类型是有用的。
构造器和类引用构造器可以被类引用类型的变量调用。这就允许在编译时构造类型未知的对象。例如,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);用类引用调用的构造器通常是虚拟的。运行时类引用的类型决定了构造器在调用时的具体实现。