Autor |
Beitrag |
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 08.03.19 20:23
Hallo!
Ich habe nun nach einiger Suche eine Möglichkeit gefunden, auf das Schliessen eine PopupMenus zu reagieren:
www.delphipraxis.net...e-geoeffnet-ist.html
Nur leider komme ich nicht drauf, wie man, wie dort angesprochen, herausfinden kann, um welches PopupMenu es sich handelt:
Zitat: | Wie kann man in CMMenuClosed then NAMEN des betreffenden Popup-Menüs erfahren? Geht das überhaupt? |
Zitat: | Ja das geht, wenn man beim Senden der Nachricht auch noch eine zusätzliche Information hinzufügt (z.B. die Referenz auf die Popup-Instanz). |
Zitat: | Und wie könnte man in der PRAXIS beim Senden der Nachricht in diesem Beispiel die betreffende Information einfügen? |
Weiss jemand, wie das geht?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 08.03.19 21:13
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 08.03.19 21:36
Hallo Frühlingsrolle!
Frühlingsrolle hat folgendes geschrieben : | Man könnte das noch erweitern und z.B. anstelle des wParam-Parameters, self.Name mitschicken, in etwa:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TExPopupList.WndProc(var Message: TMessage); Procedure Send( msg: Integer ); Begin If Assigned( Screen.Activeform ) Then Screen.ActiveForm.Perform( msg, WParam(PChar(self.Name)), Message.lparam ); End; begin end; |
|
Leider klappt es mit WParam(PChar(self.Name)) nicht. Ich habe etwas herumexperiemtiert und bin auf Message.WParam(PChar(self.Name)) gekommen - .Name wird aber nicht erkannt bzw. gibt es das hier nicht. Auch Message.WParam(PChar(self)) funktioniert nicht, hier meckert der Compiler:
Zitat: | E2066 Operator oder Semikolon fehlt |
- hier wird offenbar ein , erwartet, sonst nichts!
Ich verstehe, was du meinst, bekomme es aber nicht hin.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 08.03.19 21:55
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 09.03.19 06:02
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 09.03.19 06:46
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 09.03.19 07:53
Frühlingsrolle hat folgendes geschrieben : | So funktioniert es explizit nur für TForm Objekte. |
Das nützt mit für meine Zwecke nichts. Ich möchte herausfinden können, welches PopupMenu das Schliessen ausgelöst hat, also von welchem PopupMenu Send( CM_MENUCLOSED ); ausgelöst wurde!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 09.03.19 09:27
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 09.03.19 10:53
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 09.03.19 11:07
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 09.03.19 11:45
Ich leider doch:
Zitat: | Im Projekt Help.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 006D658E in Modul 'Help.exe'. Lesen von Adresse 00000008' aufgetreten. |
Geht das nur mit PopupMenus der TForm? Ich habe PopupMenus, die zu verschiedenen Komponenten gehören. Bei keiner funktioniert es!
//Edit:
Auch bei PopupMenus von TForm kommt es zu dem Fehler!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 09.03.19 17:35
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 09.03.19 20:33
Frühlingsrolle hat folgendes geschrieben : | Hm, führst du Delphi mit Adminrechten aus? Bei mir ist das der Fall. |
Nein, eingeschränktes User-Konto. Muss doch aber egal sein, oder?
Frühlingsrolle hat folgendes geschrieben : | Die Eigenschaft .Popupmenu ist keiner Klasse eindeutig zuordenbar, daher muss man den Code auf das jeweilige Parent umschreiben.
Mit RTTI könnte man es zurecht biegen, da bin ich aber nicht so sattelfest darin. |
RTTI? Muss ich googeln!
Das Problem ist, dass Screen.ActiveForm.PopupMenu nicht zugewiesen ist, denn wenn man mit if Assigned(Screen.ActiveForm.PopupMenu) prüft, wird der Code nicht ausgeführt - ist also nicht zugewiesen.
Was ich nicht verstehe: Das PopupMenu gibt es ja, es gibt gleich mehrere, die jeweils verschiendene Komponenten haben. Sie existieren also, werden auch nirgendwo im Code "destroyed" oder so was in der Art.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 09.03.19 20:50
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 09.03.19 21:16
Frühlingsrolle hat folgendes geschrieben : | Viele WinAPI Funktionen, die im Delphi allgegenwertig sind, benötigen Lese- und Schreibrechte, die nur mit Adminrechten ein "korrektes" Ergebnis liefern können. |
Dann muss ich hier wohl aufgeben. Delphi ist unter meinem Adminkonto nicht eingerichtet. Ich kann mein Projekt nicht kompilieren, weil da diverse Komponenten nicht installiert sind.
//Edit: Klar könnte ich das jetzt alles auch im Adminkonto installieren.
Gibt es keinen einfacheren Weg, an das PopupMenu heranzukommen? Irgendwie, irgendwo muss mein Programm ja "wissen", welches PopupMenu gerade geschlossen wird!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 09.03.19 21:25
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 09.03.19 21:31
Frühlingsrolle hat folgendes geschrieben : | Mit RTTI könnte man es zurecht biegen, da bin ich aber nicht so sattelfest darin. |
Ich erst recht nicht!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: So 10.03.19 11:14
Zunächst habe ich einige Methoden in gefälligere Namen umbenannt und zudem einige neue Methoden hinzugefügt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78:
| unit ExPopupMenu;
interface
uses Controls, Menus;
const CM_MENU_CLOSED = CM_BASE + 1001; CM_ENTER_MENU_LOOP = CM_BASE + 1002; CM_EXIT_MENU_LOOP = CM_BASE + 1003;
var FPopupMenu: TPopupMenu;
function GetCurrentPopupMenu: TPopupMenu; procedure SetCurrentPopupMenu(const PopupMenu: TPopupMenu);
implementation
uses Messages, Forms;
type TPopupListEx = class(TPopupList) protected procedure WndProc(var Message: TMessage) ; override; private procedure PerformMessage(cm_msg : integer; msg : TMessage) ; end;
procedure TPopupListEx.PerformMessage(cm_msg: integer; msg : TMessage) ; begin if not (Screen.Activeform = nil) then Screen.ActiveForm.Perform(cm_msg, msg.WParam, msg.LParam) ; end;
procedure TPopupListEx.WndProc(var Message: TMessage) ; begin case message.Msg of WM_ENTERMENULOOP: PerformMessage(CM_ENTER_MENU_LOOP, Message) ; WM_EXITMENULOOP : PerformMessage(CM_EXIT_MENU_LOOP, Message) ; WM_MENUSELECT : with TWMMenuSelect(Message) do begin if (Menu = 0) and (Menuflag = $FFFF) then begin PerformMessage(CM_MENU_CLOSED, Message) ; end; end; end; inherited; end;
function GetCurrentPopupMenu: TPopupMenu; begin Result := FPopupMenu; end;
procedure SetCurrentPopupMenu(const PopupMenu: TPopupMenu); begin FPopupMenu := PopupMenu; end;
initialization FPopupMenu := TPopupMenu.Create(nil);
Popuplist.Free; PopupList:= TPopupListEx.Create; finalization if Assigned(FPopupMenu) then FPopupMenu := nil; end. |
Ich habe das nun so gelöst, dass man im OnPopup des jeweiligen PopupMenus eben dieses zuweist, um später auswerten zu können, um welches PopupMenu es sich handelt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TForm1.PopupMenu1Popup(Sender: TObject); begin SetCurrentPopupMenu(TPopupMenu(Sender)); end;
procedure TForm1.PopupMenuClosed(var msg: TMessage) ; begin if GetCurrentPopupMenu = PopupMenu1 then Showmessage('PopMenu closed'); end;
procedure TForm1.PopupMenuEnter(var msg: TMessage) ; begin if GetCurrentPopupMenu = PopupMenu1 then Showmessage('PopMenu entered'); end;
procedure TForm1.PopupMenuExit(var msg: TMessage) ; begin if GetCurrentPopupMenu = PopupMenu1 then Showmessage('PopMenu exited'); end; |
Ich habe damit mein Ziel erreicht, aber leider nicht "vollautomatisch"!
Vielleicht könnte mit noch jemand sagem, warum es im finalization-Abschnitt zu einem Laufzeitfehler kommt, wenn ich dort FPopupMenu.Free verwende, und ob es überhaupt notwenig ist, FPopupMenu freizugeben!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 10.03.19 15:53
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
galagher
Beiträge: 2528
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: So 10.03.19 20:04
Frühlingsrolle hat folgendes geschrieben : | Zu dem Lsufzeitfehler wird es wahrscheinlich deswegen kommen, weil das übergebene Popupmenu1 dadurch an 2 Stellen freigegeben wird, was nicht geht.
Einmal von der Hauptklasse, und dann von deiner Klasse aus.
Es NIL zu setzen, find ich überflüssig. |
Ja, das stimmt wohl, denn ich muss es nicht einmal erzeugen: Es funktioniert auch ohne .Create.
Natürlich wäre es noch einfacher, einen String zu verwenden und einfach auf .Name zu prüfen. Es klappt, ist aber dennoch nur eine halbe, oder sagen wir, eine dreiviertel-Lösung, denn ich benötige eben eine Methode, um das PopupMenu erst einmal "bekannt" zu machen. Schön wäre es, wenn das alles automatisch erledigt wird.
Und noch etwas gefällt mir nicht: Man kann auf FPopupMenu von ausserhalb zugreifen!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|