![]() |
Bug in der List-View?
Bleiben wir doch gleich beim Thema: "Was ist hier los?" :stupid: Basierend auf dem Programm aus diesem
![]()
Delphi-Quellcode:
Im "Create"-Construktor der Form muss dann nach der "TODO:"-Aufforderung von Borland dieser IComparer erzeugt und an die List-View übergeben werden:
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;
Delphi-Quellcode:
Und dann fehlt eigentlich nur noch der Spaltenklick:
FSorter := TMainForm.TListViewItemSorter.Create;
lv.ListViewItemSorter := FSorter;
Delphi-Quellcode:
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:
procedure TMainForm.lv_ColumnClick(sender: System.Object;
e: System.Windows.Forms.ColumnClickEventArgs); begin FSorter.SetColumn(e.Column); lv.Sort; end;
Delphi-Quellcode:
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?
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; 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. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz