AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign TPopupMenu Popup überschreiben / DoPopup wird nie aufgerufen
Thema durchsuchen
Ansicht
Themen-Optionen

TPopupMenu Popup überschreiben / DoPopup wird nie aufgerufen

Ein Thema von Glados · begonnen am 19. Okt 2017 · letzter Beitrag vom 21. Okt 2017
Antwort Antwort
Seite 1 von 2  1 2      
Glados
(Gast)

n/a Beiträge
 
#1

TPopupMenu Popup überschreiben / DoPopup wird nie aufgerufen

  Alt 19. Okt 2017, 19:35
Ich habe mir mit Hilfe des Forums und Google folgende Klasse gebaut. Somit bin ich in der Lage herauszufinden, wann ein PopupMenu sichtbar ist und wann nicht

Delphi-Quellcode:
unit Utils.PopupListEx;

interface

uses Vcl.Menus, Winapi.Messages, System.Classes;

type
 TPopupListEx = class(TPopupList)
 private
  procedure WndProc(var Message: TMessage); override;
 public
  PopupMenu: TPopupMenu;
  MenuLoop: Boolean;
 end;

type
 TPopupMenu = class(Vcl.Menus.TPopupMenu)
 private
 public
  // procedure Popup(X, Y: Integer); override;
  procedure DoPopup(Sender: TObject); override;
 end;

implementation

procedure TPopupListEx.WndProc(var Message: TMessage);
begin
 case Message.Msg of
  WM_ENTERMENULOOP:
   begin
    MenuLoop := True; // Menu sichtbar
   end;
  WM_EXITMENULOOP:
   begin
    MenuLoop := False; // Menu nicht mehr sichtbar
    TPopupListEx(PopupList).PopupMenu := nil;
   end;
 end;

 inherited WndProc(Message);
end;

{*
procedure TPopupMenu.Popup(X, Y: Integer);
begin
// TPopupListEx(PopupList).PopupMenu := Sender as TPopupMenu; // wie komme ich hier an den Sender?

inherited;
end;
*}


procedure TPopupMenu.DoPopup(Sender: TObject);
begin
 TPopupListEx(PopupList).PopupMenu := Sender as TPopupMenu;

 inherited;
end;

end.
In jedes PopupMenuXPopup-Even müsste ich händisch eigentlich TPopupListEx(PopupList).PopupMenu := Sender as TPopupMenu; schreiben.
Da man das aber schnell vergessen kann, möchte ich das gerne automatisiert erledigen und das Popup-Event überschreiben.

Nur wie komme ich an den Sender?

Edit ich weiß nicht, ob ich das richtig gelößt habe. Aber statt Popup() überschreibe ich jetzt DoPopup(Sender: TObject);. Dann habe ich den Sender.

Jetzt bekomme ich nur die Meldung
Zitat:
[dcc32 Hinweis] Utils.PopupListEx.pas(10): H2269 Durch das Überschreiben erhält die virtuelle Methode 'TPopupListEx.WndProc' eine geringere Sichtbarkeit (private) als die Basisklasse 'TPopupList' (protected)
Wie bekomme ich diese Meldung denn korrekt weg?

Geändert von Glados (19. Okt 2017 um 21:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TPopupMenu Popup überschreiben

  Alt 19. Okt 2017, 20:31
Du musst die genannte Methode in einer protected-Sektion deklarieren:

Delphi-Quellcode:
 TPopupListEx = class(TPopupList)
  private
  protected
   procedure WndProc(var Message: TMessage); override;
  public
   PopupMenu: TPopupMenu;
   MenuLoop: Boolean;
  end;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#3

AW: TPopupMenu Popup überschreiben

  Alt 19. Okt 2017, 20:44
Edit: Problem nicht gelößt!

Danke.

Bei der Gelegenheit habe ich daraus eine Interposer-Klasse gemacht. Ich mag solche "Ex"-Anhängsel an Namen nicht:

Delphi-Quellcode:
type
 TPopupList = class(Vcl.Menus.TPopupList)
Und in der dpr-Datei
Delphi-Quellcode:
Vcl.Menus.PopupList.Free;
Vcl.Menus.PopupList := TPopupList.Create;
TPopupList(PopupList).PopupMenu := nil;
UND bei der Gelegenheit merke ich, dass DoPopup gar nicht funktioniert!
Ich weiß nicht genau warum, aber DoUpdate wird nie aufgerufen.

Geändert von Glados (19. Okt 2017 um 23:39 Uhr)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#4

AW: TPopupMenu Popup überschreiben / DoPopup wird nie aufgerufen

  Alt 20. Okt 2017, 08:00
Weiß niemand warum?
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TPopupMenu Popup überschreiben / DoPopup wird nie aufgerufen

  Alt 20. Okt 2017, 09:09
Weiß niemand warum?
eventuell solltest Du die geerbte WndProc in Deiner Ableitung aufrufen?
Fritz Westermann
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#6

AW: TPopupMenu Popup überschreiben / DoPopup wird nie aufgerufen

  Alt 20. Okt 2017, 10:55
Ich lerne gerade erst was Ableiten überhaupt bedeutet.

Das Problem ist, dass DoPopup grundsätzlich nicht aufgerufen wird, obwohl ich das Event doch überschrieben habe (Interposer-Klasse).

Ich möchte mit DoPopup das aktuell sichtbare Popupmenu in TPopupListEx(PopupList).PopupMenu speichern.
In WndProc > WM_EXITMENULOOP wird es dânn auf nil gesetzt.

Ich würde ja zum Setzen des aktuell sichtbaren Menus WM_ENTERMENULOOP nutzen aber ich brauche den Sender und den habe ich in WndProc nicht.

Delphi-Quellcode:
type
 TPopupMenu = class(Vcl.Menus.TPopupMenu)
 private
 protected
  procedure DoPopup(Sender: TObject); override;
 public
 end;

implementation

procedure TPopupMenu.DoPopup(Sender: TObject); // WIRD NIE AUFGERUFEN. WARUM?!
begin
 ShowMessage('ABC');
 TPopupListEx(PopupList).PopupMenu := Sender as TPopupMenu;

 inherited;
end;

Geändert von Glados (20. Okt 2017 um 11:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: TPopupMenu Popup überschreiben / DoPopup wird nie aufgerufen

  Alt 20. Okt 2017, 11:12
Steht der Code in einer eigenen Unit? Wenn ja, ist diese im interface-Teil nach Menus eingebunden?
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
Glados
(Gast)

n/a Beiträge
 
#8

AW: TPopupMenu Popup überschreiben / DoPopup wird nie aufgerufen

  Alt 20. Okt 2017, 11:14
Zitat:
Wenn ja, ist diese im interface-Teil nach Menus eingebunden?
War sie nicht

Ich wusste nicht, dass das so sein muss. Danke! Gibt es denn eine Möglichkeit das irgendwie eleganter zu machen? Beispielsweise ohne ein überschriebenes DoPopup?
In procedure TPopupListEx.WndProc(var Message: TMessage); kann ich TPopupListEx(PopupList).PopupMenu auf Nil setzen. Aber umgekehrt beim Enter kann ich kein PopupMenu zuweisen, da ich keinen Sender habe. Deswegen habe ich aktuell die Lösung mit DoPopup. Aber geht das auch ohne?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TPopupMenu Popup überschreiben / DoPopup wird nie aufgerufen

  Alt 20. Okt 2017, 13:09
Delphi-Quellcode:
procedure TPopupMenu.Popup(X, Y: Integer);
begin
// TPopupListEx(PopupList).PopupMenu := Sender as TPopupMenu; // wie komme ich hier an den Sender?

  TPopupListEx(PopupList).PopupMenu := Self; // So! Schau mal in den Original-Code von TPopupMenu.Popup...

  inherited;
end;
Du müsstest nur noch erklären, wie du aus PopupList ein TPopupListEx machst. Das geht aus deinem Code-Beispiel nicht hervor.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#10

AW: TPopupMenu Popup überschreiben / DoPopup wird nie aufgerufen

  Alt 20. Okt 2017, 13:15
Insgesamt sieht das so aus

Delphi-Quellcode:
unit Utils.PopupMenu;

interface

uses
 Vcl.Menus, Winapi.Messages, System.Classes;

type
 TPopupMenu = class(Vcl.Menus.TPopupMenu)

 private
 protected
 public
  procedure Popup(X, Y: Integer); override;
 end;

type
 TPopupListEx = class(Vcl.Menus.TPopupList)

 private
 protected
  procedure WndProc(var Message: TMessage); override;
 public
  PopupMenu: TPopupMenu;
  MenuLoop: Boolean;
 end;

implementation

procedure TPopupMenu.Popup(X, Y: Integer);
begin
 // Wird benötigt, um an anderen Stellen im Code prüfen zu können, WELCHES PopupMenu gerade geöffnet ist
 TPopupListEx(PopupList).PopupMenu := Self;

 inherited;
end;

procedure TPopupListEx.WndProc(var Message: TMessage);
begin
 case message.msg of
  WM_ENTERMENULOOP:
   begin
    MenuLoop := True; // Menu sichtbar
   end;
  WM_EXITMENULOOP:
   begin
    MenuLoop := False; // Menu nicht mehr sichtbar
    TPopupListEx(PopupList).PopupMenu := nil;
   end;
 end;

 inherited WndProc(message);
end;

initialization

Vcl.Menus.PopupList.Free;
Vcl.Menus.PopupList := TPopupListEx.Create;

end.
Stat WndProc > WM_EXITMENULOOP wollte ich eigentlich TPopupMenu > CloseMenu überschreiben aber das ist nicht erlaubt.

Geändert von Glados (21. Okt 2017 um 13:14 Uhr)
  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 19:07 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