[gelöst] ListView mit Mausrad durchscrollen
-
- 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
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
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.
-
- 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
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
Weiß niemand eine mögliche Lösung für das Problem?

Gruß
Michael
-
- 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
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.
SynEdit ist zwar keine ListView, aber du könntest es als "Vorlage" nutzen.
MFG
Michael Springwald
Michael Springwald
-
- 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
Jein.pluto hat geschrieben:Eigentlich sollte die ListView diese Funktion von sich Aus mitbringen....
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.
-
- 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
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;
(ungetestet, sollte aber gehen)
-
- 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
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.Teekeks hat geschrieben:Oder so was in der Art.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;
(ungetestet, sollte aber gehen)
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...
Re: ListView mit Mausrad durchscrollen
Könnte so gehen, wie hier bei TWheelLabel http://www.lazarusforum.de/viewtopic.php?p=27216#p27216" onclick="window.open(this.href);return false;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...
Probier's mal.
-
- 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
Mointheo hat geschrieben:Könnte so gehen, wie hier bei TWheelLabel http://www.lazarusforum.de/viewtopic.php?p=27216#p27216" onclick="window.open(this.href);return false;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...
Probier's mal.
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.
-
- 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
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.
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;
Re: ListView mit Mausrad durchscrollen
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 funktionieren also. Nach Abarbeitung (Text in Label eintragen) wird aber auch noch angesprungen. Keine Ahnung warum, ich dachte das wird mit in der Deklaration verhindert.
Gruß, Jochen
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;
Code: Alles auswählen
TWinControl.DoMouseWheel
Code: Alles auswählen
override
Gruß, Jochen
-
- 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
Kaum habe ich hier den nächsten Eintrag eingestellt, bin ich einen kleinen Schritt weiter:
Erst wenn ich den Eintrag:
komplett entferne werden die beiden
angesprungen.
Allerdings, wie Du schon geschrieben hast, wird auch hier der Scrollbalken bewegt und nicht die markierte Zeile.
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;
Allerdings, wie Du schon geschrieben hast, wird auch hier der Scrollbalken bewegt und nicht die markierte Zeile.
-
- 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
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.
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
Michael Springwald
-
- 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
ok, ich versuche es mit anderen Worten zu beschreiben: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.
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
-
- 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
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:
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.
Du möchtest das so lange der Eintrag Markiert wird, bis dieser aus dem Sichtfenster verschwindet. In Pseudo--Code in etwa so:
Theoretisch könnte ich sowas in meiner ListView Relativ leicht einbauen. Bei einer Standard ListView müsstest von der Standard ListView ableiten und die Methodencase 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;
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
Michael Springwald
Re: ListView mit Mausrad durchscrollen
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.pluto hat geschrieben:Jetzt verstehe ich:
Du möchtest das so lange der Eintrag Markiert wird, bis dieser aus dem Sichtfenster verschwindet. ...
Michael (catweasel), wir brauchen Aufklärung!
Jochen