![]() |
ListView, ListBox - Unterschiede bei Bild-Tasten
Hallo,
ich habe ein Bildbetrachtungsprogramm mit einer FileListBox geschrieben. Lief alles problemlos. Weil in der Liste der Bild dann allerdings noch andere Eigenschaften als nur der Dateiname angezeigt werden sollten (Dateigröße, Bildmaße,...) entschied ich mich die FileListBox durch ein ListView (ViewStyle=vsReport) zu ersetzen. Prinzipiell funktioniert alles, doch stört mich ein kleines Detail in der Steuerung von ListView: Bei der Benutzung der "Bild aufwärts" bzw. "Bild abwärts" Tasten verhält sich ListView anders als ListBox. Während ListBox immer von der aktuellen Position die Anzahl der vollständig angezeigten Zeilen minus eins auf- oder abwärts geht, fokusiert ListView immer zuerst das erste bzw. letzte vollständig angezeigte Element in der Liste an und erst wenn dieses erreicht wurde, verhält sich ListView wie ListBox. Es ist zwar nur eine Kleinigkeit, stört in dem Programm allerdings sehr. Deshalb wollte ich es ändern. Allerdings finde ich die Position, an der die Bild-Tasten abgefragt werden, einfach nicht. Es hat weder etwas mit den OnKey-Ereignissen (OnKeyDown, OnKeyPress, OnKeyUp) von ListView zu tun, noch findet sich in StdCtrls.pas etwas dazu. Wo wird das Ereignis denn abgefangen und vor allem, wie kann man das Verhalten von ListView dem von ListBox angleichen? Gruß e-gon |
Re: ListView, ListBox - Unterschiede bei Bild-Tasten
Hat keiner eine Idee?
|
Re: ListView, ListBox - Unterschiede bei Bild-Tasten
Ich habe das Problem jetzt mit der Brechstange gelöst. Zwar nicht so sauber, aber es funktioniert.
Falls es jemanden Interessiert:
Delphi-Quellcode:
Vielleicht kennt jemand eine einfachere Möglichkeit die Zeilenhöhe bei ListView zu ermitteln...
procedure TForm1.ListView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); const RowHeightDefault = 14; procedure SetListViewIndex(Sig: Integer); var RowHeightDefault,RowHeight,LVClientHeight,LVClientRowCount,NewIndex: Integer; begin if (Sender as TListView).ViewStyle=vsReport then begin if (Sender as TListView).Items.Count>0 then begin // Zeilenhöhe ermitteln // wenn ListView.CheckBoxes=True Standardzeilenhöhe=17 if (Sender as TListView).Checkboxes then RowHeightDefault:= 17 // sonst Standardzeilenhöhe=14 else RowHeightDefault:= 14; // wenn eine ImageList verknüpft wurde if Assigned((Sender as TListView).SmallImages) then begin RowHeight:= (Sender as TListView).SmallImages.Height; if RowHeight<RowHeightDefault then RowHeight:= RowHeightDefault; end // sonst Standardzeilenhöhe else RowHeight:= RowHeightDefault; // ClientHeight minus Rahmen LVClientHeight:= (Sender as TListView).ClientHeight-2; // ClientHeight ggf. minus Spaltenüberschrift if (Sender as TListView).ShowColumnHeaders then Dec(LVClientHeight,17); // Anzahl voll sichtbarer Elemente minus eins LVClientRowCount:= (LVClientHeight div RowHeight)-1; // neuer theoretischer Index NewIndex:= (Sender as TListView).ItemIndex+(LVClientRowCount*Sig); // theoretischer Index bereinigen if NewIndex>=(Sender as TListView).Items.Count then NewIndex:= (Sender as TListView).Items.Count-1; if NewIndex<0 then NewIndex:= 0; // neues Item anzeigen (Sender as TListView).ItemIndex:= NewIndex; (Sender as TListView).Items[NewIndex].Focused:= True; (Sender as TListView).Items[NewIndex].MakeVisible(True); end; Key:= 1; end; end; begin case Key of VK_PRIOR: SetListViewIndex(-1); // Bild-aufwärts-Taste VK_NEXT: SetListViewIndex(1); // Bild-abwärts-Taste end; end; Ansonsten ist mein Monolog hiermit beendet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 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