我现在有一个窗体类派生了很多窗体,现在我想加入一个判断,如果Enter不可用,则对其发送Edit.SetFocus事件时不响应。是否要捕获OnEnter事件?此事在消息中是WM_ENTER????要如何写????谢谢大家

解决方案 »

  1.   

    将EDIT的Enabled属性设为False不就得了??或者是他的OnKeyDown事件中将Key的值设为0,取消用户输入就行了啊。
      

  2.   

    WM_SETFOCUS消息,获得焦点type
      tde=class(TEdit)
      protected
      procedure wndproc(var message:Tmessage);override;
    end;procedure tde.wndproc(var message:tmessage);
    begin
      if message.msg=wm_setfocus then
      begin
        showmessage('no focus');
        exit;
      end;
      inherited wndproc(message);
    end;procedure TForm1.BitBtn7Click(Sender: TObject);
    var
      e:tde;
    begin
      e:=tde.Create(form1);
      e.Top:=10;
      e.Left:=10;
      e.Parent:=form1;
      e.Show;
    end;
      

  3.   

    哦。那我程序中怎么捕捉它呢?可不可以给一些代码??如果Enabled为False捕捉到事件后,如何让它不执行此事件呢?
      

  4.   

    啊?如果这么写的话,不是每个Edit控件都要写一个这个过程了?
      

  5.   

    啊?如果这么写的话,不是每个Edit控件都要写一个这个过程了?
    不用,你可以在onenter中选这个过程。
      

  6.   

    可能大家还没有明白我要做什么。就是窗体上很多控件,有的时侯有语句edtName.SetFocus等语句,但此时edtName不可能。我想抓住窗体上发送的这个SetFocus事件,判断要获得焦点的控件是否可用,如果不可用则不执行此消息。注:窗体上很多控件,不想一个一个的判断,并且如果以后要加入什么新的控件不可必考虑这个问题。
      

  7.   

    if edtName.canFocus then edtName.setfocus ; ???
      

  8.   

    你可以把你所有的edit放到一个list中,那么只要写一个函数对list中的成员进行操作即可。
    for i:=0 to list.count-1 do
    begin
        if not list[i].enabled then continue;
        //////
    end;
      

  9.   

    to 960379(文物) :呵呵。我现在就是想知道把这个语句放在哪???放在每个Edit的OnEnter事件中??怎么触发这个事件??并且我的窗体上不只有TEdit
      

  10.   

    如果要对所有的控件可用,那么把它们当作object加入list好了。
    这个函数的加入位置,可以考虑放到form的mousedown消息(处理通过鼠标来setfocus)和keydown消息(处理通过tab键来setfocus)中。
    我没试过,只是想想,你可以自己试试。
      

  11.   

    不能实现吧。现在我没有试,觉得思路不大对。因为现在我已经向一个Control发送了SetFocus事件,但这个Control的Enabled为False。我怎么才能将这个SetFocus事件取消???现窗体上控件很多,并且是基类窗体,又用它派生了很多子窗体,所以如果在每个SetFocus前都加上它会很麻烦。还请大家帮帮忙,研究一下。而且我也想知道这个要怎么实现。如果真的不行还是用最原始的方法~~~~
      

  12.   

    edtName.SetFocus 这个语句你在哪里放呢,判断语句就在哪里啊
      

  13.   

    呵呵。看来hr168(Ocb.Hr)老兄还是没有理解我的意思。
    我现在不想写
    if edtName.Enabled then
      edtName.SetFocus
    因为窗体已经做好,并派生了许多的子类。改起来太麻烦。只想在基类中加一个函数或捕获这个SetFocus(WM_SETFOCUS)消息,让它不执行下去。
      

  14.   

    那么在每个edit.enabled:=false;语句后加上edit.canfocus:=edit.enabled;
      

  15.   

    to zzjzhao(风云) :
    你不要光看这个。主要是有的问题我问完了也没有人回答。不知道是不是问题太简单了。我没办法结贴
      

  16.   

    在基类的protected加这个:
    procedure WMSetFocus(var Message: TWMSetFocus); message WM_SetFOCUS;
    在你认为不执行的时候abort就可以了,但比较严厉。
      

  17.   

    ????????怎么试某一个控件的Enabled是否可用呢???
    procedure TFrmRecTemplet.WMSetFocus(var Message: TWMSetFocus); message WM_SetFOCUS;
    begin
      if ... then  //怎么当前是哪个控件发送的WM_SETFOCUS事件???通过Message的FocusedWnd属  
                   //性吗???怎么才能通过FocusedWnd找到相应控件呢?
        abort;
    end;
      

  18.   

    是FindControl(Message.FocusedWnd)?????