![]() |
AW: Testen ob Popupmenu gerade angezeigt wird?
Zitat:
|
AW: Testen ob Popupmenu gerade angezeigt wird?
Liste der Anhänge anzeigen (Anzahl: 1)
So hab ich aber immer noch den Status (Variable Pop), ob das Popup-Menü vor dem
Klick auf das Control (hier Panel) geöffnet wurde, egal, ob ich zwischenzeitlich per ESC oder Klick auf z.B. den Desktop das Popup-Menü schließe.? |
AW: Testen ob Popupmenu gerade angezeigt wird?
Danke für dein Beispiel, aber wenn man einen Rechtsklick auf Panel1 macht, dann einen Linksklick auf das Formular und anschließend einen Linksklick auf Panel1, kommt die Meldung „Popup“. Und genau das soll sie in dem Fall eben nicht – das ist es, was ich meine.
Sie soll nur dann erscheinen, wenn unmittelbar vor dem Klick das Popupmenü geöffnet war. |
AW: Testen ob Popupmenu gerade angezeigt wird?
Du könntest über GetTickCount den Unterschied zwieschen den Aktionen bestimmen.
|
AW: Testen ob Popupmenu gerade angezeigt wird?
Liste der Anhänge anzeigen (Anzahl: 1)
O.K., hab die Form jetzt noch in die Abfrage mit eingebunden,
wenn allerdings noch weitere Objekte hinzukommen, die nicht zu den selektierten gehören (Buttons . . .) - und davon gehe ich mal aus - wird diese Art der Abfrage nicht sonderlich glücklich enden. . . . ich denk' noch mal drüber nach . . . |
AW: Testen ob Popupmenu gerade angezeigt wird?
Hallo Philip,
meiner Meinung nach ist der Vorschlag von Stahli / Marabu / Jens Schumann doch irgendwie der einfachere Weg ?! Setze ich übrigens auch so ein, also in der Art:
Delphi-Quellcode:
procedure TfMyForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin popupshown := false; end; procedure TfMyForm.PopUpMenuPopup(Sender: TObject); begin popupshown := true; end; Im MouseDown Deiner Fläche dann einfach noch
Delphi-Quellcode:
if popupshown then
exit; Gruß, blauweiss |
AW: Testen ob Popupmenu gerade angezeigt wird?
Hmm ...
Weis nicht ob ich jetzt falsch liege. Aber ich kann jederzeit feststellen ob mein Popupmenu geöffnet ist oder war. Muss dazu nur ne globale Variable anlegen mit der man gegenprüfen kann. Allerdings nonvcl.
Delphi-Quellcode:
Da wo ich mein CreatePopupMenu erstelle kann ich den Status auch abfragen oder?
WM_NCRBUTTONDOWN:
begin hPopupMenu := CreatePopupMenu; // Bitmap Popupmenu hSubSkinMenu := CreatePopupMenu; // Bitmap SkinSubmenu if hPopupMenu <> 0 then begin AppendMenu(hPopupMenu, MF_OWNERDRAW, IDM_ABOUT, ''); AppendMenu(hPopupMenu, {MF_OWNERDRAW or} MF_SEPARATOR, IDM_Seperator, ''); AppendMenu(hPopupMenu, MF_OWNERDRAW or MF_POPUP, hSubSkinMenu, 'Skins'); MnuSkins := nil; Files := nil; FindAllFiles(ExtractFilePath(ParamStr(0)) + 'Skins', '.ske', True); SetLength(MnuSkins, length(Files)); for IntI := 0 to length(Files) - 1 do AppendMenu(hSubSkinMenu, MF_OWNERDRAW, IDM_SKINS + IntI, ''); AppendMenu(hPopupMenu, {MF_OWNERDRAW or} MF_SEPARATOR, IDM_Seperator, ''); AppendMenu(hPopupMenu, MF_OWNERDRAW, IDM_Close, ''); GetCursorPos(p); MenuWahl := TrackPopupMenuEx(hPopupMenu, TPM_RETURNCMD, p.X, p.Y, WinHandle, nil); DestroyMenu(hPopupMenu); if MenuWahl then SendMessage(WinHandle, WM_COMMAND, Makelong(Word(MenuWahl), 0), 0); end; end; gruss |
AW: Testen ob Popupmenu gerade angezeigt wird?
Das war zunächst auch mein Plan, nur leider funktioniert das nicht, weil (auch mit OnIdle)
Delphi-Quellcode:
immer vor dem MouseDown/MouseUp/Click-Event ausgeführt wird :(
popupshown := false;
Bin gerade etwas ratlos... es muss doch irgendeine bessere Lösung als ein Timeout (GetTickCount) geben :| @EWeiss: Schau ich mir gleich mal an. [edit] Ok, meine WinAPI-Kenntnisse sind zu begrenzt, um zu beurteilen, ob mir dein Code weiterhilft. Herauszufinden, wann das Popup zerstört wird, ist inzwischen aber nicht mehr das Problem. Das Problem ist vielmehr herauszufinden, ob ein MouseDown/MouseUp/Click-Event eine Folge der Zerstörung des Popups ist. [/edit] |
AW: Testen ob Popupmenu gerade angezeigt wird?
Zitat:
Bin gerade in Delphi5, da ist es nicht wie in Deinem (Turbo)Delphi -> MouseDown (auf Panel oder ListBox) wird vor OnIdle aufgerufen...! Gruß, blauweiss |
AW: Testen ob Popupmenu gerade angezeigt wird?
Tatsache: MouseDown wird vorher aufgerufen, aber MouseUp später. Macht ja eigentlich auch Sinn.
Hab’s jetzt so gelöst:
Delphi-Quellcode:
Vielleicht sollte man noch eine Kontrolle einführen, ob MouseDown und MouseUp sich auf den gleichen MouseButton beziehen, aber vielleicht ist das auch schon wieder Overkill.
TfrmMain = class(TForm)
{…} private FPopupActive, FPreventMouseUp: Boolean; procedure EnterMenuLoop(var Msg); message CM_ENTERMENULOOP; public {…} end; procedure TfrmMain.EnterMenuLoop(var Msg); begin FPopupActive := True; end; procedure TfrmMain.ApplicationEventsIdle(Sender: TObject; var Done: Boolean); begin FPopupActive := false; end; procedure TfrmMain.PaintBoxMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if FPopupActive then begin FPreventMouseUp := True; exit; end; {…} end; procedure TfrmMain.PaintBoxMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if FPreventMouseUp then begin FPreventMouseUp := False; exit; end; {…} end; So funktioniert es jedenfalls erstmal. Danke euch allen :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 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