【发布时间】:2014-11-15 11:23:58
【问题描述】:
继续这个话题:
我已经用 any TControl 为 DropDown memu 编写了一个通用代码,但由于某种原因,它在 TPanel 上无法正常工作:
var
TickCountMenuClosed: Cardinal = 0;
LastPopupControl: TControl;
type
TDropDownMenuHandler = class
public
class procedure MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
end;
TControlAccess = class(TControl);
class procedure TDropDownMenuHandler.MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if LastPopupControl <> Sender then Exit;
if (Button = mbLeft) and not ((TickCountMenuClosed + 100) < GetTickCount) then
begin
if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
ReleaseCapture;
// SetCapture(0);
if Sender is TGraphicControl then Abort;
end;
end;
procedure RegisterControlDropMenu(Control: TControl; PopupMenu: TPopupMenu);
begin
TControlAccess(Control).OnMouseDown := TDropDownMenuHandler.MouseDown;
end;
procedure DropMenuDown(Control: TControl; PopupMenu: TPopupMenu);
var
APoint: TPoint;
begin
LastPopupControl := Control;
RegisterControlDropMenu(Control, PopupMenu);
APoint := Control.ClientToScreen(Point(0, Control.ClientHeight));
PopupMenu.PopupComponent := Control;
PopupMenu.Popup(APoint.X, APoint.Y);
TickCountMenuClosed := GetTickCount;
end;
据我所知,这适用于TButton 和TSpeedButton 以及任何TGraphicControl(如TImage 或TSpeedButton 等)。
但是TPanel 无法按预期工作
procedure TForm1.Button1Click(Sender: TObject);
begin
DropMenuDown(Sender as TControl, PopupMenu1);
end;
procedure TForm1.Panel1Click(Sender: TObject);
begin
DropMenuDown(Sender as TControl, PopupMenu1); // Does not work!
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
DropMenuDown(Sender as TControl, PopupMenu1);
end;
procedure TForm1.Image1Click(Sender: TObject);
begin
DropMenuDown(Sender as TControl, PopupMenu1);
end;
似乎TPanel 不尊重ReleaseCapture;,甚至在TDropDownMenuHandler.MouseDown 事件中也不尊重Abort。我可以做些什么来使这个工作与TPanel 和其他控件一起工作?我错过了什么?
【问题讨论】:
-
@TLama
class procedure一直是语言的一部分 -
这可能与 TButtomControl 直接派生自 TWinControl 而 TCustomPanel 派生自 TCustomControl 而派生自 TWinControl 的事实有关。因此,TCustomControl 可能会阻止您的某些代码正确执行。我建议您检查继承树中是否有其他不起作用的控件,看看它们是否也派生自 TCustomControl。
标签: delphi drop-down-menu delphi-7