Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#12

Re: Pfade in TStrings abbilden...

  Alt 5. Feb 2009, 10: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