AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi ListView, ListBox - Unterschiede bei Bild-Tasten

ListView, ListBox - Unterschiede bei Bild-Tasten

Ein Thema von e-gon · begonnen am 26. Jan 2010 · letzter Beitrag vom 27. Jan 2010
Antwort Antwort
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
154 Beiträge
 
Delphi 6 Enterprise
 
#1

ListView, ListBox - Unterschiede bei Bild-Tasten

  Alt 26. Jan 2010, 12:03
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
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
154 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: ListView, ListBox - Unterschiede bei Bild-Tasten

  Alt 27. Jan 2010, 10:03
Hat keiner eine Idee?
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
154 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: ListView, ListBox - Unterschiede bei Bild-Tasten

  Alt 27. Jan 2010, 13:34
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf