![]() |
Einfach das Popup Menü schließen
Also beim Versuch das Popup Menü mit der mittleren Maustaste zu schließen komme ich nicht weiter.
Es soll ein Popup Menü, welches in einem Memo geöffnet wurde durch den Klick der mittleren Maustaste geschlossen werden. Eben genauso wie wenn ich mit der linken Maustaste neben das Menü klicke. Mit dieser Lösung klappt es nicht ![]()
Delphi-Quellcode:
Durch das Popup geht ja der Fokus verloren. Deshalb wird das Ereignis gar nicht mehr aufgerufen.
procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin if Button = mbMiddle then mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); end; Aber wenn ich das ganze im Form1 Ereignis mache klappt es auch nicht. Das Popup Menü hat ja kein MouseDown Ereignis. Diese Lösung ![]() will er bei MakeObjectInstance(PopupListWndProc); immer noch eine Message als Argument bei PopupListWndProc. |
AW: Einfach das Popup Menü schließen
Ich habe eine Lösung gebastelt, welche mir aber sehr umständlich erscheint.
Dabei wird die Tastatur Global abgefragt, unabhängig vom Memo oder dem Formular.
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus, StdCtrls, ExtCtrls, Windows; type { TForm1 } TForm1 = class(TForm) Memo1: TMemo; MenuItem1: TMenuItem; MenuItem2: TMenuItem; MenuItem3: TMenuItem; PopupMenu1: TPopupMenu; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure keytimer(WND: Hwnd; uMsg: DWord; IdEvent: DWord; dwTimer: DWord); stdcall; Far; begin if Form1.Active then begin if getasynckeystate (VK_MBUTTON) <> 0 then begin mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); end; end; end; procedure TForm1.FormCreate(Sender: TObject); Var TimerHandle: THandle; Begin TimerHandle := SetTimer(0, 0, 100, @keytimer); end; procedure TForm1.FormDestroy(Sender: TObject); Var TimerHandle: THandle; begin KillTimer(0, TimerHandle); end; end. |
AW: Einfach das Popup Menü schließen
Warum so kompliziert?
Delphi-Quellcode:
procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin if Button = mbMiddle then EndMenu; end; |
AW: Einfach das Popup Menü schließen
Zitat:
|
AW: Einfach das Popup Menü schließen
Danke für die Antworten.
Ja dachte mir schon das da was faul ist, danke für den Hinweis Helmi. Zitat:
|
AW: Einfach das Popup Menü schließen
Der Befehl EndMenu; funktioniert zwar einwandfrei über einen Timer. Aber sobald das Popup Menü offen ist spricht die mittlere Maustaste nur noch auf globale Tastaturabfragen an.
Hier mal ein Beispiel:
Delphi-Quellcode:
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus, ExtCtrls, StdCtrls, Windows; . . . var Form1: TForm1; z1: Integer = 0; implementation {$R *.lfm} { TForm1 } procedure TForm1.Timer1Timer(Sender: TObject); begin EndMenu; Inc(z1); Label1.Caption:= IntToStr(z1); end; procedure TForm1.MenuItem3Click(Sender: TObject); begin ShowMessage('Test 3'); end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbMiddle then ShowMessage('Reagiert nicht wenn Popup offen ist'); end; procedure TForm1.PopupMenu1Popup(Sender: TObject); begin Timer1.Enabled:= True; //Timer wird nach öffnen von Menü gestartet und beendet es nach entsprechender Zeit end; |
AW: Einfach das Popup Menü schließen
Ich hatte das unter Delphi XE2 und Windows 7 getestet: Neue VCL-Forms-Anwendung, Memo drauf, MouseDown-Event wie gezeigt. Starten, rechte Maustaste auf Memo, Popup-Menü kommt, mittlere Maustaste auf Popupmenü - funktioniert.
|
AW: Einfach das Popup Menü schließen
Hi hab es auch nochmal gerade so getestet unter Lazarus, es funktioniert wirklich. ABER nur mit dem Orginal Popup Menü von Windwos. Sobald ich ein eigenes verwende, tritt der oben beschriebene Fehler auf. Hast du es mit dem Orginal getestet ? Danke für die Mühe!
|
AW: Einfach das Popup Menü schließen
Ja, ich hatte das Standardmenü genommen. Mit einem eigenen Popupmenü geht es in Delphi auch nicht. Liegt wohl daran, daß das Standardmenü mit dem Handle des Controls arbeitet, während die VCL-Popupmenüs ein anderes Window-Handle verwenden.
|
AW: Einfach das Popup Menü schließen
Der folgende Code in einer passenden Unit sollte das aber beheben. Das funktioniert dann allerdings mit allen Popupmenüs und man braucht den Event i Memo nicht mehr.
Delphi-Quellcode:
type
TMyPopupList = class(TPopupList) protected procedure WndProc(var Message: TMessage); override; end; procedure TMyPopupList.WndProc(var Message: TMessage); begin if Message.Msg = WM_MBUTTONDOWN then begin EndMenu; Exit; end; inherited; end; initialization PopupList.Free; PopupList := TMyPopupList.Create; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz