AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Problem bei Dynamischen Menü-Titeln
Thema durchsuchen
Ansicht
Themen-Optionen

Problem bei Dynamischen Menü-Titeln

Ein Thema von NecroWurst · begonnen am 22. Jun 2006 · letzter Beitrag vom 22. Jun 2006
Antwort Antwort
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
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#2

Re: Problem bei Dynamischen Menü-Titeln

  Alt 22. Jun 2006, 11:46
Hallo und herzlich willkommen!

Du könntest Dir zum Beispiel die Caption des Menüeintrages in ein lokale Variable (nennen wir sie mal cap vom Typ String) speichern.
Dann eleminierst Du das &-Zeichen:
Delphi-Quellcode:
if pos ('&', cap) > 0 then
  delete (cap, pos ('&', cap),1);
Jetzt kannst Du Deinen XML-Eintrag mit cap vergleichen.

Das war jetzt quick and dirty, ich habe Deinen Quelltext ansonsten nicht weiter angesehen.

Hope it helps

onlinekater
[edit] Hawkeyes Variante ist eleganter [/edit]
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Problem bei Dynamischen Menü-Titeln

  Alt 22. Jun 2006, 11:49
Hallo Chris,

in der Unit Menus findest du die Funktion Delphi-Referenz durchsuchenAnsiSameCaption. Vielleicht kannst du sie einsetzen um zwei Menüeinträge zu vergleichen?

Gruß Hawkeye
  Mit Zitat antworten Zitat
NecroWurst

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

Re: Problem bei Dynamischen Menü-Titeln

  Alt 22. Jun 2006, 13:04
Hi und danke für die schnellen Antworten!

Ich werde den Ansatz mit AnsiSameCaption mal ausprobieren, wenn ich Zeit habe!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:40 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