Bleiben wir doch gleich beim Thema: "Was ist hier los?"
Basierend auf dem Programm aus diesem
Beitrag wollte ich die List-View mit einer Sortierung ausstatten. Lässt sich ja recht fix nachvollziehen:
Delphi-Quellcode:
type
TMainForm = class(System.Windows.Forms.Form)
{ ... }
private
type
TListViewItemSorter = class(TInterfacedObject, IComparer)
private
FColumn: Integer;
FDescending: Boolean;
procedure SetColumn(Value: Integer);
public
function Compare(x: &Object; y: &Object): Integer;
property Column: Integer read FColumn write SetColumn;
end;
private
FSorter: TMainForm.TListViewItemSorter;
{ ... }
implementation
function TMainForm.TListViewItemSorter.Compare(x: &Object; y: &Object): Integer;
begin
Result := System.String.Compare(ListViewItem(x).SubItems[FColumn].Text,
ListViewItem(y).SubItems[FColumn].Text);
if FDescending then
Result := -Result;
end;
procedure TMainForm.TListViewItemSorter.SetColumn(Value: Integer);
begin
if FColumn = Value then
FDescending := not FDescending
else
begin
FDescending := False;
FColumn := Value;
end;
end;
Im "Create"-Construktor der Form muss dann nach der "TODO:"-Aufforderung von Borland dieser
IComparer erzeugt und an die List-View übergeben werden:
Delphi-Quellcode:
FSorter := TMainForm.TListViewItemSorter.Create;
lv.ListViewItemSorter := FSorter;
Und dann fehlt eigentlich nur noch der Spaltenklick:
Delphi-Quellcode:
procedure TMainForm.lv_ColumnClick(sender: System.Object;
e: System.Windows.Forms.ColumnClickEventArgs);
begin
FSorter.SetColumn(e.Column);
lv.Sort;
end;
So weit, so gut ... Aber wenn ich jetzt die Reload-Funktion (4. Button in der Toolbar) aufrufe, dann fehlen plötzlich Einträge, usw. Ich dachte zuerst an ein Problem mit der Registry. Aber ich habe den Code mal deaktiviert und in der "LoadRegKeys"-Prozedur einfach Fake-Items erzeugen lassen:
Delphi-Quellcode:
for i := 1 to 100 do
begin
lv.Items.Add(Convert.ToString(i) + '. Eintrag');
for j := 1 to 4 do
begin
lv.Items[lv.Items.Count-1].SubItems.Add(
Convert.ToString(j) + '. Untereintrag'
);
end;
end;
Das gleiche Ergebnis. Die Sortierung funktioniert zwar wunderbar, aber sobald man die Items neu lädt, werden einige nicht angezeigt. Meist sind das die SubItems. Was ist die Ursache?
btw: Diese Sortiergeschichte stammt aus der Borland-Demo "CultureInfo". So gut bin ich mit .NET dann doch noch nicht, dass ich solche Sachen mal eben so nebenbei schreibe.