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