1.在function前加class是什么意思啊,就像TObject的ClassName方法,加class和不加class有什么区别啊?
2.用Type library 给一个COM对象添加方法,怎样添加函数啊,按那个添加方法按钮添加的都是procedure??
初学delphi,望高手指点.

解决方案 »

  1.   

    可以通过指定Type library 中方法的参数类型来实现。
    首先参数必须是指针型。
    其次modifier必须为[out, retval]
      

  2.   

    谢谢 fengjn,lxpbuaa
    to lxpbuaa
    2. 就是直接去编辑DELPHI自动生成的*_TLB.pas文件是吗??
      

  3.   

    通过向导。添加完了按下保存,所有需要的delphi就给你写好了。
      

  4.   

    to fengjn
    >>>首先参数必须是指针型。
    我定义一个参数类型是VARIANT *
    modifier为[out, retval]
    他怎么生成的还是procedure啊.
      

  5.   

    选择菜单:View->Type Library————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  6.   

    to zjqyb
    C++的静态方法由静态变量啊,
    可是delphi哪有静态变量这个东西啊
      

  7.   

    to lxpbuaa
    continue啊
      

  8.   

    点modifier栏下面的…小按狃,在对应项上打钩就可以了。
      

  9.   

    为何静态方法一定有静态变量
    所谓类的静态方法是不需要依赖类的实例
    而且不能调用类中任何非静态方法delphi也有静态变量

    const i:integer=0;
      

  10.   

    to  fengjn
    是啊,我就是这样做的,我点那个...按钮,就弹了个小窗框出来,然后勾上out, retval
    最后按刷新,没有变化啊.
      

  11.   

    终于看明白了
    1。举个例子
      O.ClassName,  表示是这个O对象的成员变量或方法或函数等
      ClassName  实际有个隐含的Self 也就是 Self.Class指当前对象
    2。选择一个接口,  选择New Method就是那个绿色的像飘带一样的按按
      

  12.   

    保存后,在对应的单元中会把代码加上的。如
    function ***: your_type
    begin
    end;
      

  13.   

    to zjqyb
    嗯,我对静态方法的理解是:在类里,静态方法就是用来改变静态变量的,而静态变量对于类的所有对象是全局的,调用类的静态方法就可以改变静态变量的值.const i:integer=0; 和 const i=0; 有什么区别啊??
    不好意思有多了一个问题,呵呵
      

  14.   

    类方法可以由类也可以由类实例调用,相当于c++的静态(static)方法。在pascal中,static的意思大有不同:所有非虚(virtual或者dynamic)的方法都是static方法。————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  15.   

    to lxpbuaa
    那类方法和一般的方法有什么区别啊,我为什么要把一个方法申明为类方法啊?
      

  16.   

    你对静态方法的理解有误,调用类的其他方法也可以改变静态变量的值.
     const i=0相当于define
     i的值不能更改
      

  17.   

    to fengjn,DWGZ
    先谢过了,刚才看了看帮助,说retval是函数的返回值,Parameters页的Return Type 是作什么用的啊?
      

  18.   

    Class of Reference    
        
    在C++中,我们可以用static来声明一个属于类而不是类的某个具体实例的函数。许多人以为Object Pascal没有类似的功能,其实是有的,只要将函数声明为类方法(class procedure或者class function)就可以了。例如:TForm1=class(TForm)publicclass procedure T;end;implementationclass procedure TFomr1.T;beginend;你可以在项目文件中验证它是不是真的static:beginTForm1.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三项。代码如下:typeTForm1=class(TForm)...privateControlRef:TControlClass;Counter : integer;...end;implementationprocedure TForm1.FormCreate(Sender:TObject);beginCounter := 0;end;procedure TForm1.RadioGroup1Click(Sender:TObject);begincase RadioGroup1.ItemIndex of0: ControlRef:=TRadioButton;1: ControlRef:=TCheckBox;2: ControlRef:=TButton;end;end;procedure TForm1.FormMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:integer);varControl : TControl;ControlName : string;beginif Button=mbLeft then beginControl := TControlRef.Create(Self);with Control do beginVisible := 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而具备的强大功能和灵活性:vari: integer;propInfo: PPropInfo;beginfor i:=0 to ComponentCount-1 do beginPropInfo := GetPropInfo(Components[i].ClassInfo,’Color’);if PropInfo<>nil thenSetOrProp(Components[i], PropInfo, clRed);end;end;
     
       
      

  19.   

    to zjqyb
    const i:integer=0;定义i以后,i也不能改变了吧,我刚试过
      

  20.   

    to zjqyb
    const i:integer=0;这样定义i以后,i也不能修改啊,怎么成了静态变量了?
      

  21.   

    to zjqyb
    先谢过了,这个例子功能是什么啊, 编译的时候告诉TControlRef没有申明
      

  22.   


    Control := ControlRef.Create(Self);
      

  23.   

    谢谢小枫和zjqyb了.感觉还是MFC的那张大表比较好理解.还得看看vcl是怎么实现RTTI的.
    1.在什么情况下需要把函数申明Class function啊?
    2.Parameters页的Return Type 是作什么用的啊?retval是函数的返回值吗?
      

  24.   

    把编译器的
    允许const write的开关打开delphi6缺省没有打开
      

  25.   

    编译宏$WRITEABLECONST现在的缺省值改为关,这是为了防止Delphi的工程中运用可赋值的常量。可赋值的常量,也就是定义一个常量,但是却允许在运行期间改变其值。例子如下:
    const
    foo: Integer = 12;beginfoo := 14;end.在以往的Delphi版本中,有这么一个特性:常量不是真正的常量。使用编译宏$WRITEABLECONST OFF,则以上的代码中的Begin和End之间的Foo的赋值将引发一个编译错误。若要避免它,只需将Foo的声明改为 var。你可能有将常量用作一个可以初始化的局部变量的代码,比如:
    procedure MyProc;
    constsomedata: Integer = 12;beginInc(somedata, 3);end;你要做的是将局部常量移到过程的外部声明,使其成为一个全局的变量。然后代码变为:
    var
    somedata: Integer = 12;procedure MyProc;beginInc(somedata, 3);end;对于过度依赖于常量的代码(比如ActiveX 控件的包装器),可以通过在源文件中插入一个{$WRITEABLECONST ON}的编译命令来修正。这一特性,在RTL, VCL, CLX,和 DB 等核心的源代码中被禁止使用,但是在周边的单元比如ActiveX 控件的包装器中倒可以接受。总而言之,你应该意识到“可赋值的常量”这个说法的自相矛盾。Delphi的以往版本中的这一特性,只是为了与老的16位的编译器的兼容而保留,但现在对于Delphi的开发者来说已经毫无意义了。要养成好的编程习惯,尽量避免使用可赋值的常量。
      

  26.   

    呵呵,谢谢各位了,尤其要感谢zjqyb(),fengjn(小枫),lxpbuaa(桂枝香在故国晚秋),DWGZ()
    问最后一个问题,上边几位有在深圳的吗?有时间的话一起吃顿饭,踢踢球.
      

  27.   

    to lxpbuaa(桂枝香在故国晚秋)
    我们好像是校友啊,buaa.
      

  28.   

    ppzcgg(排排坐,吃果果) (▲):
    我是北航2000年毕业的,就读于机械工程及自动化学院(原7系)的飞行器制造专业,现在成都:》不过近期可能出差到深圳。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  29.   

    lxpbuaa(桂枝香在故国晚秋) 
    呵呵,大哥,我是3系的,自动控制系的,来深圳告诉我.我的mail: [email protected]