AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal Einfach das Popup Menü schließen
Thema durchsuchen
Ansicht
Themen-Optionen

Einfach das Popup Menü schließen

Ein Thema von Ginko · begonnen am 27. Apr 2013 · letzter Beitrag vom 2. Mai 2013
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#1

AW: Einfach das Popup Menü schließen

  Alt 27. Apr 2013, 21:34
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Einfach das Popup Menü schließen

  Alt 27. Apr 2013, 21:40
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!

Geändert von Ginko (27. Apr 2013 um 21:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#3

AW: Einfach das Popup Menü schließen

  Alt 28. Apr 2013, 00:00
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#4

AW: Einfach das Popup Menü schließen

  Alt 28. Apr 2013, 00:04
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Einfach das Popup Menü schließen

  Alt 28. Apr 2013, 10:29
Ja das funktioniert prima unter Delphi, allerdings hat Lazarus keinen Typ TPopupList.

(Aus der Delphi Hilfe: TPopupList verwaltet das Fenster, in dem die Meldungen von Popup-Menüs angezeigt werden).

Etwas vergleichbares konnte ich bis jetzt auch nicht finden. Es gibt aber bei den Eigenschaften der Formulare, wo man u.a. das Popup Menü zuordnet, einen Punkt der PopupParent heißt, allerdings konnte ich noch keinen Wert finden den er hier annimmt.

Geändert von Ginko (28. Apr 2013 um 13:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#6

AW: Einfach das Popup Menü schließen

  Alt 28. Apr 2013, 10:33
Dann scheint Lazarus noch eine andere Implementation zu haben. Leider kenne ich mich damit überhaupt nicht aus.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#7

AW: Einfach das Popup Menü schließen

  Alt 28. Apr 2013, 10:41
(Aus der Delphie Hilfe: TPopupList verwaltet das Fenster, in dem die Meldungen von Popup-Menüs angezeigt werden).
Die Deutsche Übersetzung ist etwas missverständlich. In dem Englischen Original wird das deutlicher:

Zitat:
TPopupList manages the window that handles popup menu messages.
TPopupList is the type of the global PopupList variable, which provides centralized message handling for all popup menus in an application.
Gemeint ist damit, daß die Windows-Messages für das geöffnete Popupmenu zentral von TPopupList bearbeitet werden. Im Fall des Standard-Menüs wird aber das Window-Handle des Controls verwendet, das zum Popup geführt hat. Daher kommen in meiner ersten Antwort alle Messages auch beim TMemo an. Bei einem VCL-Popupmenu behandelt TPopupList diese Messages und alles was es nicht kennt wird ignoriert. Aus diesem Grund funktioniert die abgeleitete Klasse, die die Standard PopupList ersetzt.

Keine Ahnung, wie Lazarus das macht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Ginko

Registriert seit: 30. Aug 2008
208 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Einfach das Popup Menü schließen

  Alt 28. Apr 2013, 11:01
Trotzdem danke. Vielleicht weiß es ja hier noch jemand.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#9

AW: Einfach das Popup Menü schließen

  Alt 2. Mai 2013, 07:13
Delphi-Quellcode:
procedure TMyPopupList.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_MBUTTONDOWN then begin
    EndMenu;
    Exit;
  end;
  inherited;
end;
Wäre das so unter Verzicht auf Exit nicht lesbarer?
Delphi-Quellcode:
procedure TMyPopupList.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_MBUTTONDOWN then
    EndMenu
  else
    inherited;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#10

AW: Einfach das Popup Menü schließen

  Alt 2. Mai 2013, 08:26
Delphi-Quellcode:
procedure TMyPopupList.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_MBUTTONDOWN then begin
    EndMenu;
    Exit;
  end;
  inherited;
end;
Wäre das so unter Verzicht auf Exit nicht lesbarer?
Delphi-Quellcode:
procedure TMyPopupList.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_MBUTTONDOWN then
    EndMenu
  else
    inherited;
end;
Das ist Geschmackssache und in diesem Fall ist sicher beides akzeptabel.

Bei komplexeren Fällen mit einer Vielzahl an Abfragen finde ich meinen Ansatz etwas übersichtlicher und leichter wartbar (z.B. beim Einfügen, Löschen oder Umsortieren einzelner Fälle).

Der IF-EXIT Ansatz hat gegenüber dem IF-ELSE Ansatz allerdings den Vorteil, daß nicht bei jedem IF ein EXIT folgen muss und in dem Fall die folgenden Abfragen noch ausgeführt werden. Bei einer IF-ELSE Struktur ist das nur schwer und unübersichtlich realisierbar.

Übrigens: Ich halte EXIT, BREAK und CONTINUE ebenso wie Exceptions für sehr brauchbare Sprachkonstrukte zur Steuerung des Programmflusses. Aber das gehört alles eigentlich gar nicht in diesen Thread
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:07 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