Autor Beitrag
padawan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35
Erhaltene Danke: 1



BeitragVerfasst: Sa 05.02.11 13:59 
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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Crombo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 54
Erhaltene Danke: 8

Windows 7, Windows Vista, Windows XP
Delphi XE Architect, Visual Studio 2010 Professional
BeitragVerfasst: Sa 05.02.11 14:16 
Eine andere Möglichkeit anstatt XML wäre JSON. Mag jetzt vielleicht etwas komisch klingen Javascript Object Notation in Delphi? Delphi-Wrapper

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

_________________
one day your life will flash before your eyes. make sure it's worth watching
padawan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 54
Erhaltene Danke: 8

Windows 7, Windows Vista, Windows XP
Delphi XE Architect, Visual Studio 2010 Professional
BeitragVerfasst: Sa 05.02.11 15:03 
Hallo,

hier mal ein paar Tutorials für XML mit Delphi:
ThaXML
DelphiPRAXiS

Crombo

_________________
one day your life will flash before your eyes. make sure it's worth watching

Für diesen Beitrag haben gedankt: padawan