[gelöst] ListView mit Mausrad durchscrollen

Rund um die LCL und andere Komponenten
catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

[gelöst] ListView mit Mausrad durchscrollen

Beitrag von catweasel »

Moin

Ich habe ein ListView mit diversen Zeilen. Hier kann ich, ohne das ich etwas extra programmiert habe, mit den Pfeiltasten up und down der Tastatur durchscrollen.
Wie kann ich es hinbekommen auch zusätzlich das Mausrad zu benutzen um durch die Einträge im ListView scrollen zu können?

Gruß und eine schönen Sonntag
Michael
Zuletzt geändert von catweasel am Sa 3. Apr 2010, 18:29, insgesamt 1-mal geändert.

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView mit Mausrad durchscrollen

Beitrag von catweasel »

Ich habe hier das TMouseWheelEvent gefunden mit dem man laut Hilfe die Drehrichtung des Mausrads ermitteln kann. Ich habe gehofft so auf eine Lösung zu kommen, aber irgendwie bekomme ich nicht heraus wie ich damit umgehen muß...

Weiß niemand eine mögliche Lösung für das Problem? :(

Gruß
Michael

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ListView mit Mausrad durchscrollen

Beitrag von pluto »

Eigentlich sollte die ListView diese Funktion von sich Aus mitbringen.... Schau dir mal SynEdit an, dort wird das mit dem Event gelöst, was du gefunden hast. Vielleicht hilft das weiter.
SynEdit ist zwar keine ListView, aber du könntest es als "Vorlage" nutzen.
MFG
Michael Springwald

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView mit Mausrad durchscrollen

Beitrag von catweasel »

pluto hat geschrieben:Eigentlich sollte die ListView diese Funktion von sich Aus mitbringen....
Jein.
Das Mausrad ist nicht am markierten Eintrag in der ListView gekoppelt, sondern an dem vertikalen Scrollbar.
Das bedeutet, ich bekomme nicht, den ersten Eintrag markiert, dann den zweiten Eintrag markiert, dann den dritten Eintrag mariert, usw. sondern alle Einträge werden durch den Scrollbalken rauf und runter gescrollt.

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: ListView mit Mausrad durchscrollen

Beitrag von Teekeks »

Code: Alles auswählen

procedure TForm1.ListBox1MouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if ListBox1.itemindex<(ListBox1.items.count-1) then
    ListBox1.itemindex:=ListBox1.itemindex+1
  else
    ListBox1.itemindex:=0;
  Handled:=true;
end;
Oder so was in der Art.
(ungetestet, sollte aber gehen)

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView mit Mausrad durchscrollen

Beitrag von catweasel »

Teekeks hat geschrieben:

Code: Alles auswählen

procedure TForm1.ListBox1MouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  if ListBox1.itemindex<(ListBox1.items.count-1) then
    ListBox1.itemindex:=ListBox1.itemindex+1
  else
    ListBox1.itemindex:=0;
  Handled:=true;
end;
Oder so was in der Art.
(ungetestet, sollte aber gehen)
Ich hab´s getestet und es funktioniert prima, allerdings weis ich nicht wie ich das in ListView übernehmen kann, da es dort kein MouseWheelDown bzw. MouseWheelUp gibt.
Vielleicht würde es funktionieren eine neue eigene Komponente von ListView abzuleiten und dort MouseWheelDown / Up einzubauen, aber ich habe keine Ahnung wie das funktioniert...

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView mit Mausrad durchscrollen

Beitrag von theo »

catweasel hat geschrieben: Vielleicht würde es funktionieren eine neue eigene Komponente von ListView abzuleiten und dort MouseWheelDown / Up einzubauen, aber ich habe keine Ahnung wie das funktioniert...
Könnte so gehen, wie hier bei TWheelLabel http://www.lazarusforum.de/viewtopic.php?p=27216#p27216" onclick="window.open(this.href);return false;
Probier's mal.

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView mit Mausrad durchscrollen

Beitrag von catweasel »

theo hat geschrieben:
catweasel hat geschrieben: Vielleicht würde es funktionieren eine neue eigene Komponente von ListView abzuleiten und dort MouseWheelDown / Up einzubauen, aber ich habe keine Ahnung wie das funktioniert...
Könnte so gehen, wie hier bei TWheelLabel http://www.lazarusforum.de/viewtopic.php?p=27216#p27216" onclick="window.open(this.href);return false;
Probier's mal.
Moin
Ich habe meine abgeleitete ListView-Komponente entsprechend des angegeben Beitrages erstellt.
Die gute Nachricht: es läßt sich kompilieren, die schlechte: es passiert nichts wenn ich das Mausrad bewege. Ich habe zum Test ob die Proceduren überhaupt angesprungen, wird ein Label auf die Form gelegt und wollte irgendeinen Text ausgeben. Scheinbar werden sie aber nicht angesprungen, da keine Ausgabe erfolgt.

So sieht mein Quelltext zur Zeit aus:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ComCtrls, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
 
  end; 
 
  TMyListView=class(TListView)
  protected
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override;
    function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override;
    function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override;
  published
    property OnMouseWheel;
    property OnMouseWheelDown;
    property OnMouseWheelUp;
  end;
 
var
  Form1: TForm1;
  LV   : TMyListView;
 
implementation
 
 
function TMyListView.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean;
 begin
 end;
 
function TMyListView.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean;
 begin
   form1.Label1.Caption:='Mausrad runter';
 end;
 
function TMyListView.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
 begin
   form1.Label1.Caption:='Mausrad hoch';
 end;
 
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
 LV := TMyListView.Create(form1);
 LV.Top      := 10;
 LV.Left     := 10;
 LV.Width    :=160;
 LV.Height   :=160;
 LV.Visible  :=true;
 LV.ViewStyle:=vsReport;
 LV.Columns.Add;
 LV.Column[0].Caption:='spalte1';
 LV.RowSelect:=true;
 LV.Parent   :=Form1;
 //Daten eingeben
 for i:=0 to 25 do begin LV.Items.Add; LV.Items.Item[i].Caption:=chr(65+i); end;
end;
 
 
initialization
  {$I unit1.lrs}
 
end.

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView mit Mausrad durchscrollen

Beitrag von catweasel »

Ich verstehe einfach nicht warum die beiden funktionen "DoMouseWheelDown" und "DoMouseWheelUp" nicht angesprungen werden.
Wenn ich in "DoMouseWheel" irgendetwas eintrage, hier z.B. die Ausgabe auf Label, dann wird wieder der ganze Scrollbar bewegt. :?

Code: Alles auswählen

function TMyListView.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean;
 begin
   form1.Label1.Caption:='Bewegung des Scrollbars';
 end;
 
function TMyListView.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean;
 begin
   form1.Label1.Caption:='Mausrad runter';
 end;
 
function TMyListView.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
 begin
   form1.Label1.Caption:='Mausrad hoch';
 end;

Jochen
Beiträge: 35
Registriert: So 30. Nov 2008, 23:35

Re: ListView mit Mausrad durchscrollen

Beitrag von Jochen »

Wird denn im Label der jeweilige Text eingetragen? Das funktioniert bei mir ganz ordentlich. Der Scrollbalken wird aber auch bewegt!
Bei mir wird der Text im Label richtig eingetragen. Beim Durchspielen mit dem Debugger sieht man das auch. Die in der abgeleiteten Klasse deklarierten Funktionen

Code: Alles auswählen

function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): boolean; override;
function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): boolean; override;
funktionieren also. Nach Abarbeitung (Text in Label eintragen) wird aber auch noch

Code: Alles auswählen

TWinControl.DoMouseWheel
angesprungen. Keine Ahnung warum, ich dachte das wird mit

Code: Alles auswählen

override
in der Deklaration verhindert.

Gruß, Jochen

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView mit Mausrad durchscrollen

Beitrag von catweasel »

Kaum habe ich hier den nächsten Eintrag eingestellt, bin ich einen kleinen Schritt weiter:

Erst wenn ich den Eintrag:

Code: Alles auswählen

function TMyListView.DoMouseWheel

komplett entferne werden die beiden

Code: Alles auswählen

function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): boolean; override;
function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): boolean; override;
angesprungen.
Allerdings, wie Du schon geschrieben hast, wird auch hier der Scrollbalken bewegt und nicht die markierte Zeile.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ListView mit Mausrad durchscrollen

Beitrag von pluto »

Was genau möchtest du jetzt: Dass die Markierte Zeile bewegt wird, also Verschoben wird oder was genau ? Irgendwie habe ich den "Faden" verloren...

ps: Ich habe auch eine Komplett eigene ListView erstellt, wenn du mir dein gewünschtes Verhalten genauer beschreiben kannst, kann ich es vielleicht bei mir einbauen.
MFG
Michael Springwald

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView mit Mausrad durchscrollen

Beitrag von catweasel »

pluto hat geschrieben:Was genau möchtest du jetzt: Dass die Markierte Zeile bewegt wird, also Verschoben wird oder was genau ? Irgendwie habe ich den "Faden" verloren...

ps: Ich habe auch eine Komplett eigene ListView erstellt, wenn du mir dein gewünschtes Verhalten genauer beschreiben kannst, kann ich es vielleicht bei mir einbauen.
ok, ich versuche es mit anderen Worten zu beschreiben:

Ich habe eine ListView mit vielen Einträgen wobei eine Zeile markiert ist.
Wenn ich jetzt beim "normalen" ListView das Mausrad benutze, dann scrolle ich die markierte Zeile aus dem Sichtfenster des ListView.
Ich möchte das stattdessen der nächste bzw. der vorherige Eintrag markiert wird wenn ich das Mausrad bewege. Erst wenn ich soweit scrolle das der nächste Eintrag aus dem Sichtfenster verschwinden würde soll der Scrollbalken selbst den Eintrag wieder ins Sichtfenster bringen.
Es soll quasi so funktionieren wie beim StringGrig.

Gruß
Michael

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ListView mit Mausrad durchscrollen

Beitrag von pluto »

Jetzt verstehe ich:
Du möchtest das so lange der Eintrag Markiert wird, bis dieser aus dem Sichtfenster verschwindet. In Pseudo--Code in etwa so:
case MouseRad then
0: begin
if ItemIndex-1 >=ItemRectTop then
ItemIndex-1
else
Normales Scrollverhalten
end;

1: begin
if ItemIndex+1 <=ItemRectBottom then
ItemIndex+1
else
Normales Scrollverhalten
end;
Theoretisch könnte ich sowas in meiner ListView Relativ leicht einbauen. Bei einer Standard ListView müsstest von der Standard ListView ableiten und die Methoden
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
überschreiben. Mit Etwas Glück stehen sie dir zu Verfügung.
MFG
Michael Springwald

Jochen
Beiträge: 35
Registriert: So 30. Nov 2008, 23:35

Re: ListView mit Mausrad durchscrollen

Beitrag von Jochen »

pluto hat geschrieben:Jetzt verstehe ich:
Du möchtest das so lange der Eintrag Markiert wird, bis dieser aus dem Sichtfenster verschwindet. ...
Ich glaube nicht! Meiner Meinung nach soll immer der nächste/vorherige Eintrag markiert (nicht verschoben) werden, solang nicht erster/letzter Eintrag. Nur im Fall dass die Markierung aus dem sichtbaren Bereich hinaus läuft soll der Scrollbalken so weit verschoben werden, dass die Markierung wieder sichtbar ist.

Michael (catweasel), wir brauchen Aufklärung!



Jochen

Antworten