[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)

Re: ListView mit Mausrad durchscrollen

Beitrag von catweasel »

Jochen hat geschrieben:
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
Hallo zusammen

Jochen hat recht, so hatte ich es geplant.

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 »

Wenn der ItemIndex aus dem Sichtbereich Läuft, soll dann Seitenweise gescrollt werden ? Also eine Seite vor bzw. Zurück ?
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:Wenn der ItemIndex aus dem Sichtbereich Läuft, soll dann Seitenweise gescrollt werden ? Also eine Seite vor bzw. Zurück ?
Ich finde es für die Augen angenehmer zu verfolgen wenn im ListView immer um eine Zeile gescrollt wird, als immer der komplette Inhalt des ganzen Fensters.

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 »

Dann ist das ganz doch recht einfach:
Es gibt da ein Event. Das wird aufgerufen wenn du das Mausrad betätigst. Jetzt musst du "nur" noch dort Feststellen, in welcher Richtung das Maus Rad betätigt wird und kannst den ItemIndex entsprechend ändern.
Wie diese Botschaft heißt, verrate ich erst mal aus "Taktischen" gründen nicht. Siehe es als "Oster-Eier-Suchen" an *G*. Wenn du Probleme mit der Ermittlung der Richtung hast, hier hätte ich ein Stück Code anzubieten.
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:Dann ist das ganz doch recht einfach:
Es gibt da ein Event. Das wird aufgerufen wenn du das Mausrad betätigst. Jetzt musst du "nur" noch dort Feststellen, in welcher Richtung das Maus Rad betätigt wird und kannst den ItemIndex entsprechend ändern.
Wie diese Botschaft heißt, verrate ich erst mal aus "Taktischen" gründen nicht. Siehe es als "Oster-Eier-Suchen" an *G*. Wenn du Probleme mit der Ermittlung der Richtung hast, hier hätte ich ein Stück Code anzubieten.
Meinst Du jetzt die ListView Standard-Komponente, oder die von mir abgeleitete?

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)

Heureka...

Beitrag von catweasel »

...ich habs :D

Dieser Tag ist würdig ein Kreuz in meinem Kalender zu bekommen!
Jetzt geht es wie ich es wollte.

Falls noch mal jemand das gleiche Problem haben sollte das Mausrad in einem Listview zu benötigen, hier mein Beispielcode wie es funktioniert. Einfach eine Form ohne weitere Komponenten darauf. Der ListView wird zur Laufzeit ertstellt:

Danke an alle für die Tips und Hinweise
Gruß und noch schöne Ostern
Michael

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)
        procedure FormCreate(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
 
      end;
 
      // Eigene ListView erstellen
      TMyListView=class(TListView)
      protected
        function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override;
        function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override;
      end;
 
    var
      Form1: TForm1;
      LV   : TMyListView;
 
    implementation
 
    // Mausrad down
    function TMyListView.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean;
     begin
       if LV.Selected.Index+1<LV.Items.Count then begin
            LV.Items[LV.Selected.Index+1].Selected:=true;
            LV.Items[LV.Selected.Index].Focused:=true;
            LV.Selected.MakeVisible(true);
       end;
     end;
 
     // Mausrad up
    function TMyListView.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
     begin
       if LV.Selected.Index>0 then begin
            LV.Items[LV.Selected.Index-1].Selected:=true;
            LV.Items[LV.Selected.Index].Focused:=true;
            LV.Selected.MakeVisible(true);
       end;
     end;
 
 
    { TForm1 }
 
    procedure TForm1.FormCreate(Sender: TObject);
    var i:integer;
    begin
     //Abgeleitete ListView Komponente zur Laufzeit erstellen
     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;
     //Ersten Datensatz markieren und Fokus geben
     LV.Items[0].Selected:=true;
     LV.Items[0].Focused:=true;
     LV.Selected.MakeVisible(true);
    end;
 
 
    initialization
      {$I unit1.lrs}
 
    end.

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

Re: [gelöst] ListView mit Mausrad durchscrollen

Beitrag von Jochen »

Super dass es so funktioniert!
Ich bin leider immer noch ein wenig verwundert. Die Funktionen verrichten ihre Arbeit zwar tadellos, kommentiere ich allerdings alles heraus was sich auf das ListView bezieht, dann bewegt sich der Scrollbalken wieder!

Code: Alles auswählen

function TMyListView.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): boolean;
begin
  form1.Label1.Caption := 'Mausrad runter';
  {
  if lv.Selected.Index + 1 < lv.Items.Count then
  begin
    LV.Items[LV.Selected.Index + 1].Selected := True;
    LV.Items[LV.Selected.Index].Focused      := True;
    LV.Selected.MakeVisible(True);
  end;
  }
end;
Erste Vermutung war, dass der Srollbalken bewegt wird, dann aber sofort der nächste/vorherige Eintrag selektiert wird. Ich dachte, dass man darurch die Bewegung des Scrollbalkens nicht sieht.

Aber denkste! Entferne ich den Kommentar nur vom

Code: Alles auswählen

if lv.Selected.Index + 1 < lv.Items.Count then
...
, bleibt der Balken wo er ist.

Code: Alles auswählen

function TMyListView.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): boolean;
begin
  form1.Label1.Caption := 'Mausrad runter';
  if lv.Selected.Index + 1 < lv.Items.Count then
  begin
    //LV.Items[LV.Selected.Index + 1].Selected := True;
    //LV.Items[LV.Selected.Index].Focused      := True;
    //LV.Selected.MakeVisible(True);
  end;
end;
Woher kommt dieses Verhalten?

@Pluto: Meinst du WMMouseWheel in TControl? Ich will ja dort nichts überschreiben, wie kann ich also so ein Event abfangen und meinen eigenen Code ausführen? Ich hab da gar keine Ahnung von ...

Gruß, Jochen

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: [gelöst] ListView mit Mausrad durchscrollen

Beitrag von pluto »

Für das Verhalten habe ich im Moment keine Erklärung. Zu deiner Frage: Du musst überschreiben, eine andere Lösung wird es hier nicht geben...
MFG
Michael Springwald

Antworten