Entwickler-Ecke
Dateizugriff - Menü einträge aus datei laden - [Fertig]
mimi - So 28.09.03 13:10
Titel: Menü einträge aus datei laden - [Fertig]
Hallo,
ich habe eine datei sie sieht so aus:
Quelltext
1: 2: 3: 4: 5:
| Test0\Test1 Test0\Test2 Test1\Test2 Test2\Test3\Test4 Test2\Test0 |
die soll in einem menu geladen werden. ich habe jetzt eine funktion geschrieben die das noch nicht so richtig macht wie ich es haben wollte:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| procedure TForm1.LoadTool; var Tools:TStringList; i,x:Integer; str:String; Menu:TMenuItem; SubMenu:TmenuItem; begin tools:=TStringList.Create; tools.LoadFromFile(GetExeDir + 'config\tools1.txt');
for i:=0 to tools.count-1 do begin str:=tools[i]; Menu:=TMenuItem.Create(Self); SubMenu:=TMenuItem.Create(Self);
Menu.Caption:=GetToken(str,'\',1);
if tools1.Find(Menu.Caption) = NIL then tools1.Add(menu); end;
for i:=0 to tools.count-1 do begin str:=tools[i]; Menu:=TMenuItem.Create(Self); SubMenu:=TMenuItem.Create(Self);
for x:=1 to NumToken(str,'\') do begin Menu.Caption:=GetToken(str,'\',1);
if tools1.Find(Menu.Caption) <> NIL then begin SubMenu:=tools1.Find(Menu.Caption); SubMenu.Add(menu); end; end; end;
end; |
wie könnte ich das problem am besten und am einfachsten lösen ?
Moderiert von
Tino: Titel geändert.
G-man - Mo 29.09.03 08:24
ich würde die Dateinahmen nicht in einer datei speichern, sondern in der Registry (ist aber geschmackssache) und dann die Informationen aus der Registry auslesen und dann in das Menü schreiben.
Ist sicherlich einfacher...
Delete - Mo 29.09.03 08:34
Ob Registry oder Datei - das nimmt sich in dem Moment nicht viel. Es klappt beides. Letztlich liegt der Fehler wohl auch nicht im Aufbau der Datei sondern irgendwo im Programmcode, und das könnte bei der Benutzung der Registry auch passieren. :)
mimi - Mo 29.09.03 17:04
ich hasse die regedit und habe (und werde) sie nicht nutzen !!!
Wie denn auch sein, habt ihr eine lösung ???
Delete - Mo 29.09.03 17:41
Wenn du etwas hassen möchtest, dann bitte die Registry. Der arme Editor RegEdit kann doch nichts dafür, dass er für die Registry geschrieben wurde.
mimi - Mo 29.09.03 18:16
das problem ist jetzt nicht die regedit sondern wie ich mein ziel ereichen kann.
Delete - Di 30.09.03 10:01
| mimi hat folgendes geschrieben: |
| das problem ist [...] wie ich mein ziel ereichen kann. |
Durch Nachdenken?
Was willst du denn erreichen?
Du möchtest den Inhalt dieser Datei in ein Menü eintragen. Und wenn ich den Code betrachte, dann gehe ich davon aus, dass der Backslash die Rolle des Trenners übernehmen soll, so dass am Ende etwa folgende Menüstruktur entsteht:
Quelltext
1: 2: 3: 4: 5:
| Test0 --> Test1 Test2 Test1 --> Test2 Test2 --> Test3 --> Test4 Test0 |
Richtig?
Gut, dann vermute ich mal, dass der erste Teil wohl funktionieren wird. Sprich: du prüfst, ob die Haupteinträge (Test0 bis Test2) existieren, und wenn nicht, dann hängst du sie an den Menüpunkt (tools1) an.
Im zweiten Teil willst du dann wohl die untergeordneten Einträge anhängen. Ich muss allerdings sagen, ich kenne die Funktionen "GetToken" und "NumToken" nicht und kann deren Funktion daher nur erraten.
Ich gehe aber davon aus, dass "NumToken" die Anzahl der Strings (Felder/Tokens) zurückliefert. Im Fall von
wäre das Ergebnis dann wohl 3. Wenn dem so ist, dann frage ich mich, warum du innerhalb der Schleife, beim Aufruf von "GetToken" die Eins benutzt
| Zitat: |
Delphi-Quelltext 1: 2:
| for x:=1 to NumToken(str,'\') do begin Menu.Caption:=GetToken(str,'\',1); | |
Müsste hier nicht der Schleifenwert hin, damit du die anderen Strings (Felder/Tokens) bekommst (im zitierten Beispiel also "Test3" und "Test4")?
Und da es sich um untergeordnete Menüeinträge handelt, frage ich mich, warum du weiterhin im Hauptmenü (tools1) nach der Caption suchst? Du solltest besser im jeweils übergeordneten Menüeintrag suchen, dann wird die Struktur wohl auch richtig erzeugt werden.
Zum Abschluss: Ich vermisse in dem geposteten Codeauszug die Prüfung, ob die Stringliste überhaupt erzeugt werden konnte, und ob die Datei überhaupt Textzeilen enthält.
mimi - Di 30.09.03 17:15
| Zitat: |
Zum Abschluss: Ich vermisse in dem geposteten Codeauszug die Prüfung, ob die Stringliste überhaupt erzeugt werden konnte, und ob die Datei überhaupt Textzeilen enthält.
|
sowas kommt später dran.
| Zitat: |
wäre das Ergebnis dann wohl 3. Wenn dem so ist, dann frage ich mich, warum du innerhalb der Schleife, beim Aufruf von "GetToken" die Eins benutzt
Zitat:
Sourcecode:
for x:=1 to NumToken(str,'\') do begin
Menu.Caption:=GetToken(str,'\',1);
Müsste hier nicht der Schleifenwert hin, damit du die anderen Strings (Felder/Tokens) bekommst (im zitierten Beispiel also "Test3" und "Test4")?
|
naja diser teiel erzeug schonmal die haupt menupunkte das geht prima, nur ich weiß nicht wie ich am besten untermenu punkte erzeugen könnte.
| Zitat: |
Du möchtest den Inhalt dieser Datei in ein Menü eintragen. Und wenn ich den Code betrachte, dann gehe ich davon aus, dass der Backslash die Rolle des Trenners übernehmen soll, so dass am Ende etwa folgende Menüstruktur entsteht:
Code:
Test0 --> Test1
Test2
Test1 --> Test2
Test2 --> Test3 --> Test4
Test0
Richtig?
|
richtig.
| Zitat: |
Im zweiten Teil willst du dann wohl die untergeordneten Einträge anhängen. Ich muss allerdings sagen, ich kenne die Funktionen "GetToken" und "NumToken" nicht und kann deren Funktion daher nur erraten.
Ich gehe aber davon aus, dass "NumToken" die Anzahl der Strings (Felder/Tokens) zurückliefert. Im Fall von
|
richtig, numtoken lieft mir die anzahl der zeichen also z.b. der \ und getoken liefert mir das was zwischen \ und \ steht. und er fängt von 1 an zu zählen.
Delete - Di 30.09.03 17:52
Hast du jetzt noch irgendeine Frage dazu, oder wie soll ich dein Posting verstehen? Evtl. Schwachpunkte habe ich dir genannt. Da ich "GetToken" und "NumToken" nicht habe (Delphi 5), habe ich eine Alternative mit der Funktion
Explode [
http://www.delphipraxis.net/topic3816_ein+dynamisches+array+aus+einem+string+erzeugen.html] von jbg probiert. Das Ergebnis war etwas einfacher als dein Konstrukt, hat aber trotzdem wunderbar funktioniert.
Allerdings habe ich die Demo wieder gelöscht. Ich gehe mal davon aus, dass du´s auch ohne mich hinbekommst. Ansonsten müsste ich das Teil noch mal rekonstruieren.
mimi - Di 30.09.03 18:02
| Zitat: |
Allerdings habe ich die Demo wieder gelöscht. Ich gehe mal davon aus, dass du´s auch ohne mich hinbekommst. Ansonsten müsste ich das Teil noch mal rekonstruieren.
|
ja, das wäre praktisch.[/delphi]
Delete - Di 30.09.03 18:18
Hm, ... na ja, ich werde mal nicht so sein. :) Außerdem war´s nicht viel Text, also ging die Wiederherstellung recht flott.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58:
| type TStringDynArray = array of string;
procedure TForm1.Button1Click(Sender: TObject); var sl : TStringList; i, j : integer; str : TStringDynArray; menu, submenu : TMenuItem; begin sl := TStringList.Create; if(sl <> nil) then try sl.LoadFromFile(ExtractFilePath(paramstr(0)) + 'tools1.txt'); if(sl.Count > 0) then for i := 0 to sl.Count - 1 do begin str := Explode('\',sl[i]);
if(length(str) > 0) then begin menu := tools1.Find(str[0]); if(menu = nil) then begin menu := TMenuItem.Create(tools1); menu.Caption := str[0];
tools1.Add(menu); end;
if(length(str) > 1) then for j := 1 to length(str) - 1 do begin submenu := menu.Find(str[j]); if(submenu = nil) then begin submenu := TMenuItem.Create(menu); submenu.Caption := str[j];
menu.Add(submenu); end;
menu := submenu; end; end; end; finally sl.Free; end; end; |
Explode gibt´s, wie gesagt!, in der Delphi-PRAXiS. Einfach dem obigen Link folgen und dann kopieren und einbinden.
Delete - Di 30.09.03 18:32
| MathiasSimmack hat folgendes geschrieben: |
Hm, ... na ja, ich werde mal nicht so sein. :) Außerdem war´s nicht viel Text, also ging die Wiederherstellung recht flott.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| type TStringDynArray = array of string; |
|
a) Kennt Delphi auch nicht.
b) Hast du.
mimi - Mi 01.10.03 18:19
es hat prima funktioniert
vielen dank "MathiasSimmack"
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!