Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamisches Erstellen eines Menü im Delphi (https://www.delphipraxis.net/108534-dynamisches-erstellen-eines-menue-im-delphi.html)

Atlas-25 15. Feb 2008 14:46


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.

Xong 15. Feb 2008 14:56

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:
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;
War doch gar nicht so schwer. :mrgreen:

LG;
Xong

PS: Willkommen bei DP! :dp:

Atlas-25 15. Feb 2008 15:18

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:
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;
ich bekomme als Ergebnis:
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]

shmia 15. Feb 2008 15:55

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;

sirius 15. Feb 2008 16:04

Re: Dynamisches Erstellen eines Menü im Delphi
 
Du musst allerdings noch vor dem Create überprüfen, ob das Item schon existiert.
Zitat:

1.Zeile: L1=(A1,B1,C1)
2.Zeile: L1=(A1,B2,C1)

Atlas-25 15. Feb 2008 16:09

Re: Dynamisches Erstellen eines Menü im Delphi
 
Vielen Vielen Dank shmia,

es hat super funktioniert :-D

Atlas-25 21. Feb 2008 15:25

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:
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(218): Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
[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

DeddyH 21. Feb 2008 15:32

Re: Dynamisches Erstellen eines Menü im Delphi
 
Delphi-Quellcode:
type
  THauptformular = class(TForm)
  ...
  procedure MeineProcedure(Sender: TObject);
  ...
end;

...

implementation

...

procedure THauptformular.MeineProcedure(Sender: TObject);
begin
  //Code
end;
Du brauchst eine Methode, eine einfache Funktion reicht nicht.

Atlas-25 21. Feb 2008 16:17

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:
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.
im Unit_A steht folgendes:
Formatierter Delphi-Quellcode:
Delphi-Quellcode:
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;
Zitat:
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:
type
  THauptformular = class(TForm)
  ...
  procedure MeineProcedure(Sender: TObject);
  ...
end;

...

implementation

...

procedure THauptformular.MeineProcedure(Sender: TObject);
begin
  //Code
end;
soll das im Unit_A? oder wohin

Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 Uhr.

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