Einzelnen Beitrag anzeigen

Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#1

ListView bzw. StringList sortieren...

  Alt 10. Jun 2002, 18:08
Hi!

Dann werde ich mal austesten, ob ich hier geholfen bekomme

Also, ich verwende folgenden Code in meinem Programm, mit dem ich eine ListView nach angeklickter Column sortiere (stört euch nicht an der Komponente SmartListView - ist eine einfache ListView Komponente, nur kann man damit schnell und einfach die Inhalte speichern):

Code:
function CustomSortProc(Item1, Item2: TListItem; SortColumn: Integer): Integer; stdcall;
var
  s1, s2: string;
  i1, i2: Integer;
  r1, r2: Boolean;
  d1, d2: TDateTime;

  { Helper functions }

  function IsValidNumber(AString : string; var AInteger : Integer): Boolean;
  var
    Code: Integer;
  begin
    Val(AString, AInteger, Code);
    Result := (Code = 0);
  end;

  function IsValidDate(AString : string; var ADateTime : TDateTime): Boolean;
  begin
    Result := True;
    try
      ADateTime := StrToDateTime(AString);
    except
      ADateTime := 0;
      Result := False;
    end;
  end;

  function CompareDates(dt1, dt2: TDateTime): Integer;
  begin
    if (dt1 > dt2) then Result := 1
    else
      if (dt1 = dt2) then Result := 0 
    else
      Result := -1;
  end;

  function CompareNumeric(AInt1, AInt2: Integer): Integer;
  begin
    if AInt1 > AInt2 then Result := 1 
    else
      if AInt1 = AInt2 then Result := 0
    else
      Result := -1;
  end;

begin
  Result := 0;

  if (Item1 = nil) or (Item2 = nil) then Exit;

  case SortColumn of
    -1 :
    { Compare Captions } 
    begin
      s1 := Item1.Caption;
      s2 := Item2.Caption;
    end;
    else
    { Compare Subitems } 
    begin
      s1 := '';
      s2 := '';
      { Check Range }
      if (SortColumn < Item1.SubItems.Count) then
        s1 := Item1.SubItems[SortColumn];
      if (SortColumn < Item2.SubItems.Count) then
        s2 := Item2.SubItems[SortColumn]
    end;
  end;

  { Sort styles }

  case LvSortStyle of
    cssAlphaNum : Result := lstrcmp(PChar(s1), PChar(s2));
    cssNumeric : begin
                    r1 := IsValidNumber(s1, i1);
                    r2 := IsValidNumber(s2, i2);
                    Result := ord(r1 or r2);
                    if Result <> 0 then
                      Result := CompareNumeric(i1, i2);
                  end;
    cssDateTime : begin
                    r1 := IsValidDate(s1, d1);
                    r2 := IsValidDate(s2, d2);
                    Result := ord(r1 or r2);
                    if Result <> 0 then
                      Result := CompareDates(d1, d2);
                  end;
  end;

  { Sort direction }

  if LvSortOrder[SortColumn + 1] then
    Result := - Result;
end;
Dann baue ich bei OnColumnClick folgenden Code ein, mit dem ich festlege, welche Column welche Art von Sortierung besitzen soll:

Code:
procedure TForm1.SmartListView1ColumnClick(Sender: TObject;
  Column: TListColumn);
begin
if Column.Index = 1 then
LvSortStyle := cssAlphaNum;
if Column.Index = 2 then
LvSortStyle := cssDateTime;
if Column.Index = 3 then
LvSortStyle := cssDateTime;
if Column.Index = 4 then
LvSortStyle := cssAlphaNum;
if Column.Index = 5 then
LvSortStyle := cssAlphaNum;

SmartListView1.CustomSort(@CustomSortProc, Column.Index -1);

end;
Mein Problem ist nun aber, dass ich parallel zu den Daten in der ListView noch Daten in einer StringList habe. Diese sollen natürlich mitsortiert werden, sonst werden die Daten ja durcheinander gewirbelt.

Folgenden Code habe ich schon getestet, funktioniert aber nicht:

Code:
TerminList : TStringList;
begin
TerminList.CustomSort(@CustomSortProc);
end;
Ich bekomme dann einen Ausnahmefehler.

Wäre echt nett, wenn mir jemand sagen könnte, worin mein Problem besteht.

Gruß Yheeky
  Mit Zitat antworten Zitat