Einzelnen Beitrag anzeigen

NecroWurst

Registriert seit: 17. Mär 2006
33 Beiträge
 
#1

Problem bei Dynamischen Menü-Titeln

  Alt 22. Jun 2006, 11:36
Hallo erstmal, ich lese schon seit geraumer Zeit hier in diesem Board, habe aber nun ein Problem, wo ich bisher noch keine Lösung über die SuFu finden konnte:

Ausgangssituation ist die folgende:
Ich habe ein Programm geschrieben, was mir oben auf meinem Desktop eine Menüleiste am oberen Bildschrimrand bietet. Aus diesem Menü will ich dann meine Programme, Ordner und Datei aufrufen, um mir den Weg über das Start-Menü und den Explorer zu sparen (Faulheit macht halt erfinderisch!).
Nun will ich das ganze Zeug natürlich nicht hardcoded, damit ich flexibler bin, falls mal ein Eintrag wegfällt oder einer neu hinzukommt und ich nicht alles neu compilieren muss.

Gespeichert werden alle Einträge in einer XML-Datei, bisher nur mit einer Obergruppe.

Damit das Ganze nun auch schön fluppt, werden die Menüeinträge natürlich dynamisch erzeugt.

Das Problem:
Da ich nicht jede Oberkategorie mehrfach in der Menüleiste haben will, laufe ich alle Menüeinträge (bzw. die Gruppen) rekursiv durch um Doubletten vorzubeugen.
Da die Caption von den Menüeinträgen aber meistens von Delphi mit einem '&' versehen werden, damit man einen Hotkey (für [ALT]+[Key]) hat, muss ich meine Prüfung wie folgt gestallten:

Delphi-Quellcode:
procedure TForm2.Menueerstellen;
var i, j: integer;
    myItem: TMenuItem;
    gruppe: boolean;
begin
  // Die .XML-Datei öffnen
  if not (FileExists(Pfad+'config.xml')) then
    XMLdoc.Root.Name := 'MyBar'
  else
    XMLdoc.LoadFromFile(Pfad+'config.xml');
  // Die Basispunkte in meinem MainMenu erstellen
  // Die Gruppe 'Menü' erstellen
  MainMenu1.Items.Clear;
  myItem := TMenuItem.Create(MainMenu1);
  myItem.Caption := 'Menü';
  MainMenu1.Items.Insert(MainMenu1.Items.Count,myItem);
  // 'Einstellungen' --> öffnet den Dialog mit den Einstellungen
  myItem := TMenuItem.Create(MainMenu1);
  myItem.Caption := 'Einstellungen';
  myItem.OnClick := Einstellungen1Click;
  MainMenu1.Items.Items[MainMenu1.Items.Count-1].Add(myItem);
  // 'Ende' --> Programm beenden
  myItem := TMenuItem.Create(MainMenu1);
  myItem.Caption := 'Ende';
  myItem.OnClick := EndeClick;
  MainMenu1.Items.Items[MainMenu1.Items.Count-1].Add(myItem);

  //*** Die Basispunkte in meinem MainMenu erstellen

  for i := 0 To XMLdoc.Root.Items.Count-1 do
  begin
    gruppe := False;
    // In einer Schleife prüfen, ob schon die Gruppe existiert
    for j := 0 To MainMenu1.Items.Count-1 do
    begin
      if MainMenu1.Items.Items[j].Caption = '&' + XMLdoc.Root.Items.Item[i].Items.ItemNamed['Group'].Value then
      begin
        gruppe := True;
        break;
      end;
    end;
    //Gruppe Eintragen, wenn sie noch nicht existiert
    if gruppe = false then
    begin
      myItem := TMenuItem.Create(MainMenu1);
      myItem.Caption := XMLdoc.Root.Items.Item[i].Items.ItemNamed['Group'].Value;
      MainMenu1.Items.Insert(MainMenu1.Items.Count,myItem);
    end;
    //**Gruppe Eintragen
  end;

  for i := 0 to XMLdoc.Root.Items.Count-1 do
  begin
    // In einer Schleife das MainMenu durchgehen, wo die Gruppe ist, zu der
    // das Element gehört
    for j := 0 To MainMenu1.Items.Count-1 do
    begin
      if MainMenu1.Items.Items[j].Caption = '&' + XMLdoc.Root.Items.Item[i].Items.ItemNamed['Group'].Value then
      begin
        myItem := TMenuItem.Create(MainMenu1);
        myItem.Caption := XMLdoc.Root.Items.Item[i].Items.ItemNamed['Titel'].Value;
        // Meinem MenuItem auch einen Tag zuweisen
        // Tag := i+1, damit das erste Element nicht den
        // Tag = 0 bekommt und ich das Element nacher
        // noch von den anderen Items unterscheiden kann
        myItem.Tag:=i+1;
        // Dem MenuItem die Prozedur zuweisen
        myItem.OnClick := Oeffnen;
        // Dem MenuItem ein Icon zuweisen
        myItem.ImageIndex:=ImageList1.AddIcon(FileIcon(XMLdoc.Root.Items.Item[i].Items.ItemNamed['Pfad'].Value));
        // Das MenuItem zum MainMenu zufügen
        MainMenu1.Items.Items[j].Add(myItem);
        // Mein Array vergrößern
        setLength(myArray, i+1);
        // Mein Array an der Stelle i mit dem Pfad zum Element füllen
        myArray[i]:=XMLdoc.Root.Items.Item[i].Items.ItemNamed['Pfad'].Value;
      end;
    end;
  end;
end;
Wenn ich die Zeile
if MainMenu1.Items.Items[j].Caption = '&' + XMLdoc.Root.Items.Item[i].Items.ItemNamed['Group'].Value then einfach nur
if MainMenu1.Items.Items[j].Caption = XMLdoc.Root.Items.Item[i].Items.ItemNamed['Group'].Value then schreiben würde, würde er mir immer ein neues Item anlegen, weil das Programm automatisch ein '&' hinzufügt.

Nun zum eigentlichen:
Ich habe nun einen Menüpunkt 'Menü', über den ich auch meine Einstellungen für das Programm vornehmen, oder die Anwendung beenden kann. Dieser Eintrag ist quasi hardcoded und trägt nach dem Ergeugen die Caption '&Menü'.

Nun will ich aber eine Gruppe mit dem Titel 'Medien' erstellen und er prüft:
Gibt es eine Gruppe mit der Caption '&Medien'? Da es aber bereits '&Menü' gibt, wird aus '&Medien' ein 'M&edien'.
In der nächsten Prüfung sucht er wieder nach '&Medien', findet aber höchstens ein 'M&edien' und generiert mir ein 'Me&dien', und so weiter und so fort.

Meine Frage:
Wie kann ich nun die Prüfung so gestallten, dass ich nicht eine Millionen mal Medien da stehen habe?
Bei bedarf liefere ich gerne auch den kompletten Quellcode, damit man meine Speicherprozedur in die XML-Datei nachvollziehen kann.

Sonstiges:
Meine XML lese und schreibe ich über die JvSimpleXML und das Menü ist ein JvMainMenu, dass sich aber wie ein TMainMenu behandeln lässt.


Jetzt schon mal vielen Dank für Antworten und Lösungsansätze!!

Grüße
Chris
  Mit Zitat antworten Zitat