Entwickler-Ecke

Sonstiges (Delphi) - Strings aus Textdatei in TreeView laden


padawan - Sa 05.02.11 13:59
Titel: Strings aus Textdatei in TreeView laden
Hallo Delphi-Freunde!

Ich hänge an (m)einem ganz spez. Problem fest, weiß nicht, wie ich Google das beibringen kann..

Die Textdatei(Bei.txt) ist wie folgt aufgebaut:

Autoteile/Autoteile24/Tip.Auto\Alex\Nollendorfplatz\Wedding/
Baumärkte/Bauhaus/Hornbach\Bohnsdorf\Gradestr/Obi/Praktiker/


So würde ich es gerne in einer TreeView sehen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Autoteile
  |_Autoteile24
  |_Tip.Auto
    |_Alex
    |_Nollendorfülatz
    |_Wedding
Baumärkte
  |_Bauhaus
  |_Hornbach
    |_Bohnsdorf
    |_Gradestr.
  |_Obi
  |_Praktiker

Habe mit verschachtelten While-Schleifen versucht, das zu lösen. Klappt leider nicht 100%ig.
Das 1. Wort(bis zum 1. /) stellt immer die Rubrik dar, zB. Autoteile, dann versch. Läden, zB. Tip.Auto,
und nach jedem \ folgt der Ort des Ladens, zB. Alex. Vielleicht ist die Art der Wort-Trennungen unglücklich gewählt.
So eine Zeile aufzulösen, besonders Laden und Ort sauber zu trennen, scheint mir nicht zu gelingen.

Bisher sieht der code so aus:

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:
procedure TForm1.FormCreate(Sender: TObject);
var aNode: TTreeNode;
    f: TextFile;  Bslash,slash: integer;  haupt,unter,s: string;
begin assignFile(f, 'D:\Delphi-Neu2\Dateien\Bei.txt'); reset(f);
while not eof(f) do
      begin readln(f, s);  slash:=pos('/',s);
      haupt:=copy(s,1,slash-1); // 1.Wort in Zeile immer Hauptknoten(zB. 'Baumärkte')
      aNode:=TreeView1.Items.Add(Nil, haupt); // Hauptknoten schreiben
      Delete(s,1,slash); // Hauptknoten + '/' aus s entfernen
      while (length(s)>0do
            begin Bslash:=pos('\',s); slash:=pos('/',s);
         -->if (slash<Bslash) then // zB. Bauhaus/Hornbach\
               begin unter:=copy(s, 1, slash-1); // Unterknoten
               TreeView1.Items.AddChild(aNode, unter); // Unterknoten schreiben
               Delete(s,1,slash); // Unterknoten aus s entfernen
               end else
                -->if (slash>Bslash) And (Bslash>0then // zB. Hornbach\Bohnsdorf\Gradestr/
                      begin unter:=copy(s, 1, Bslash-1);
                      TreeView1.Items.AddChild(aNode, unter);
                      Delete(s,1,Bslash);
                      while (slash>Bslash) And (slash>1do // Hier nur Ort(e)
                            begin unter:=copy(s, 1, Bslash-1); // Ort extrahieren
                            TreeView1.Items.AddChild(aNode, unter); // Ort schr.
                            Delete(s,1,Bslash); // 'Westhafen)' entfernen
                            Bslash:=pos('(',s); slash:=pos('/',s);
                            end;
                      end;
            end;
      end; closeFile(f);
TreeView1.SetFocus;

Die innere While-Schleife ist zuviel, denke ich. Vielleicht geht es viel einfacher und ich denke zu kompliziert?
Und die aufeinander folgenden If-Abfragen, gekennzeichnet mit --> habe, liefern beide das Gleiche: Bauhaus u. Hornbach.
Das hängt doch alles schief, ich denke wahrsch. in die falsche Richtung.
DANKE Euch im Voraus!!!

Gruß Uli


elundril - Sa 05.02.11 14:12

Darf ich fragen ob du diese Datei so formatieren musst? Gerade bei so baumartigen Strukturen würde sich XML hervorragend eignen um diese Daten zu speichern. Macht die Datei dann halt etwas größer, aber im Zeitalter von 4GB RAM als Standard sollte das ja auch keine Tragödie sein.

lg elundril


Crombo - Sa 05.02.11 14:16

Eine andere Möglichkeit anstatt XML wäre JSON [http://www.json.org/]. Mag jetzt vielleicht etwas komisch klingen Javascript Object Notation in Delphi? Delphi-Wrapper [http://www.progdigy.com/?page_id=6]

Das erzeugt schöne Dateien (sehr kleines Overhead im Gegensatz zu XML), die auch noch sehr gut lesbar sind (auch in einem normalen Editor).

Crombo


padawan - Sa 05.02.11 14:59

Hallo zusammen!

Nein, sicher muss die Formatierung nicht sein, mir fiel eben kein anderer Weg ein und mit xml bin ich noch nicht in Kontakt gekommen. Ich habe gerade nach xml gegoogelt(wikipedia), die Vielfalt scheint riesig:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
# 2 Datentypen
    * 2.1 Einfache Typen
    * 2.2 Komplexe Typen
          o 2.2.1 Beliebiger Inhalt
          o 2.2.2 Listen
          o 2.2.3 Leere Elemente
    * 2.3 Ableitung neuer Typen
          o 2.3.1 Erweiterung eines Typs
          o 2.3.2 Einschränkung eines Typs

Welcher Typ käme hier in Frage? Könntest Du bitte ein kurzes Beispiel nennen? Werde mich auf jeden Fall damit beschäftigen! Gruß Uli


Crombo - Sa 05.02.11 15:03

Hallo,

hier mal ein paar Tutorials für XML mit Delphi:
ThaXML [http://www.delphi-treff.de/tutorials/datenspeicherung/thaxml-library/einfuehrung/]
DelphiPRAXiS [http://www.delphipraxis.net/7356-xml-tutorial.html]

Crombo