Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi CheckListBox auf- und absteigend sortieren (https://www.delphipraxis.net/164306-checklistbox-auf-und-absteigend-sortieren.html)

Alex.G 7. Nov 2011 15:27

Delphi-Version: 7

CheckListBox auf- und absteigend sortieren
 
Hallo.

Eine CheckListBox kann man ja ganz einfach mit
Code:
.Sorted := True;
aufsteigend sortieren.
Ich möchte aber per ButtonClick einstellen können, ob die CLB auf- oder absteigend sortiert werden soll. Muss ich dafür schon einen Sortieralgorithmus benutzen, oder gibt es da einen Einzeiler von Delphi?

Gruß

DeddyH 7. Nov 2011 15:30

AW: CheckListBox auf- und absteigend sortieren
 
Sorted sortiert IIRC immer aufsteigend, Du wirst also CustomSort verwenden müssen.

himitsu 7. Nov 2011 15:39

AW: CheckListBox auf- und absteigend sortieren
 
Sorted setzt das CBS_SORT in den Window-Styles ... was genau damit los ist, steht im MSDN.

Alex.G 7. Nov 2011 15:40

AW: CheckListBox auf- und absteigend sortieren
 
Zitat:

Zitat von DeddyH (Beitrag 1134879)
Sorted sortiert IIRC immer aufsteigend, Du wirst also CustomSort verwenden müssen.

Funktioniert CustomSort auch bei einer CheckListBox? Finde da die CustomSort-Methode leider nicht.

DeddyH 7. Nov 2011 15:46

AW: CheckListBox auf- und absteigend sortieren
 
Zur Not in eine TStringlist kopieren, diese mit CustomSort sortieren und wieder zurückkopieren. Die Checked-Eigenschaft kannst Du dabei mit einem üblen Cast als Object hinterlegen, damit sie nicht verloren geht.

[edit] CBS_SORT? Nicht LBS_SORT? [/edit]

[edit2] Oder ohne TStringlist:
Delphi-Quellcode:
type
  TSortFunc = function(List: TStrings; Index1, Index2: Integer): Integer;

function CompareASC(List: TStrings; Index1, Index2: Integer): Integer;
begin
  Result := StrComp(PChar(List[Index1]), PChar(List[Index2]));
end;

function CompareDESC(List: TStrings; Index1, Index2: Integer): Integer;
begin
  Result := - CompareASC(List, Index1, Index2);
end;

procedure QuickSort(L, R: Integer; List: TStrings; SCompare: TSortFunc);
var
  I, J, P: Integer;
begin
  repeat
    I := L;
    J := R;
    P := (L + R) shr 1;
    repeat
      while SCompare(List, I, P) < 0 do Inc(I);
      while SCompare(List, J, P) > 0 do Dec(J);
      if I <= J then
      begin
        List.Exchange(I, J);
        if P = I then
          P := J
        else if P = J then
          P := I;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then QuickSort(L, J, List, SCompare);
    L := I;
  until I >= R;
end;
Beispielaufruf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  CheckListBox1.Items.BeginUpdate;
  try
    QuickSort(0, CheckListBox1.Items.Count - 1, CheckListBox1.Items, CompareASC);
  finally
    CheckListBox1.Items.EndUpdate;
  end;
end;
[/edit2]

himitsu 7. Nov 2011 20:31

AW: CheckListBox auf- und absteigend sortieren
 
Zitat:

CBS_SORT? Nicht LBS_SORT?
Hab's so kopiert und mich wohl verkopiert, also stimmt ... LBS_SORT :oops:


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