class function 什么意思啊??100分相送

ppzcgg 2003-08-19 03:05:42
1.在function前加class是什么意思啊,就像TObject的ClassName方法,加class和不加class有什么区别啊?
2.用Type library 给一个COM对象添加方法,怎样添加函数啊,按那个添加方法按钮添加的都是procedure??
初学delphi,望高手指点.
...全文
603 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
ppzcgg 2003-08-20
  • 打赏
  • 举报
回复
lxpbuaa(桂枝香在故国晚秋)
呵呵,大哥,我是3系的,自动控制系的,来深圳告诉我.我的mail: zhongjq@163.com
lxpbuaa 2003-08-20
  • 打赏
  • 举报
回复
ppzcgg(排排坐,吃果果) (▲):
我是北航2000年毕业的,就读于机械工程及自动化学院(原7系)的飞行器制造专业,现在成都:》不过近期可能出差到深圳。

—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
ppzcgg 2003-08-20
  • 打赏
  • 举报
回复
to lxpbuaa(桂枝香在故国晚秋)
我们好像是校友啊,buaa.
ppzcgg 2003-08-20
  • 打赏
  • 举报
回复
呵呵,谢谢各位了,尤其要感谢zjqyb(),fengjn(小枫),lxpbuaa(桂枝香在故国晚秋),DWGZ()
问最后一个问题,上边几位有在深圳的吗?有时间的话一起吃顿饭,踢踢球.
yangxjn 2003-08-20
  • 打赏
  • 举报
回复
xuexi
zjqyb 2003-08-20
  • 打赏
  • 举报
回复
编译宏$WRITEABLECONST现在的缺省值改为关,这是为了防止Delphi的工程中运用可赋值的常量。可赋值的常量,也就是定义一个常量,但是却允许在运行期间改变其值。例子如下:


const


foo: Integer = 12;

begin

foo := 14;

end.

在以往的Delphi版本中,有这么一个特性:常量不是真正的常量。使用编译宏$WRITEABLECONST OFF,则以上的代码中的Begin和End之间的Foo的赋值将引发一个编译错误。若要避免它,只需将Foo的声明改为 var。

你可能有将常量用作一个可以初始化的局部变量的代码,比如:


procedure MyProc;


const

somedata: Integer = 12;

begin

Inc(somedata, 3);

end;

你要做的是将局部常量移到过程的外部声明,使其成为一个全局的变量。然后代码变为:


var


somedata: Integer = 12;

procedure MyProc;

begin

Inc(somedata, 3);

end;

对于过度依赖于常量的代码(比如ActiveX 控件的包装器),可以通过在源文件中插入一个{$WRITEABLECONST ON}的编译命令来修正。这一特性,在RTL, VCL, CLX,和 DB 等核心的源代码中被禁止使用,但是在周边的单元比如ActiveX 控件的包装器中倒可以接受。

总而言之,你应该意识到“可赋值的常量”这个说法的自相矛盾。Delphi的以往版本中的这一特性,只是为了与老的16位的编译器的兼容而保留,但现在对于Delphi的开发者来说已经毫无意义了。要养成好的编程习惯,尽量避免使用可赋值的常量。

zjqyb 2003-08-20
  • 打赏
  • 举报
回复
把编译器的
允许const write的开关打开

delphi6缺省没有打开
jerrymousenet2 2003-08-20
  • 打赏
  • 举报
回复
studing!!!
ppzcgg 2003-08-19
  • 打赏
  • 举报
回复
就快放分了,大伙再坚持一会儿.
ppzcgg 2003-08-19
  • 打赏
  • 举报
回复
谢谢小枫和zjqyb了.感觉还是MFC的那张大表比较好理解.还得看看vcl是怎么实现RTTI的.
1.在什么情况下需要把函数申明Class function啊?
2.Parameters页的Return Type 是作什么用的啊?retval是函数的返回值吗?

fengjn 2003-08-19
  • 打赏
  • 举报
回复

Control := ControlRef.Create(Self);
ppzcgg 2003-08-19
  • 打赏
  • 举报
回复
to zjqyb
先谢过了,这个例子功能是什么啊, 编译的时候告诉TControlRef没有申明
ppzcgg 2003-08-19
  • 打赏
  • 举报
回复
to zjqyb
const i:integer=0;这样定义i以后,i也不能修改啊,怎么成了静态变量了?
ppzcgg 2003-08-19
  • 打赏
  • 举报
回复
to zjqyb
const i:integer=0;定义i以后,i也不能改变了吧,我刚试过
zjqyb 2003-08-19
  • 打赏
  • 举报
回复
Class of Reference

在C++中,我们可以用static来声明一个属于类而不是类的某个具体实例的函数。许多人以为Object Pascal没有类似的功能,其实是有的,只要将函数声明为类方法(class procedure或者class function)就可以了。

例如:

TForm1=class(TForm)

public

class procedure T;

end;

implementation

class procedure TFomr1.T;

begin

end;

你可以在项目文件中验证它是不是真的static:

begin

TForm1.T;

Application.Initialzie;

Application.CreateForm(TForm1,Form1);

Application.Run;

end;

class procedure/class function在VCL中也是相当重要的一类特殊方法。TObject的ClassName,ClassNameIs,ClassPoint,ClassInfo这四个方法全都是class function。虽然你在实际的编程中99.99999999999%的时间都不会用到它们,不过这四个函数堪称构筑整个VCL的基石。

  值得一提的是,与C++中的static member function不同,Object Pascal中的class method能够具有多态的性质。例如,ClassName是TObject的一个class method,但是你调用TForm.ClassName得到的就是'TForm',调用TButton.ClassName得到的就是'TButton',等等。静态方法能够做到多态,岂不是非常神奇?这一切都是通过RTTI才做到的。你可以想象,如果ClassName用一般的virtual method来声明的话,就必须在每个派生类中都必须重载它才能实现类名称的正确映射,那将是多么痛苦的一件事情。

Class Reference是Object Pascal中不太为人所知晓的概念。它的语法很简单,比如,

TClass=class of TObject;

Class Reference有什么用呢?用一个小例子来说明。在Form上面放一个RadioGroup,其中包括Radio Button, Check Box, Button三项。代码如下:

type

TForm1=class(TForm)

...

private

ControlRef:TControlClass;

Counter : integer;

...

end;

implementation

procedure TForm1.FormCreate(Sender:TObject);

begin

Counter := 0;

end;

procedure TForm1.RadioGroup1Click(Sender:TObject);

begin

case RadioGroup1.ItemIndex of

0: ControlRef:=TRadioButton;

1: ControlRef:=TCheckBox;

2: ControlRef:=TButton;

end;

end;

procedure TForm1.FormMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:integer);

var

Control : TControl;

ControlName : string;

begin

if Button=mbLeft then begin

Control := TControlRef.Create(Self);

with Control do begin

Visible := False;

Parent := Self;

Left := X;

Top := Y;

ControlName := Control.ClassName + IntToStr(Counter);

Delete(ControlName,1,1);

Name := ControlName;

visible := True;

end;

end;

end;

  Class Reference揭示了Object Pascal的一个令人惊讶的能力。在OO语言的一般概念中,Constructor不可能是virtual,我们调用TButton.Create建立的就是Button,TForm.Create建立的就是TForm,依此类推。但是,籍由Class Reference,VCL就拥有了virtual Construction的能力,在上面的代码中,通过单独的一个ControlRef.Create,我们建立起来的可以是任何TControl的派生对象。正是由于这种能力,Form Designer和Object Inspector才有办法操作各种各样不同类型的构件,而不管这些构件是Delphi内置的,还是我们从其他地方得到的,或者是我们自己编写的。Class Reference的概念在其他地方也被称作meta-class,是用来描述类信息的特殊类型。

   实际上,真正的幕后英雄是RTTI,通过RTTI,不仅使得类拥有了virtual construction的功能,而且类中的class method也有了virtual的性质。例如,TObject中的ClassName方法声明为class function ClassName:string,按道理说static method是不可能做到多态的,但实际上,我们调用TButton.ClassName得到的就是TButton,调用TForm.ClassName得到的就是TForm,通过RTTI,不可能的事情变成了可能,而且而避免了在每个派生类都要重载ClassName的麻烦。

  在MFC中,如果一个对象满足下列条件:1。它是从CObject派生的;2。它的声明中包含DECLARE_DYNAMIC,并且在某个地方实现了IMPLEMENT_DYNAMIC,那么它也可以通过GetRuntimeClass()->CreateObject来实现类似的功能。

   所不同的是,MFC的实现方法是通过宏来在内存中建立起一个完整的CRuntimeClass表格,而Object Pascal中,由于单根继承的特性,所有对象天生就具备了这些功能。MFC的内存表格是通过程序员的声明而建立的,而Object Pascal中的RTTI表格是编译器自动生成的,彼此实现方法不同,但背后的思想是基本一致的。

  通过RTTI,不仅对象可以动态生成,而且对象的属性也可以动态设置。下面这段代码不是来自《Mastering Delphi 6》,而是来自陈宽达先生的《Delphi深度历险》,它同样揭示了Object Pascal通过RTTI而具备的强大功能和灵活性:

var

i: integer;

propInfo: PPropInfo;

begin

for i:=0 to ComponentCount-1 do begin

PropInfo := GetPropInfo(Components[i].ClassInfo,’Color’);

if PropInfo<>nil then

SetOrProp(Components[i], PropInfo, clRed);

end;

end;


ppzcgg 2003-08-19
  • 打赏
  • 举报
回复
to fengjn,DWGZ
先谢过了,刚才看了看帮助,说retval是函数的返回值,Parameters页的Return Type 是作什么用的啊?
zjqyb 2003-08-19
  • 打赏
  • 举报
回复
你对静态方法的理解有误,调用类的其他方法也可以改变静态变量的值.
const i=0相当于define
i的值不能更改
ppzcgg 2003-08-19
  • 打赏
  • 举报
回复
to lxpbuaa
那类方法和一般的方法有什么区别啊,我为什么要把一个方法申明为类方法啊?
ppzcgg 2003-08-19
  • 打赏
  • 举报
回复
呵呵,谢谢各位老大帮忙!!
为什么只能填一个指针类型的参数啊
lxpbuaa 2003-08-19
  • 打赏
  • 举报
回复
类方法可以由类也可以由类实例调用,相当于c++的静态(static)方法。在pascal中,static的意思大有不同:所有非虚(virtual或者dynamic)的方法都是static方法。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
加载更多回复(20)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧