| Autor |
Beitrag |
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 28.09.03 13:10
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:
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.
_________________ MFG
Michael Springwald, "kann kein englisch...."
Zuletzt bearbeitet von mimi am Fr 03.10.03 17:44, insgesamt 1-mal bearbeitet
|
|
G-man
      
Beiträge: 258
Win 2000, Win ME, SuSE 8.2
D5 Standard, D6 Professional
|
Verfasst: 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...
_________________ ...To err is human, but to really foul things up requires a computer.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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 ???
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mo 29.09.03 18:16
das problem ist jetzt nicht die regedit sondern wie ich mein ziel ereichen kann.
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
| Zitat: | Quelltext |
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 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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.
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 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 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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]
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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.
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.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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.
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mi 01.10.03 09:18
| MathiasSimmack hat folgendes geschrieben: | | Explode gibt´s, wie gesagt!, in der Delphi-PRAXiS. |
Die Funktion gibt es auch hier: ...einen unterteilten String in ein Array schreiben?
Gruß
Tino
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mi 01.10.03 18:19
es hat prima funktioniert
vielen dank "MathiasSimmack"
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|