![]() |
Dynamisches Erstellen eines Menü im Delphi
Hallo zusammen, ich bin neu hier und habe folgendes Problem und hoffe, daß mir jemand helfen kann.
ich möchte ein Menü dynamich erstellen und zwar so: Mein Menü enthält folgende Einträge: Datei----Inhalte----Hilfe unter: Inhalte soll stehen z.B. |--->A1--->B1--->C1 1.Zeile | |--->B2--->C1 2.Zeile | |--->C2 3.Zeile |--->A2--->B3 4.Zeile usw. Die Einträge hole ich mir aus einer Liste L1 vom Typ: TStringList Der Inhalt Liste L1 ist variabel, diese wird jedesmal in einem Schleife mit der Daten gefüllt und sieht so aus: 1.Zeile: L1=(A1,B1,C1) 2.Zeile: L1=(A1,B2,C1) 3.Zeile: L1=(A1,B2,C2) 4.Zeile: L1=(A2,B3) Wer kann mir da helfen un ein Stück Quellcode schicken. Ich wäre Dir/Euch sehr denkbar. |
Re: Dynamisches Erstellen eines Menü im Delphi
(Fertigen) Code bekommst du von mir nicht, aber Tipps:
Entweder du parst den Inhalt der Stringliste neu oder du baust das Menü während der Belegung der Stringlist gleich mit auf. Wie auch immer, hier ein wenig Pseudocode:
Delphi-Quellcode:
War doch gar nicht so schwer. :mrgreen:
for i:=0 to Zeilenanzahl-1 do begin
WähleWurzelknotenAus; // In diesem Fall ist das der Menüpunkt "Inhalte" for k:=0 to ItemAnzahl do begin // ItemAnzahl ist die Anzahl aller A1 bis Zx if Vorhanden(Item[0]) then GeheZu(Item[0]) else LegeAn(Item[0]); end; end; LG; Xong PS: Willkommen bei DP! :dp: |
Re: Dynamisches Erstellen eines Menü im Delphi
Vielen dank Xong,
ich habe folgende Code, aber irgendwie haut das nicht hin. ich bin ja kein Profi.
Delphi-Quellcode:
ich bekomme als Ergebnis:
procedure test1;
var MeinText: String; i: integer; NewItem: TMenuItem; begin MenuItem1 := MenuHaupt.Items.Find('Inhalte'); MeinText := 'A1|B1|C1' ; L1 := StrSplit(MeinText, ['|']); for i:=0 to L1.Count-1 do begin NewItem := TMenuItem.Create(Self); NewItem.Caption := L1[i]; MenuItem1.Add(NewItem); end; end; Inhalte |--->A1 |--->B1 |--->C1 statt |--->A1--->B1--->C1 [edit=Christian Seehase]Delphi-Tags korrigiert (Anwendung: [delphi*]code[/delphi*] jeweils ohne *, oder markieren, und dann den Delphi-Code-Button drücken. Mfg, Christian Seehase[/edit] |
Re: Dynamisches Erstellen eines Menü im Delphi
Delphi-Quellcode:
procedure TForm1.test1;
var MeinText: String; i: integer; NewItem, parent: TMenuItem; begin parent := MenuHaupt.Items.Find('Inhalte'); MeinText := 'A1|B1|C1' ; L1 := StrSplit(MeinText, ['|']); for i:=0 to L1.Count-1 do begin NewItem := TMenuItem.Create(Self); NewItem.Caption := L1[i]; parent.Add(NewItem); parent := NewItem; // das neue Item wird nun zum aktuelle Eltern-Item end; end; |
Re: Dynamisches Erstellen eines Menü im Delphi
Du musst allerdings noch vor dem Create überprüfen, ob das Item schon existiert.
Zitat:
|
Re: Dynamisches Erstellen eines Menü im Delphi
Vielen Vielen Dank shmia,
es hat super funktioniert :-D |
Re: Dynamisches Erstellen eines Menü im Delphi
Hallo
ich brauche Hilfe wieder, ich habe folgendes Problem: in einem Hauptformular wird eine Procedure aus einem anderen Unit (Unit_A) aufgerufen. Diese Procedure sorgt dafür, dass das Menü zur Laufzeit aufgebaut wird. es funktioniert alless wunderbar. Mein Problem ist, wie kann ich MenüItem ein OnClick Erreignis zuweisen. Mein Versuch unten scheitert an unten gennanten Fehlermeldungen. Wer kann mir helfen? Formatierter Delphi-Quellcode:
Delphi-Quellcode:
[Fehler] Unit_A.pas(218): Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
Hauptformular:
unit HauptFormular; interface uses Unit_A, .....; .... procedure TfrmMain.FormCreate(Sender: TObject); begin //hier wird die Prcedure MenuAufbau() aufgerufen //diese Prcedure ist im Unit A im gleichen Project implementiert end; //Unit_A Unit_A prcedure MenuAufbau(); begin //hier wir das Menü dynamisch aufgebaut // ich möchte hier jedem Menüeintrag ein Ereignis zuweisen MeinItem.Onclick := MeineProcedure; end; procedure MeineProcedure(Sender: TObject); begin showmessage( TMenuItem(Sender).Name); end; [Fehler] Unit_A.pas(224): Bei der vorherigen Deklaration von test wurde die Direktive 'overload' nicht angegeben [Fehler] Unit_A.pas(61): Ungenügende Forward- oder External-Deklaration: 'MeineProcedure' [Fataler Fehler] Hauptformular.pas(14): Verwendete Unit 'Unit_A.pas' kann nicht compiliert werden |
Re: Dynamisches Erstellen eines Menü im Delphi
Delphi-Quellcode:
Du brauchst eine Methode, eine einfache Funktion reicht nicht.
type
THauptformular = class(TForm) ... procedure MeineProcedure(Sender: TObject); ... end; ... implementation ... procedure THauptformular.MeineProcedure(Sender: TObject); begin //Code end; |
Re: Dynamisches Erstellen eines Menü im Delphi
Hallo DeddyH, Vielen Dank für die schnelle Antwort,
ich hebe trotzdem heute ein Brett vom Kopf kannst du mir bitte korrigieren im Hauptformular habe ich folgendes stehen: Formatierter Delphi-Quellcode:
Delphi-Quellcode:
im Unit_A steht folgendes:
unit HauptFormular;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ExtCtrls, Menus, Printers, JvExExtCtrls, JvExtComponent, JvPanel, StdCtrls, Buttons, Unit_A; //mein Unit type TfrmMain = class(TForm) .... private end; var frmMain: TfrmMain; MenuItem1: TMenuItem; ...... implementation uses ... procedure TfrmMain.FormCreate(Sender: TObject); begin //hier wird die Prcedure MenuAufbau() aufgerufen //diese Prcedure ist im Unit A im gleichen Project implementiert end; end. Formatierter Delphi-Quellcode:
Delphi-Quellcode:
Zitat:
prcedure MenuAufbau();
begin //hier wir das Menü dynamisch aufgebaut // ich möchte hier jedem Menüeintrag ein Ereignis zuweisen MeinItem.Onclick := MeineProcedure; end; procedure MeineProcedure(Sender: TObject); begin showmessage( TMenuItem(Sender).Name); end; Formatierter Delphi-Quellcode:
Delphi-Quellcode:
type
THauptformular = class(TForm) ... procedure MeineProcedure(Sender: TObject); ... end; ... implementation ... procedure THauptformular.MeineProcedure(Sender: TObject); begin //Code end; [quote="DeddyH"]
Delphi-Quellcode:
soll das im Unit_A? oder wohin
type
THauptformular = class(TForm) ... procedure MeineProcedure(Sender: TObject); ... end; ... implementation ... procedure THauptformular.MeineProcedure(Sender: TObject); begin //Code end; Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 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 by Thomas Breitkreuz