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
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#11

Re: Pfade in TStrings abbilden...

  Alt 5. Feb 2009, 10:48
Zitat von himitsu:
können die Unterverzeichnisse wenigstens Alphabetisch sortiert sein, oder müssen die auch in ihrer
Reinfolge bleiben?
Ja es wär mein Ziel gewesen die Reihenfolge so zu belassen...

Zitat von himitsu:
wenn die Unterverzeichnisse auch in ihrer Reinfolge bleiben sollen,
dann wär's wohl am Einfachsten das Ganze in 'nen Baum zu zerlegen und danach neu wieder zusammenzusetzen.
Das habe ich soeben getan, von der Performance her ist es eigentlich soweit verantwortbar. Aber: Das ist doch höchst unschön einen solchen umweg zu machen, oder wie seht ihr das? - Ich bin irgendwie nicht ganz zufrieden mit der Lösung... allerdings würde es so halt funktionieren...

Würdet ihr das so lassen oder findet ihr das auch unschön?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#12

Re: Pfade in TStrings abbilden...

  Alt 5. Feb 2009, 11:04
Hallo,

[OT]In der Zeit, die ich für meinen Vorschlag gebraucht habe, ist die Diskussion schon weit fortgeschritten, daher könnte es sein, dass das folgende schon "veraltet" ist. Schicke den Text aber trotzdem noch ab, eventuell ist ja doch noch ein Denkanstoß zur Problemlösung drin.[/OT]

schau Dir bitte nochmal die Routine an:
Delphi-Quellcode:
procedure TForm1.ForceListItems(sliList:TStrings; sliPath: String; sliPathDelim:Char);
var
  sL: TStringList;
  I: Integer;
  index: Integer;
  path: String;
begin
  sL := TStringList.Create;
  try

    path := sliPath;
    // ersetze den delimiter mit einem zeilenumbruch
    for I := 1 to Length(sliPath) do
      if sliPath[i] = sliPathDelim then
        sliPath[i] := #13;
// der pfad lässt sich nun in den einzelnen elementen
// in eine liste schreiben
    sL.Text := sliPath;

    for I := 0 to sL.Count - 1 do
    begin
      if sliList.IndexOf(sL[i]) = -1 then
      begin
        if (index > 0) then
          sliList.Insert(index,path)
        else
          sliList.Add(path);
      end
      else
        index := sliList.IndexOf(sL[i]) + 1;
    end;
  finally
    FreeAndNil(sL);
  end;
end;
Mir scheint, dass index nicht initialisiert ist, dies könnte zu der unerwünschten Reihenfolge führen. Zumindest beim ersten Durchgang kann ein Fehler auftreten, wenn sliList.IndexOf(sL[i]) = -1 ist.

Wenn ich das bisher richtig sehe, kommst Du nicht um eine eigene Sortierroutine herum, hier hilft Dir dann CustomSort.
Schau mal bitte hier Hier im Forum suchenTStrings.CustomSort, ob Du da einen Denkanstoß für die von Dir benötigte Sortierfunktion finden kannst.

Vermutlich kannst Du Deine Liste nicht an "einem Stück" sortieren, sondern musst da Teilbereiche sortieren, also z. B. aller Einträge die mit GG_IDT_IC beginnen für sich, die mit GG_IDT beginnen für sich... Beim CustomSort kannst Du eine eigene Sortierroutine nutzen, die dies berücksichtigt.
Code:
// Auszug aus Sollsortierung
GG_IDT|RG_P_F
GG_IDT|RG_Taxme
GG_IDT|RG_IC_R
GG_IDT|RG_TC_R
GG_IDT|RG_SC_R
GG_IDT|RG_FV
GG_IDT|RG_IDT
Wenn man sich diesen Ausschnitt aus der "Soll"-Sortierung anschaut, kommt man nicht umhin, eine eigene Vergleichsoperation für Größer und Kleiner zu implementieren. Eine rein alphabetische Sortierung reicht hier sicherlich nicht aus.

Mal noch eine "Spielidee":

Wenn die Originalliste, so wie sie im Eingangspost steht, vollständig ist, könntest Du hergehen, Dir ein Array bauen, das diese Liste enthält und zusätzlich noch einen Integerwert für die Reihenfolge. Das könnte dann eventuell so aussehen:
Delphi-Quellcode:
Type
  trcPfadListe = Record
    sPfad : String;
    iReihenFolge : Integer;
  end;

  tPfadListe = Array[0..255] of trcPfadListe;

var
  Pfadliste : tPfadListe;

begin
  PfadListe[ 0].sPfad := 'GG_AbuWin';
  PfadListe[ 0].iReihenFolge := 7;
  PfadListe[ 1].sPfad := 'GG_Axioma';
  PfadListe[ 1].iReihenFolge := 1;
  PfadListe[ 2].sPfad := 'GG_IDT_IC';
  PfadListe[ 2].iReihenFolge := 8;
  PfadListe[ 3].sPfad := 'GG_IDT_IC|GG_PEKAUsers';
  PfadListe[ 3].iReihenFolge := 11;
  PfadListe[ 4].sPfad := 'GG_IDT_IC|GG_SWF-Spec';
  PfadListe[ 4].iReihenFolge := 9;
  PfadListe[ 5].sPfad := 'GG_IDT_IC|GG_WINAG';
  PfadListe[ 5].iReihenFolge := 14;
  PfadListe[ 6].sPfad := 'GG_IDT_IC|RG_FV_Matrix';
  PfadListe[ 6].iReihenFolge := 12;
  PfadListe[ 7].sPfad := 'GG_IDT_IC|RG_FV_Public';
  PfadListe[ 7].iReihenFolge := 15;
  PfadListe[ 8].sPfad := 'GG_IDT_IC|RG_IDT_WSUS_Admin';
  PfadListe[ 8].iReihenFolge := 10;
  PfadListe[ 9].sPfad := 'GG_IDT_IC|RG_P_F_Matrix';
  PfadListe[ 9].iReihenFolge := 13;
  PfadListe[10].sPfad := 'GG_IDT_IC|RG_P_F_Public';
  PfadListe[10].iReihenFolge := 16;
  PfadListe[11].sPfad := 'GG_OWA-Access';
  PfadListe[11].iReihenFolge := 0;
  PfadListe[12].sPfad := 'GG_Vitruviusdaten';
  PfadListe[12].iReihenFolge := 5;
  PfadListe[13].sPfad := 'GG_Winbau';
  PfadListe[13].iReihenFolge := 2;
  PfadListe[14].sPfad := 'RG_PC_Inventar_Daten';
  PfadListe[14].iReihenFolge := 6;
  PfadListe[15].sPfad := 'zz_alle Direktion P\+F';
  PfadListe[15].iReihenFolge := 3;
  PfadListe[16].sPfad := 'zz_alle Informatikdienste';
  PfadListe[16].iReihenFolge := 4;
Nun kannst Du hergehen und in PfadListe[i].sPfad nach der Zeichenfolge suchen und über PfadListe[i].iReihenFolge die Position in im Ergebnis bestimmen.
Ob das jetzt eine elegante Lösung ist? Weiß nicht so recht.
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#13

Re: Pfade in TStrings abbilden...

  Alt 5. Feb 2009, 11:13
Zitat von nahpets:
Ob das jetzt eine elegante Lösung ist? Weiß nicht so recht.
Ich habs jetzt mit dem Umweg einer TreeView Komponente gemacht. Zuerst wird die originale Liste in die TreeView gefüllt und danach wird aus der TreeView meine gewünschte Liste generiert.

s funktioniert prima und ist noch dazu gar nicht mal so langsam...

Aber trotzdem irgendwie unschön oder?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Pfade in TStrings abbilden...

  Alt 5. Feb 2009, 11:25
du mußt ja keinen echten VCL-Baum nutzen (binäre Bäumchen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#15

Re: Pfade in TStrings abbilden...

  Alt 5. Feb 2009, 11:26
Zitat von himitsu:
du mußt ja keinen echten VCL-Baum nutzen (binäre Bäumchen)
Hmmm... klingt interessant... aber wie realisiere ich so etwas?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.034 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
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#17

Re: Pfade in TStrings abbilden...

  Alt 6. Feb 2009, 08:01
Also ich möchte jetzt son binären Baum... aber keine Ahnung wie man sowas macht?!
Hab hier was gefunden, ist das was, oder hat jemand einen besseren binären Baum für mich?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Pfade in TStrings abbilden...

  Alt 6. Feb 2009, 11:48
das da oben ist schon 'nen kleines Bäumchen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#19

Re: Pfade in TStrings abbilden...

  Alt 6. Feb 2009, 17:56
Zitat von himitsu:
das da oben ist schon 'nen kleines Bäumchen
Danke!

und was hälst du von dem hier?!

was ist jetzt besser?

schönes WE euch allen
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Pfade in TStrings abbilden...

  Alt 6. Feb 2009, 18:27
im Prinzip ist das fast das selbe, nur daß in dem Link eine Doppelt verkettete Liste ist nd diese auf einer Klasse aufbaut.

die eine (Rückwärts)Verkettung könnte könnte man notfalls weglassen (wird hier nicht unbedingt gebraucht).

was jetzt besser ist, müßtest du entscheiden, also was dir besser gefällt.

es sind Beides kleine Objekte/Records, welche miteinander verknüpft werden.

PS: mir fällt grad auf, daß ich da oben das Freigeben vergessen hab
sowas sollte man vielleicht auch noch einbauen, also den Speicher wieder freigeben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 10:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz