Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Scrollen in TListView


csigg - Di 05.04.05 11:45
Titel: Scrollen in TListView
ich brauch ein OnScroll Event oder sowas ähnliches für mein TListView, aber sowas gibts hier nicht, kann mir jemand sagen wie ich mir ähnlich weiterhelfen kann??


Lannes - Do 07.04.05 14:55

Hallo,

mit einer Suche nach "WM_VSCROLL" müsstest Du einen Ansatz für Deine Problemlösung finden.


csigg - Fr 08.04.05 13:35

Ich hab nur das hier gefunden,

Delphi-Quelltext
1:
SendMessage(ListBox1.Handle,WM_VSCROLL,SB_BOTTOM,0);                    

Ich will aber abfragen ob grad gescrollt wird.
Kann ich über das WM_VSCROLL auch ne Abfrage erstellen??


csigg - Fr 08.04.05 13:51

Nachtrag zu oben:

ich sollte das irgendwie in mein Form reinbekommen, das immer wenn man im ListView Scrollt, sich die ansicht aktualisiert.
hab im Moment kein plan wie ich das machen soll.


Lannes - Fr 08.04.05 21:15

Hallo,

- welchen ViewStyle benutzt Du im ListView? vsReport oder ...?
- was willst Du erreichen mit der Aktualisierung?

Also ich gehe jetzt mal von vsReport aus.
Du musst folgende Aktionen des Anwenders berücksichtigen die zu einem Scrollvorgang führen.
1. Mausrad = WM_MOUSEWHEEL
2. Benutzung der senkrechten Scrollleiste = WM_VSCROLL
3. und waagerechte Scrollleiste = WM_HSCROLL
4. Cursor-Tasten, PageDown, PageUp, Pos1, Ende = in onKeyPress
5. und alle anderen Tasten die auch zum Scrollen führen,
weil man ja über die Eingabe eines Anfangszeichen der Item-Caption zu diesem Item scrollen kann.

Hier der Code um Mausrad und Scrollleiste Punkt 1. - 3. zu erkennen.
Ich hab mal WM_HSCROLL auskommentiert.
Den Code entsprechend des Beispiels an die richtigen Stellen in deine Unit einbauen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
//...
  private
    { Private-Deklarationen }
   ListView1Proc : TWndMethod;
  procedure ListView1WindowProc(var Message: TMessage);
//...
implementation

{$R *.DFM}

procedure TForm1.ListView1WindowProc(var Message: TMessage);
begin
  ListView1Proc(Message);
  if ((Message.Msg = WM_VSCROLL) {or (Message.Msg = WM_HSCROLL)} or
      (Message.msg = WM_MOUSEWHEEL)) then
    begin
    //Hier kommt dein Code rein
    //dieses Beispiel gibt Dir die Caption des ersten sichtbaren Items aus
    if ListView1.Items.Count > 0 then//zur Fehlervermeidung
      Label1.Caption := 'Gescrollt ! '
                        +'TopItem.Caption ist jetzt : '
                        +ListView1.TopItem.Caption;
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListView1Proc := ListView1.WindowProc;
  ListView1.WindowProc := ListView1WindowProc;
end;
//...
end.


Die weiteren Punkte 4. u. 5. kannst Du im ListView1onKeyPress bearbeiten.


csigg - Mo 11.04.05 11:26

hat sich erledigt, die anforderungen an mein Programm haben sich geändert.