AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[Gelöst] Testen ob Popupmenu gerade angezeigt wird?

Ein Thema von Namenloser · begonnen am 15. Apr 2011 · letzter Beitrag vom 15. Apr 2011
Antwort Antwort
Seite 2 von 3     12 3      
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#11

AW: Testen ob Popupmenu gerade angezeigt wird?

  Alt 15. Apr 2011, 21:00
oder mach' ich da jetzt einen Denkfehler ?
Ja, siehe Post #5 von himitsu.
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#12

AW: Testen ob Popupmenu gerade angezeigt wird?

  Alt 15. Apr 2011, 21:10
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.?
Angehängte Dateien
Dateityp: rar Popup.rar (166,6 KB, 1x aufgerufen)
Markus H.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#13

AW: Testen ob Popupmenu gerade angezeigt wird?

  Alt 15. Apr 2011, 21:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#14

AW: Testen ob Popupmenu gerade angezeigt wird?

  Alt 15. Apr 2011, 22:08
Du könntest über GetTickCount den Unterschied zwieschen den Aktionen bestimmen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#15

AW: Testen ob Popupmenu gerade angezeigt wird?

  Alt 15. Apr 2011, 22:28
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 . . .
Angehängte Dateien
Dateityp: rar Popup2.rar (166,7 KB, 2x aufgerufen)
Markus H.
  Mit Zitat antworten Zitat
blauweiss

Registriert seit: 19. Jun 2007
142 Beiträge
 
#16

AW: Testen ob Popupmenu gerade angezeigt wird?

  Alt 15. Apr 2011, 22:51
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#17

AW: Testen ob Popupmenu gerade angezeigt wird?

  Alt 15. Apr 2011, 22:56
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:
    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;
Da wo ich mein CreatePopupMenu erstelle kann ich den Status auch abfragen oder?

gruss
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#18

AW: Testen ob Popupmenu gerade angezeigt wird?

  Alt 15. Apr 2011, 22:57
Das war zunächst auch mein Plan, nur leider funktioniert das nicht, weil (auch mit OnIdle) popupshown := false; immer vor dem MouseDown/MouseUp/Click-Event ausgeführt wird

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]

Geändert von Namenloser (15. Apr 2011 um 23:04 Uhr)
  Mit Zitat antworten Zitat
blauweiss

Registriert seit: 19. Jun 2007
142 Beiträge
 
#19

AW: Testen ob Popupmenu gerade angezeigt wird?

  Alt 15. Apr 2011, 23:12
Das war zunächst auch mein Plan, nur leider funktioniert das nicht, weil (auch mit OnIdle) popupshown := false; immer vor dem MouseDown/MouseUp/Click-Event ausgeführt wird
Ok, schade, dann hilft es Dir wohl nicht.
Bin gerade in Delphi5, da ist es nicht wie in Deinem (Turbo)Delphi
-> MouseDown (auf Panel oder ListBox) wird vor OnIdle aufgerufen...!

Gruß,
blauweiss
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#20

AW: Testen ob Popupmenu gerade angezeigt wird?

  Alt 15. Apr 2011, 23:24
Tatsache: MouseDown wird vorher aufgerufen, aber MouseUp später. Macht ja eigentlich auch Sinn.

Hab’s jetzt so gelöst:

Delphi-Quellcode:
  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;
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.

So funktioniert es jedenfalls erstmal.

Danke euch allen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz