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
Glados
(Gast)

n/a Beiträge
 
#1

TPopupMenu Popup überschreiben / DoPopup wird nie aufgerufen

  Alt 19. Okt 2017, 18: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 20:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: TPopupMenu Popup überschreiben

  Alt 19. Okt 2017, 19: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, 19: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 22: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, 07: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, 08: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, 09: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 10:00 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:20 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