![]() |
Erstellen von PopupMenüs zur Laufzeit
Hallo,
ich möchte ein Programm zum schnelleren starten von Programmen schreiben. Ich habe eine Textdatei in der die Konfiguration steht. Wie ich die auslese und verwende weis ich. Jedohc habe ich keine Ahnung wie ich dynamisch, also während der Laufzeit, ein PopuMenü erweitere. Hinzu kommt noch, dass ich wissen muss welches Item des PopupMenüs gedrückt wurde, um das richtige Programm zu starten. Bitte helft mir! (Benutze Turbo Delphi!) Schon mal vielen Dank im voraus! Florian |
Re: Erstellen von PopupMenüs zur Laufzeit
Hallo und Willkommen Florian,
vielleicht hilft dir das hier schon weiter:
Delphi-Quellcode:
Um das gedrückte Item eindeutig zu identifieren, kannst du imvar MenuItem: TMenuItem; begin MenuItem:= TMenuItem.Create(Self); MenuItem.Caption := 'Titel des Menüs'; // Dem Tag eine eindeutige ID zuweisen MenuItem.Tag:= 1; // Hier das Event zuweisen - es muss die selben Parameter haben wie von OnClick erwartet, (Sender: TObject) MenuItem.OnClick := ClickEvent // Den erstellten Menüeintrag einem Elternmenü zuweisen ParentMenu.Add(MenuItem); end; OnClick-Event den Tag auslesen, etwa so:
Delphi-Quellcode:
procedure ClickEvent(Sender: TObject);
begin case TMenuItem(Sender).Tag of 1: ShowMessage('Programm 1'); end; end; Gruß Pfoto |
Re: Erstellen von PopupMenüs zur Laufzeit
Liste der Anhänge anzeigen (Anzahl: 1)
Danke erst mal für den Code. Er funktioniert, jedoch nur wenn ich das PopupMenu um 1 Eintrag erweitere. Sobald ich ein weiteres einfügen möchte (mit dem untenstehenden Code) bekomme ich folgende Fehlermeldung, welche als Bild im Anhang steckt. Ich hoffe, dass es überhaupt machbar ist, und das Ihr wisst wie!
Vielen Dank! Florian
Delphi-Quellcode:
//Liste der Verknüpfungen zusammenbauen
while i < Datei.Count do begin //MenuItem:= TMenuItem.Create(Self); MenuItem.Caption:=Datei.Strings[i]; MenuItem.OnClick:=Anwendung; MenuItem.Tag:=i+1; PopupMenu1.Items.Add(MenuItem); //MenuItem.Free; i:=i+2; end; i:=0; |
Re: Erstellen von PopupMenüs zur Laufzeit
Entferne einfach den Kommentar :zwinker:
|
Re: Erstellen von PopupMenüs zur Laufzeit
Liste der Anhänge anzeigen (Anzahl: 1)
Das wiederum bringt folgende Fehlermeldung (siehe Anhang). Zudem habe ich dann gar keinen neuen Eintrag im PopupMenu.
Trotzdem danke. Aber das muss doch zu machen sein!!! |
Re: Erstellen von PopupMenüs zur Laufzeit
Der Fehler muss also irgendwo da drin stecken:
Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
begin Application.ShowMainForm:= false; MenuItem:= TMenuItem.Create(Self); //Variablen "nullen" i:=0; //ini-Datei einlesen Datei:=TStringList.Create; if FileExists('Verknüpfungen.ini') then begin Datei.LoadFromFile('Verknüpfungen.ini'); end else begin ShowMessage('Die Datei "Verknüpfungen.ini" konnte nicht gefunden werden und wird deshalb neu erstellt!'); Datei.SaveToFile('Verknüpfungen.ini'); close(); end; //Liste der Verknüpfungen zusammenbauen while i < Datei.Count do begin MenuItem:= TMenuItem.Create(Self); MenuItem.Caption:=Datei.Strings[i]; MenuItem.OnClick:=Anwendung; MenuItem.Tag:=i+1; PopupMenu1.Items.Add(MenuItem); MenuItem.Free; i:=i+2; end; i:=0; end; |
Re: Erstellen von PopupMenüs zur Laufzeit
Jag den Code mal durch den Debugger
|
Re: Erstellen von PopupMenüs zur Laufzeit
Delphi-Quellcode:
Ich hab das Gefühl, dass Du auf einen ungültigen Index bei Datei.Strings[I] zugreifst.
while i < Datei.Count do
begin MenuItem:= TMenuItem.Create(Self); MenuItem.Caption:=Datei.Strings[i]; MenuItem.OnClick:=Anwendung; MenuItem.Tag:=i+1; PopupMenu1.Items.Add(MenuItem); MenuItem.Free; i:=i+2; end; i:=0; Denkfehler. |
Re: Erstellen von PopupMenüs zur Laufzeit
Du gibst alle erzeugten Menuitems wieder frei. Damit enthält dein Menü nur eine Liste ungültiger Zeiger. Das gibt zwangsläufig eine AV.
Das einzig noch existierende Menuitem ist das, welches du zu aller erst erzeugst, noch vor der Schleife, aber es existiert kein Verweis mehr darauf. Das nennt man Memory leak, wenn auch nur ein klitzekleines. |
Re: Erstellen von PopupMenüs zur Laufzeit
Und was mach ich gegen das Memory leak?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 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