Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Nach Alphabet sortieren (ValueListEditor) (https://www.delphipraxis.net/12561-nach-alphabet-sortieren-valuelisteditor.html)

TheMiller 29. Nov 2003 19:26


Nach Alphabet sortieren (ValueListEditor)
 
Hi,

wie der Name schon sagt: Wie kann ich die Einträge einer ValueList nach Alphabet sortieren?

himitsu 29. Nov 2003 21:23

Re: Nach Alphabet sortieren (ValueListEditor)
 
Ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif,

Die Einfache Variante:
Delphi-Quellcode:
Var I, I2: Integer;
  S: String;

For I := 0 to ValueListEditor1.Strings.Count - 2 do
  For I2 := I + 1 to ValueListEditor1.Strings.Count - 1 do
    If ValueListEditor1.Strings[I] > ValueListEditor1.Strings[I2] Then Begin
      S := ValueListEditor1.Strings[I];
      ValueListEditor1.Strings[I] := ValueListEditor1.Strings[I2];
      ValueListEditor1.Strings[I2] := S;
    End;
ValueListEditor1.Strings[...] enthält eine Kombination aus Schlüssel und Wert ("Schlüssel=Wert") und wenn genauer sortiert werden soll, muß der String geteilt werden.

Nach Schlüssel:
Delphi-Quellcode:
Var I, I2: Integer;
  S, S2: String;

For I := 0 to ValueListEditor1.Strings.Count - 2 do
  For I2 := I + 1 to ValueListEditor1.Strings.Count - 1 do Begin
    S := Copy(ValueListEditor1.Strings[I], 1, Pos('=',
      ValueListEditor1.Strings[I] - 1);
    S2 := Copy(ValueListEditor1.Strings[I2], 1, Pos('=',
      ValueListEditor1.Strings[I2] - 1);
    If S > S2 Then Begin
      S := ValueListEditor1.Strings[I];
      ValueListEditor1.Strings[I] := ValueListEditor1.Strings[I2];
      ValueListEditor1.Strings[I2] := S;
    End;
  End;
Nach Wert:
Delphi-Quellcode:
Var I, I2: Integer;
  S, S2: String;

For I := 0 to ValueListEditor1.Strings.Count - 2 do
  For I2 := I + 1 to ValueListEditor1.Strings.Count - 1 do Begin
    S := Copy(ValueListEditor1.Strings[I], Pos('=',
      ValueListEditor1.Strings[I] + 1, Length(ValueListEditor1.Strings[I]));
    S2 := Copy(ValueListEditor1.Strings[I2], Pos('=',
      ValueListEditor1.Strings[I2] + 1, Length(ValueListEditor1.Strings[I2]));
    If S > S2 Then Begin
      S := ValueListEditor1.Strings[I];
      ValueListEditor1.Strings[I] := ValueListEditor1.Strings[I2];
      ValueListEditor1.Strings[I2] := S;
    End;
  End;
Oder mal eine Hochgenaue Variante for Schlüssel
Delphi-Quellcode:
Var I, I2: Integer;
  S, S2, S3, S4: String;

For I := 0 to ValueListEditor1.Strings.Count - 2 do
  For I2 := I + 1 to ValueListEditor1.Strings.Count - 1 do Begin
    S := Copy(ValueListEditor1.Strings[I], 1, Pos('=',
      ValueListEditor1.Strings[I] - 1);
    S2 := Copy(ValueListEditor1.Strings[I], Pos('=',
      ValueListEditor1.Strings[I] + 1, Length(ValueListEditor1.Strings[I]));
    S3 := Copy(ValueListEditor1.Strings[I2], 1, Pos('=',
      ValueListEditor1.Strings[I2] - 1);
    S4 := Copy(ValueListEditor1.Strings[I2], Pos('=',
      ValueListEditor1.Strings[I2] + 1, Length(ValueListEditor1.Strings[I2]));
    While Length(S) < Length(S3) do S := S + ' ';
    While Length(S3) < Length(S) do S3 := S3 + ' ';
    While Length(S2) < Length(S4) do S2 := S2 + ' ';
    While Length(S4) < Length(S2) do S4 := S4 + ' ';
    If (S > S3) or ((S = S3) and (S2 > S4)) Then Begin
      S := ValueListEditor1.Strings[I];
      ValueListEditor1.Strings[I] := ValueListEditor1.Strings[I2];
      ValueListEditor1.Strings[I2] := S;
    End;
  End;
Und noch mal für Wert:
Delphi-Quellcode:
Var I, I2, I3: Integer;
  S, S2, S3, S4: String;

For I := 0 to ValueListEditor1.Strings.Count - 2 do
  For I2 := I + 1 to ValueListEditor1.Strings.Count - 1 do Begin
    S := Copy(ValueListEditor1.Strings[I], 1, Pos('=',
      ValueListEditor1.Strings[I] - 1);
    S2 := Copy(ValueListEditor1.Strings[I], Pos('=',
      ValueListEditor1.Strings[I] + 1, Length(ValueListEditor1.Strings[I]));
    S3 := Copy(ValueListEditor1.Strings[I2], 1, Pos('=',
      ValueListEditor1.Strings[I2] - 1);
    S4 := Copy(ValueListEditor1.Strings[I2], Pos('=',
      ValueListEditor1.Strings[I2] + 1, Length(ValueListEditor1.Strings[I2]));
    While Length(S) < Length(S3) do S := S + ' ';
    While Length(S3) < Length(S) do S3 := S3 + ' ';
    While Length(S2) < Length(S4) do S2 := S2 + ' ';
    While Length(S4) < Length(S2) do S4 := S4 + ' ';
    If (S2 > S4) or ((S2 = S4) and (S > S3)) Then Begin
      S := ValueListEditor1.Strings[I];
      ValueListEditor1.Strings[I] := ValueListEditor1.Strings[I2];
      ValueListEditor1.Strings[I2] := S;
    End;
  End;
http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

TheMiller 30. Nov 2003 00:14

Re: Nach Alphabet sortieren (ValueListEditor)
 
:shock: *plattis*

Das ist eigentlich "Code-Lobrary-Reif"

Naja, ich denke was du sagen willst. Ich bin sehr sehr erfreut und es funzt einwandtfrei. Vielen Dank für deine Bemühungen ;-)

scp 30. Nov 2003 00:36

Re: Nach Alphabet sortieren (ValueListEditor)
 
Nur der Vollstängkeit halber: Die Namen / Werte lassen sich auch ohne umständliches Copy() ermitteln:

Delphi-Quellcode:
  ValueListEditor1.Strings.Names[I]
bzw.
Delphi-Quellcode:
  ValueListEditor1.Strings.Values['Name'];
Oder die Kombination, um einen Wert per Index zu bekommen:
Delphi-Quellcode:
  ValueListEditor1.Strings.Values[ValueListEditor1.Strings.Names[I]]

himitsu 30. Nov 2003 02:02

Re: Nach Alphabet sortieren (ValueListEditor)
 
Noch ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif,

hatte mit ValueListEditor noch nicht so viel zu tun.
Also jetzt noch mal überarbeitet.

Hab sogar noch eine Verbesserung gefunden:
Delphi-Quellcode:
ValueListEditor1.Strings.Values[ValueListEditor1.Strings.Names[I]]
{=}
ValueListEditor1.Strings.ValueFromIndex[I]
Nach Schlüsseln in aufsteigender Reihfolge (A => Z):
Delphi-Quellcode:
Var I, I2: Integer;
  S: String;

For I := 0 to ValueListEditor1.Strings.Count - 2 do
  For I2 := I + 1 to ValueListEditor1.Strings.Count - 1 do
    If (ValueListEditor1.Strings.Names[I] > ValueListEditor1.Strings.Names[I2]) or
      ((ValueListEditor1.Strings.Names[I] = ValueListEditor1.Strings.Names[I2]) and
      (ValueListEditor1.Strings.ValueFromIndex[I] > ValueListEditor1.Strings.ValueFromIndex[I2])) Then Begin
      S := ValueListEditor1.Strings[I];
      ValueListEditor1.Strings[I] := ValueListEditor1.Strings[I2];
      ValueListEditor1.Strings[I2] := S;
    End;
Nach Werten in aufsteigender Reihfolge (A => Z):
Delphi-Quellcode:
Var I, I2: Integer;
  S: String;

For I := 0 to ValueListEditor1.Strings.Count - 2 do
  For I2 := I + 1 to ValueListEditor1.Strings.Count - 1 do
    If (ValueListEditor1.Strings.ValueFromIndex[I] > ValueListEditor1.Strings.ValueFromIndex[I2]) or
      ((ValueListEditor1.Strings.ValueFromIndex[I] = ValueListEditor1.Strings.ValueFromIndex[I2]) and
      (ValueListEditor1.Strings.Names[I] > ValueListEditor1.Strings.Names[I2])) Then Begin
      S := ValueListEditor1.Strings[I];
      ValueListEditor1.Strings[I] := ValueListEditor1.Strings[I2];
      ValueListEditor1.Strings[I2] := S;
    End;
Nach Schlüsseln in fallender Reihnfolge (Z => A):
Delphi-Quellcode:
Var I, I2: Integer;
  S: String;

For I := 0 to ValueListEditor1.Strings.Count - 2 do
  For I2 := I + 1 to ValueListEditor1.Strings.Count - 1 do
    If (ValueListEditor1.Strings.Names[I] < ValueListEditor1.Strings.Names[I2]) or
      ((ValueListEditor1.Strings.Names[I] = ValueListEditor1.Strings.Names[I2]) and
      (ValueListEditor1.Strings.ValueFromIndex[I] < ValueListEditor1.Strings.ValueFromIndex[I2])) Then Begin
      S := ValueListEditor1.Strings[I];
      ValueListEditor1.Strings[I] := ValueListEditor1.Strings[I2];
      ValueListEditor1.Strings[I2] := S;
    End;
Nach Werten in fallender Reihfolge (Z => A):
Delphi-Quellcode:
Var I, I2: Integer;
  S: String;

For I := 0 to ValueListEditor1.Strings.Count - 2 do
  For I2 := I + 1 to ValueListEditor1.Strings.Count - 1 do
    If (ValueListEditor1.Strings.ValueFromIndex[I] < ValueListEditor1.Strings.ValueFromIndex[I2]) or
      ((ValueListEditor1.Strings.ValueFromIndex[I] = ValueListEditor1.Strings.ValueFromIndex[I2]) and
      (ValueListEditor1.Strings.Names[I] < ValueListEditor1.Strings.Names[I2])) Then Begin
      S := ValueListEditor1.Strings[I];
      ValueListEditor1.Strings[I] := ValueListEditor1.Strings[I2];
      ValueListEditor1.Strings[I2] := S;
    End;
http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif http://www.FrankNStein.de/Smiley-Spinne.gif http://www.FrankNStein.de/Smiley-Winken.gif

Wormid 30. Nov 2003 02:51

Re: Nach Alphabet sortieren (ValueListEditor)
 
Mal als billige alternative:

Delphi-Quellcode:
var SortList: TStringList;
begin
  SortList := TStringList.Create;
  with ValueListEditor1 do
  begin
    SortList.Assign(Strings);
    SortList.Sort;
    Strings.Assign(SortList);
  end;
  SortList.Free;
end;
Das sortiert die Einträge jetzt aufsteigend... für Absteigend müsste man das entweder rückwärts zurückkopieren (billige Version), oder aber man müsste mit CustomSort arbeiten (der korrekte Weg).

Gruß

Wormid

arc 8. Jun 2013 23:59

AW: Nach Alphabet sortieren (ValueListEditor)
 
Dieser Tip war Gold wert! Vielen Dank dafür 8-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 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