AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pfade in TStrings abbilden...

Offene Frage von "cherry"
Ein Thema von cherry · begonnen am 5. Feb 2009 · letzter Beitrag vom 6. Feb 2009
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.316 Beiträge
 
Delphi 12 Athens
 
#16

Re: Pfade in TStrings abbilden...

  Alt 5. Feb 2009, 11:47
Zitat von cherry:
Hmmm... klingt interessant... aber wie realisiere ich so etwas?
eine verkettete Liste wäre eine Möglichkeit.

[add]
ob's richtig ist, weiß ich jetzt nicht, aber es wirft zumindestens keine exception
Delphi-Quellcode:
Type PMyPath = ^TMyPath;
  TMyPath = Record
    Name: String;
    Child: PMyPath;
    Next: PMyPath;
  End;

Procedure TForm1.ForceListItems(sliList: TStrings; sliPathDelim: Char);
  Procedure Add(Var Root: PMyPath; S3: String);
    Var DelRoot: PMyPath;

    Begin
      sliList.Add(S3 + Root.Name);
      While Assigned(Root.Child) do Add(Root.Child, S3 + Root.Name + sliPathDelim);
      DelRoot := Root;
      Root := Root.Next;
      Dispose(DelRoot);
    End;

  Var Root, Temp, Temp2: PMyPath;
    TempRoot: ^PMyPath;
    S, S2: String;
    i: Integer;

  Begin
    // in Baum zerlegen
    Root := nil;
    While sliList.Count > 0 do Begin
      // Pfad zerlegen
      S := sliList[0];
      sliList.Delete(0);
      TempRoot := @Root;
      While S > 'do Begin
        // Pfadteil extrahieren
        i := Pos(sliPathDelim, S + sliPathDelim);
        S2 := Copy(S, 1, i - 1);
        Delete(S, 1, i);
        // schauen ob's den schon gibt
        Temp := TempRoot^;
        While Assigned(Temp) and not SameText(Temp.Name, S2) do
          Temp := Temp.Next;
        If not Assigned(Temp) Then Begin
          // wenn nicht, dann erstellen
          New(Temp);
          Temp.Name := S2;
          Temp.Child := nil;
          Temp.Next := nil;
          // ist es der erste Subpfad?
          If Assigned(TempRoot^) Then Begin
            nein, dann hinten dranhängen
            Temp2 := TempRoot^;
            While Assigned(Temp2.Next) do Temp2 := Temp2.Next;
            Temp2.Next := Temp;
            TempRoot := @Temp.Child;
          End Else TempRoot^ := Temp; // ja, dann eintragen
        End Else TempRoot := @Temp.Child; // wenn dann weiter mit diesem
      End;
    End;
    // dat Zusammensetzen, hab ich einfach mal rekursiv gelöst,
    // sonst hätt noch 'ne Variable benötigt, oder die Liste noch
    // mehr verketten müssen (war so einfacher :oops: )
    While Assigned(Root) do Add(Root, '');
  End;

Procedure TForm1.FormCreate(Sender: TObject);
  Begin
    ForceListItems(Memo1.Lines, '|');
  End;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz