我有两个输入控件Edit1,DBLookupComboboxEh1
当单击DBLookupComboboxEh1时,如果Edit1没有值,则DBLookupComboboxEh1不显示下拉框(即撤销OnDropDown),焦点自动跳回到Edit1。这个要怎么实现?

解决方案 »

  1.   

    DBLookupComboboxEh1.Enabled:=false;
    屏蔽控件消息,你就别做梦了。
    除了重新写一个控件(在它的代码基础上)。
      

  2.   

    我找到一段代码,用捕获系统消息来屏蔽Tab键,另也有一段代码发送系统消息来使DBLookupComboboxEh1显示出下拉列表。
    我不会使用系统消息,但我认为用系统消息应该可以实现我的要求,请高手帮忙。贴出相关代码:
    用捕获系统消息来屏蔽Tab键
      type   
          TForm1   =   class(TForm)   
              Edit1:   TEdit;   
              Label1:   TLabel;   
              Memo1:   TMemo;   
              procedure   FormCreate(Sender:   TObject);   
              procedure   FormShortCut(var   Msg:   TWMKey;   var   Handled:   Boolean);   
          private   
              {   Private   declarations   }   
              procedure   DealTab(var   Msg:TMsg;var   Handled:Boolean);   
          public   
              {   Public   declarations   }   
          end;   
        
      var   
          Form1:   TForm1;   
        
      implementation   
        
      {$R   *.dfm}   
        
      procedure   TForm1.DealTab(Var   Msg:TMsg;var   Handled:Boolean);   
      begin   
            if   (Msg.wParam=VK_TAB)   and   (Msg.hwnd=Edit1.Handle)   then   
            begin   
                  showmessage('TAB键按下');   
                  Msg.wParam:=0;   
            end;   
      end;   
        
      procedure   TForm1.FormCreate(Sender:   TObject);   
      begin   
          Application.OnMessage:=DealTab;   
      end;   
        
      procedure   TForm1.FormShortCut(var   Msg:   TWMKey;   var   Handled:   Boolean);   
      begin   
            if   Msg.CharCode=VK_TAB   then   Msg.CharCode:=0;   //此处阻塞TAb键   
      end;   发送系统消息来使DBLookupComboboxEh1显示出下拉列表
    SendMessage(DBLookupComboboxEh1.Handle,WM_lbuttondown,MK_lbutton,0);
      

  3.   

    直接判断,即在DBLookupComboboxEh1的OnClick事件中写:
    if Length(Edit1.Text)=0 then
    begin
      Edit1.SetFocus;
    end
    else
    begin
      //这里写你需要的正常情况下的下拉事件
    end;
      

  4.   

    我没有DBLookupComboboxEh控件,只能用普通的ComboBox试验了,
    上面的思路试了下,发现在OnClick事件中不行,
    但是在OnDropdown事件中是可以的,楼主用DBLookupComboboxEh时如果也有OnDropDown事件,可以写在那里,如果没有,尽量找相似的事件,如果没有,那就不好办了。
      

  5.   

    DBLookupComboboxEh有OnDropDown事件,但是DBLookupComboboxEh失去焦点之后仍会显示下拉,ComboBox失去焦点就不能显示下拉了,但是我要下拉时显示多列,所能ComboBox控件不能满足要求。我想过在Edit1的OnEnter事件里,再调DBLookupComboboxEh的CloseUp事件,但是发现DBLookupComboboxEh的OnDropDown事件在Edit1的OnEnter事件之后才执行,真是很麻烦。我希望拦截OnDropDown的消息,把它撤销掉,但不会用系统消息。
      

  6.   

    依我看,让它弹吧,dropdown dropdown不是罪...
    让它dropdown后,发个ESC键,再把edit1 etfocus
    这是我的实战兵法
      

  7.   

    如果DBLookupComboboxEh单击后,不管焦点是否仍在本控件上都一定会显示下拉框,
    那有没有什么控件可在失去焦点后不显示下拉(像ComboBox一样),同时又能显示多列下拉(像DBLookupCombobox一样)。
      

  8.   

    还是改用wwDBLookupCombobox控件好了,谢谢大家。
      

  9.   

    ComboBox有DroppedDown属性,可以设置为False将下拉的项目收回去,
    DBLookupComboboxEh不知道有没有!
    如果有的话,你可以在Edit1.setfocus代码前先DBLookupComboboxEh.DroppedDown=False;应该就行了吧!
      

  10.   

    wwDBLookupCombobox能满足我的要求,问题算是解决了。
    我刚刚试过了DBLookupComboboxEh没有DroppedDown属性。