In Listview Programmatisch scrollen

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

In Listview Programmatisch scrollen

Beitrag von corpsman »

Servus zusammen ich habe in meiner Copy Commander Anwendung ein TListview im Einsatz.

Nun ist es so, dass wenn man aus einem Unterverzeichnis "zurück" wechselt. Ich dem User ganz gerne den Eintrag anzeigen würde aus welchem er kam, dazu sucht meine Anwendung den entsprechenden Eintrag in der Listview heraus und versucht diesen dann mittels:

Code: Alles auswählen


Procedure ListViewSelectItemIndex(Const Listview: TListView; aIndex: integer);
Var
  Idx: Integer;
Begin
  If aindex >= Listview.Items.Count Then exit;
  If Not assigned(Listview.TopItem) Then exit;
  form1.caption := 'Index: ' + inttostr(aIndex + 1); // In der Caption zeigen welcher Eintrag angewählt wurde
  Listview.BeginUpdate;
  Listview.ClearSelection;

  // So hinscrollen, dass man das man den aIndex uberhaupt sehen kann
  Listview.Items[aIndex].MakeVisible(False);

  // Der Versuch den ausgewählten Eintrag ungefähr "mittig" in der Listview an zu zeigen
  Idx := Listview.TopItem.Index + (Listview.VisibleRowCount Div 2);
  If aIndex <> Idx Then
    Idx := aIndex + (aIndex - Idx);
  If (Idx < 0) Then
    Idx := 0;
  If (Idx >= Listview.Items.Count) Then
    Idx := Listview.Items.Count - 1;
  Listview.Items[Idx].MakeVisible(False);

  // Der Versuch den Eintrag auch so zu selektiern dass dieser
  // 1. Blau hinterlegt ist
  // 2. Wenn der User die Pfeiltasten verwendet von diesem auch weiter "navigiert" wird
  Listview.Items[aIndex].Selected := true; // Das macht den Eintrag "blau"
  Listview.ItemIndex := aIndex; // Das hier scheint nichts zu bewirken
  Listview.Selected := Listview.Items[aIndex]; // Das hier scheint nichts zu bewirken

  Listview.EndUpdate;
  // Dem Listview den "Focus" geben, damit der User nicht "rein" clicken muss
  Listview.SetFocus;
End; 
An zu zeigen.
Unter Windows scrollt die Gui richtig hin und man sieht das dann auch, aber wenn ich dann mit Pfeil Hoch oder Runter "weiter" navigieren will, springt der Cursor "irgendwo" hin. Unter Linux funktioniert das komplett nicht :( .

Damit ihr das nu ausprobieren könnt ohne direkt eine Beispielanwendung coden zu müssen habe ich das mal eben für euch gemacht:
preview.PNG
preview.PNG (13.95 KiB) 2939 mal betrachtet
Durch Klick auf einen der 3 Buttons kann der Cursor entsprechend "verschoben" werden (der Focus wechselt dann in die Listview, denn Klickt der User auf die Blaue Zeile ist zumindest unter Windows der Cursor Tasten Bug weg ..), bzw der Jeweilige "Bug" gezeigt werden.

Hat einer von euch eine Ahnung wie man das "korrekt" macht, so dass das auf Linux und Windows funktioniert ?
Dateianhänge
Listview_Frage.zip
(2.73 KiB) 71-mal heruntergeladen
--
Just try it

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: In Listview Programmatisch scrollen

Beitrag von fliegermichl »

Mach mal hinter dem Select

Code: Alles auswählen

  ListView1.ItemFocused := ListView1.Items[ListView1.ItemIndex];
Edit: Hab es eben auch unter Linux ausprobiert. Funktioniert.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: In Listview Programmatisch scrollen

Beitrag von corpsman »

Cool, unter Windows geht es, Linux muss ich es noch testen, danke
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1617
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: In Listview Programmatisch scrollen

Beitrag von corpsman »

ALso im Demo aus dem 1. Post gehts unter Windows und Linux, mache ich das gleiche im Copy Commander gehts nur in der Windows version :/

Nu heist es rauskriegen woran das liegt ..

[Edit]

Habs gefunden, Listview.TopItem ist beim Copy Commander wohl nur manchmal assigned. Der Folgende Code funktioniert, :)

Code: Alles auswählen

Procedure ListViewSelectItemIndex(Const Listview: TListView; aIndex: integer);
Var
  Idx: Integer;
Begin
  If aindex >= Listview.Items.Count Then exit;
  Listview.BeginUpdate;
  Listview.ClearSelection;

  // So hinscrollen, dass man das man den aIndex uberhaupt sehen kann
  Listview.Items[aIndex].MakeVisible(False);

  // Der Versuch den ausgewählten Eintrag ungefähr "mittig" in der Listview an zu zeigen
  If assigned(Listview.TopItem) Then Begin
    Idx := Listview.TopItem.Index + (Listview.VisibleRowCount Div 2);
    If aIndex <> Idx Then
      Idx := aIndex + (aIndex - Idx);
    If (Idx < 0) Then
      Idx := 0;
    If (Idx >= Listview.Items.Count) Then
      Idx := Listview.Items.Count - 1;
    Listview.Items[Idx].MakeVisible(False);
  End;

  // Der Versuch den Eintrag auch so zu selektiern dass dieser
  // 1. Blau hinterlegt ist
  // 2. Wenn der User die Pfeiltasten verwendet von diesem auch weiter "navigiert" wird
  Listview.Items[aIndex].Selected := true; // Das macht den Eintrag "blau"
  // Den Eintrag tatsächlich auch Anwählen
  Listview.ItemIndex := aIndex;
  Listview.Selected := Listview.Items[aIndex];
  Listview.ItemFocused := Listview.Items[aIndex];

  Listview.EndUpdate;
End;
--
Just try it

Antworten