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
TStrings.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.