Erstellen eines popup-Menüs zur Laufzeit
Ich versuche, einfach erstellen Sie ein popup-Menü (oder Kontext Menü), einige Elemente hinzu, und zeigen Sie an der Mausposition. Alle Beispiele die ich gefunden habe, tun dies mit dem designer. Ich bin dabei aus einem DLL-plugin, so gibt es keine form/designer. Klickt der Benutzer eine Schaltfläche aus der Haupt-Anwendung, die ruft die execute
Verfahren unter. Ich möchte nur so etwas wie ein rechts-Klick-Menü angezeigt.
Mein code offensichtlich nicht funktioniert, aber ich hatte gehofft, ein Beispiel für das erstellen eines popup-Menüs während der Laufzeit statt der design-Zeit.
procedure TPlugIn.Execute(AParameters : WideString);
var
pnt: TPoint;
PopupMenu1: TPopupMenu;
PopupMenuItem : TMenuItem;
begin
GetCursorPos(pnt);
PopupMenuItem.Caption := 'MenuItem1';
PopupMenu1.Items.Add(PopupMenuItem);
PopupMenuItem.Caption := 'MenuItem2';
PopupMenu1.Items.Add(PopupMenuItem);
PopupMenu1.Popup(pnt.X, pnt.Y);
end;
es gibt statisch typisierte Sprachen, die für die Deklaration einer Variablen ist genug, um zu initialisieren. C++ ist ein offensichtliches Beispiel.
erwarten Probleme mit dem GUI-code in den plugin-DLLs.
-1 für "Mein code" offensichtlich nicht funktioniert". Immer beschreiben Sie den Fehler mit Fehlermeldung wörtlich wiedergegeben
"Mein code" offensichtlich nicht funktioniert". Warum, oh warum? Scheint, wie Sie dó wissen, die Antwort! Warum Fragen Sie dann?
Es ist der Grund, warum Pakete vorhanden sind.Verwendung einer DLL-statt einem Paket für Ihr plugin bedeutet, dass die DLL verfügt über eine separate Instanz von VCL an die host-Anwendung. Klassische Symptome sind, die Typ-Identität funktioniert nicht wie erwartet. Zum Beispiel, im code oben
erwarten Probleme mit dem GUI-code in den plugin-DLLs.
-1 für "Mein code" offensichtlich nicht funktioniert". Immer beschreiben Sie den Fehler mit Fehlermeldung wörtlich wiedergegeben
"Mein code" offensichtlich nicht funktioniert". Warum, oh warum? Scheint, wie Sie dó wissen, die Antwort! Warum Fragen Sie dann?
Es ist der Grund, warum Pakete vorhanden sind.Verwendung einer DLL-statt einem Paket für Ihr plugin bedeutet, dass die DLL verfügt über eine separate Instanz von VCL an die host-Anwendung. Klassische Symptome sind, die Typ-Identität funktioniert nicht wie erwartet. Zum Beispiel, im code oben
TPopupMenu
ist ein anderer Typ in der DLL von der exakt gleichen namens geben Sie den host, da gibt es verschiedene VCL-Instanzen. Aber es gibt viele weitere Probleme. Wenn Pakete nicht realisierbare option ist, dann müssen Sie ein wenig mehr Arbeit zu ermöglichen plugins.InformationsquelleAutor ikathegreat | 2013-08-31
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie, um tatsächlich zu erstellen, die Instanzen einer Klasse in Delphi, bevor Sie Sie verwenden können. Der folgende code erstellt ein popup-Menü, fügt einige Elemente, die es (einschließlich einer Ereignisprozedur für das klicken Sie), und ordnet es in das Formular. Beachten Sie, dass Sie haben, zu deklarieren (und zu schreiben), die
HandlePopupItemClick
Veranstaltung selbst wie ich getan habe).In der interface-Abschnitt (add
Menus
zu denuses
- Klausel):Nun werde ich überlasse es Ihnen, herauszufinden, wie zu tun den rest (erstellen und zeigen Sie es an einer bestimmten position).
Ich kann das nicht beantworten, weil ich nicht weiß was Sie genau hat. In dem code, den ich gepostet, das Menü gehört zu der form (
TPopupMenu.Create(Self)
in einer Formular-Methode bedeutet die form ist der Eigentümer, und ist verantwortlich für die Freigabe) und die einzelnen Positionen gehören zu dem Menü ('TMenuItem.Erstellen(FPopup)`). Ihr Menü haben, zu existieren lange genug für die event-handler noch gültig sein, wenn auf ein Objekt geklickt wird.Was würde ich wohl tun, ist das plugin erstellen des popup-Menüs im Konstruktor.
Execute
würde dann einfach nur die cursor-position und zeigt das Menü an dieser position, und der Destruktor des plugins frei im popup-Menü. Ich weiß nicht, ob das funktionieren wird, denn ich habe keine anderen Informationen als das, was du gepostet hast in deine Frage.ja, sorry für den Mangel an detail, Teil, um herauszufinden, was und wie zu beschreiben. aber das hinzufügen der
destructor
und hinzufügenFPopup.Free;
gearbeitet. bis dann, mein Antrag wurde konsequent abstürzt. danke.Ich kann nicht verstehen, dass Menschen so aggressiv, wenn die Erteilung Kommentare wie die von
Warren P
. Wo ist die Arroganz comming aus? Sie vergessen, dass Sie, wo Neulinge einmal gemacht und hatte die gleichen grundlegenden Fehler. Wenn Sie nicht über die notwendigen pacience zu beschäftigen, der die grundlegenden Fragen, denke ich, ist es besser, nicht zu kommentieren. Ein Beispiel ausKen White
die Antwort war gerade, einfache, Objektive und tatsächlich half die Benutzer zu lösen sein problem.InformationsquelleAutor Ken White