第一个问题:
  在一个窗体单元中,自定义一个函数,如何使函数中可以在控件的属性编辑器的事件栏可以控测到。
  如:我自定义一个函数,用来处理窗体上所有的TEdit的键盘事件,定义完后,我想选中窗体中所有的TEdit类控件,在属性编辑器中选择指定自定义的函数。
  请问这种类型的函数该如何定义,遵循什么规则,最好能说明原理。
第二个问题:
  关于as操作符,与强制类型转换,请给一个比较详细的说明,各自的用途用法。
  谢谢。

解决方案 »

  1.   

    跟双击事件处生成代码的参数一样就可以了,定义完之后,在formshow里加上Edit1.OnKeyPress = CustomFuction;(你自己定义的那个函数)
      

  2.   

    问题1、定义一个事件,全部参数都和自动生成的一样就可以了
    例如:tedit的事件,可以这样
        在private前面定义这样的过程,有个条件,必须放在private的前面,也就是说必须是发布属性的。
       这种过程都必须和原有的参数一样
    问题2、用途一样,只是语法不同,一个是var as type,一个是type(var),影响中好像(type)var也可以得。
      

  3.   

    感谢楼主,终于发现发布属性和公共属性的区别了,呵呵
    很多书都说没有区别,总感觉不可能,原来vcl类里面要想在ide界面里面使用,就必须放在发布属性里面。
    不过放在public里面(公共属性)在程序中动态赋值也可以使用,只是不能再ide界面里面选择。
      

  4.   

    你认为什么是实质呢?
    delphi驱动各个事件是靠参数来判断的,如果参数一样,就都可以作为一个使用。
    首先每一类事件都具备每一类事件的各种参数,这个是windows决定的,然后当确认需要某一个事件的时候,你只要把相同参数的事件写好,动态或者在设计同时静态选择就可以了。
      

  5.   

    第二个问题:
      关于as操作符,与强制类型转换,请给一个比较详细的说明,各自的用途用法。
    ------------------------------------------------------------------------
    As转换必须是兼容的类,比如从父类和子类之间的转换,一般在函数参数时用得较
    下面是一个例子:看一下解释大概就能明白了:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons;type
      TForm1 = class(TForm)
        BitBtn1: TBitBtn;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure BtnClick(Sender: TObject);//这个是自定义的事件处理函数
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.BtnClick(Sender: TObject);//则开始Sender为TOBject类
    begin
      if Sender is TButton then//如果Sender是TButton类,
      //用As强制转换为TButton,并将该按钮设为不可用
         (Sender as TButton).Enabled:=False  else
      //否则用As强制转换为TBitBtn,并将该按钮设为不可用
         (Sender as TBitBtn).Enabled:=False
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     //窗体创建事件中,指Button1和BitBtn的Onclick事件指针指向BtnClick过程。
      Button1.OnClick:=BtnClick;
      BitBtn1.OnClick:=BtnClick;
    end;end.
    程序运行后,点BitBtn,则BitBtn不可用
    点Button,则Button不可用。
    大概明白了吧。
      

  6.   

    转贴: linzhengqun(风)第二个问题:
      关于as操作符,与强制类型转换,请给一个比较详细的说明,各自的用途用法。
    ------------------------------------------------------------------------
    As转换必须是兼容的类,比如从父类和子类之间的转换,一般在函数参数时用得较
    下面是一个例子:看一下解释大概就能明白了:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons;type
      TForm1 = class(TForm)
        BitBtn1: TBitBtn;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure BtnClick(Sender: TObject);//这个是自定义的事件处理函数
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.BtnClick(Sender: TObject);//则开始Sender为TOBject类
    begin
      if Sender is TButton then//如果Sender是TButton类,
      //用As强制转换为TButton,并将该按钮设为不可用
         (Sender as TButton).Enabled:=False  else
      //否则用As强制转换为TBitBtn,并将该按钮设为不可用
         (Sender as TBitBtn).Enabled:=False
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     //窗体创建事件中,指Button1和BitBtn的Onclick事件指针指向BtnClick过程。
      Button1.OnClick:=BtnClick;
      BitBtn1.OnClick:=BtnClick;
    end;end.
    程序运行后,点BitBtn,则BitBtn不可用
    点Button,则Button不可用。
    大概明白了吧。
      

  7.   

    偶不是高手,说一下as:
    as是将一个对象转换为它的父类的类型。例如:
    Sender: TObject;
    ...
    (Sender as TButton).Enabled := False;但如果Sender对象的类不是TButton或者不是从TButton继承的,则上面的语句
    将引发Exception。
    也就是说as会动态检查对象的类型是否匹配。所以如果你不希望弄出异常来,最好这样写:if Sender is TButton then
        TButton(Sender).Enabled := False;注意第二行没用as,这是因为第一行已经用is测试过Sender是否为一个TButton。
    强制转换是不需代价的,但as是有代价的。不知说清楚了没有?