Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat