Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView, ListBox - Unterschiede bei Bild-Tasten (https://www.delphipraxis.net/146736-listview-listbox-unterschiede-bei-bild-tasten.html)

e-gon 26. Jan 2010 11:03


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

e-gon 27. Jan 2010 09:03

Re: ListView, ListBox - Unterschiede bei Bild-Tasten
 
Hat keiner eine Idee?

e-gon 27. Jan 2010 12:34

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:
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;
Vielleicht kennt jemand eine einfachere Möglichkeit die Zeilenhöhe bei ListView zu ermitteln...

Ansonsten ist mein Monolog hiermit beendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz