Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
Delphi 12 Athens
|
Re: Pfade in TStrings abbilden...
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
|
|
Zitat
|