我有两个输入控件Edit1,DBLookupComboboxEh1
当单击DBLookupComboboxEh1时,如果Edit1没有值,则DBLookupComboboxEh1不显示下拉框(即撤销OnDropDown),焦点自动跳回到Edit1。这个要怎么实现?
当单击DBLookupComboboxEh1时,如果Edit1没有值,则DBLookupComboboxEh1不显示下拉框(即撤销OnDropDown),焦点自动跳回到Edit1。这个要怎么实现?
屏蔽控件消息,你就别做梦了。
除了重新写一个控件(在它的代码基础上)。
我不会使用系统消息,但我认为用系统消息应该可以实现我的要求,请高手帮忙。贴出相关代码:
用捕获系统消息来屏蔽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);
if Length(Edit1.Text)=0 then
begin
Edit1.SetFocus;
end
else
begin
//这里写你需要的正常情况下的下拉事件
end;
上面的思路试了下,发现在OnClick事件中不行,
但是在OnDropdown事件中是可以的,楼主用DBLookupComboboxEh时如果也有OnDropDown事件,可以写在那里,如果没有,尽量找相似的事件,如果没有,那就不好办了。
让它dropdown后,发个ESC键,再把edit1 etfocus
这是我的实战兵法
那有没有什么控件可在失去焦点后不显示下拉(像ComboBox一样),同时又能显示多列下拉(像DBLookupCombobox一样)。
DBLookupComboboxEh不知道有没有!
如果有的话,你可以在Edit1.setfocus代码前先DBLookupComboboxEh.DroppedDown=False;应该就行了吧!
我刚刚试过了DBLookupComboboxEh没有DroppedDown属性。