![]() |
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?
|
Re: Erstellen von PopupMenüs zur Laufzeit
Die Items nicht freigeben? :zwinker:
|
Re: Erstellen von PopupMenüs zur Laufzeit
siehe Kommentare:
Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
begin Application.ShowMainForm:= false; MenuItem:= TMenuItem.Create(Self); // mach das weg //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; // und mach das weg i:=i+2; end; i:=0; end; |
Re: Erstellen von PopupMenüs zur Laufzeit
Und nun mach das weg. ;-)
|
Re: Erstellen von PopupMenüs zur Laufzeit
Habe es schließlich so gemacht und es läuft super!!! Vielen Dank an alle Beteiligten. Vielleicht kann mir auch noch jemand sagen, wie ich den dynamischen Items noch Short-Cuts und Bitmaps hinzufügen kann. Das Problem ist nämlich, dass ich den ShortCut nicht in der Konfigurationsdatei speichern und die Bitmap nicht über einen Pfad angeben kann.
Aber trotzdem vielen Dank! Und hier mein Code:
Delphi-Quellcode:
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(ExtractFilePath(Application.ExeName)+'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 try 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; except // end; end; i:=0; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:04 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