Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Erstellen von PopupMenüs zur Laufzeit (https://www.delphipraxis.net/112970-erstellen-von-popupmenues-zur-laufzeit.html)

Florian L. 30. Apr 2008 12:55


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

Pfoto 30. Apr 2008 13:00

Re: Erstellen von PopupMenüs zur Laufzeit
 
Hallo und Willkommen Florian,

vielleicht hilft dir das hier schon weiter:

Delphi-Quellcode:

var
  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;
Um das gedrückte Item eindeutig zu identifieren, kannst du im
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

Florian L. 30. Apr 2008 19:02

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;

mkinzler 30. Apr 2008 19:04

Re: Erstellen von PopupMenüs zur Laufzeit
 
Entferne einfach den Kommentar :zwinker:

Florian L. 30. Apr 2008 19:13

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!!!

Florian L. 30. Apr 2008 19:14

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;

mkinzler 30. Apr 2008 20:05

Re: Erstellen von PopupMenüs zur Laufzeit
 
Jag den Code mal durch den Debugger

Die Muhkuh 30. Apr 2008 20:10

Re: Erstellen von PopupMenüs zur Laufzeit
 
Delphi-Quellcode:
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;
Ich hab das Gefühl, dass Du auf einen ungültigen Index bei Datei.Strings[I] zugreifst.

Denkfehler.

tomsel 30. Apr 2008 20:22

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.

Florian L. 30. Apr 2008 20:36

Re: Erstellen von PopupMenüs zur Laufzeit
 
Und was mach ich gegen das Memory leak?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:13 Uhr.
Seite 1 von 2  1 2      

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