gpt4 book ai didi

delphi - 如何在 Delphi 中为 TPanel(如 TCombo)设置 'close on external click'

转载 作者:行者123 更新时间:2023-12-03 15:21:15 26 4
gpt4 key购买 nike

我想模仿 TComBo 列表功能,当用户单击列表“外部”时关闭该功能,但对于另一个组件(TPanel)。在德尔福XE2中。有什么想法吗?

最佳答案

假设您的面板已聚焦(正如我从您的问题中“读到”的那样),然后响应发送到所有聚焦窗口的CM_CANCELMODE消息。

type
TPanel = class(Vcl.ExtCtrls.TPanel)
private
procedure CMCancelMode(var Message: TCMCancelMode); message CM_CANCELMODE;
end;

...

{ TPanel }

procedure TPanel.CMCancelMode(var Message: TCMCancelMode);
begin
inherited;
if Message.Sender <> Self then
Hide;
end;
<小时/>

当面板本身没有聚焦时,例如如果是子控件,那么这将不起作用。在这种情况下,您可以跟踪所有鼠标单击(例如,通过使用 TApplicationEvents.OnMessage 处理程序)并计算单击是否在面板的范围内:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if Panel1.Visible and
(Msg.message >= WM_LBUTTONDOWN) and (Msg.message <= WM_MBUTTONDBLCLK) and
not PtInRect(Panel1.ClientRect, Panel1.ScreenToClient(Msg.pt)) then
Panel1.Hide;
end;

但是,例如,当单击属于面板但部分展开在面板外部的组合框列表中时,这仍然不会成功。我不知道如何从点击信息中提取面板。

关于delphi - 如何在 Delphi 中为 TPanel(如 TCombo)设置 'close on external click',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12499649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com