Cześć.
Całą noc siedziałem i kodziłem, więć już ciężko myśle. A i poza tym małe doświadczenie z sortowaniami. Dlatego proszę bardziej doświadczonych o pomoc. Moja metoda sortujące dla ListView z ustawionym SortType = stData
(bo chyba tak powinno być, ale moge się mylić) poniżej.
Dla kolumn od 0 do 2 włącznie sorotwanie jest ok, tak jak chcę. Jednak dodatkowo chciałbym żeby jeżeli wybierzemy do sortowania kolumnę o indeksie 3, sortowanie dla kolumny wyglądało następująco. Rosnąco tak jak wygląda mój typ, który reprezentuje zmienna RecordingStatus
, czyli:
TRecordingStatus = (rsInProgress, rsAwaiting, rsDone, rsWasError);
Malejąco wiadomo odwrotnie. I tak jest, ale jeżeli będziemy mieli kilka takich samych wartości dla RecordingStatus
to mają one zostać posortowane Alfabetycznie zawsze rosnąco według tego co siedzi w Item1.Caption
oraz Item2.Caption
. Teraz niestety mam wpis na literę "C"
przed wpisem zaczynającym się od "4"
. Także nie ogarniam co jest nie tak. Prosił bym o przykladowe kody. Rozwiązanie pewnie jest banalne, ale nie na mój niewyspany TBrain
;) Z góry dziękuję.
procedure TMainForm.RecordingsLVCompare(Sender : TObject; Item1, Item2 : TListItem; Data : Integer; var Compare : Integer);
var
S1, S2 : string;
I1, I2 : integer;
Dt1, Dt2 : TDateTime;
RD1, RD2 : TRecordingData;
begin
S1 := Item1.Caption;
S2 := item2.Caption;
RD1 := TRecordingData(Item1.Data);
RD2 := TRecordingData(Item2.Data);
case FSortColumn of
0 :
begin
Compare := AnsiCompareStr(S1, S2);
end;
1 :
begin
Dt1 := RD1.Begins;
Dt2 := RD2.Begins;
if Dt1 < Dt2 then
Compare := -1
else
if Dt1 > Dt2 then
Compare := 1
else
Compare := 0;
end;
2 :
begin
Dt1 := RD1.TheEnd;
Dt2 := RD2.TheEnd;
if Dt1 < Dt2 then
Compare := -1
else
if Dt1 > Dt2 then
Compare := 1
else
Compare := 0;
end;
3 :
begin
I1 := Integer(RD1.RecordingStatus);
I2 := Integer(RD2.RecordingStatus);
if I1 < I2 then
Compare := -1
else
if I1 > I2 then
Compare := 1
else
Compare := AnsiCompareStr(S1, S2);
end;
end;
if FSortOrder = soDescending then
begin
Compare := -Compare;
end;
end;