AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ListView Scrollen per Code

Ein Thema von Fukiszo · begonnen am 21. Jan 2018 · letzter Beitrag vom 22. Jan 2018
Antwort Antwort
Seite 1 von 2  1 2      
Fukiszo
(Gast)

n/a Beiträge
 
#1

ListView Scrollen per Code

  Alt 21. Jan 2018, 19:54
Hallo,
in eine ListView per Code scrollen, da frage mich,
ob meine methode die richtige ist
bzw ob ihr andere möglichkeiten habt soetwas zu bewerkstelligen?

Code:
var x: Extended;
begin
 x := -ListView1.Font.Size * ListView1.Font.PixelsPerInch / 72; // höhe pro item berechnen
 if x < 0 then x := -ListView1.Font.Height * 72 / ListView1.Font.PixelsPerInch; // nochmal falls erste variante fehlschlägt
 x := x * (ListView1.ItemIndex+3); // hier die +3 damit die sichtbare auswahl mehr in richtung mitte der LV wandert
 ListView1.Scroll(0,Round(x)); // hier wird gescrollt
end;
So funktioniert es meist relativ gut aber manchmal nicht präzise genug.
(ich vermute das liegt an meiner berechnung der höhe pro item)


Sinn und zweck soll sein:
ich start das Programm, ein verzeichniss wird in die LV ausgegeben,
eine datei wird ausgewählt (per .exe start parameter)
nun soll die datei nicht nur ausgewählt sein sondern auch im sichtbaren bereich liegen.
(nach möglichkeit ein wenig zentriert in der LV)

Programmiert per WinAPI aber VCL/TWinControl befehle könnt ich bestimmt umschreiben/einbinden.

Für vorschläge oder Code verbesserungen im allgemeinen wäre ich dankbar!

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: ListView Scrollen per Code

  Alt 21. Jan 2018, 22:22
Ich vermute mal, der ListView steht im ViewStyle vsReport?

Dieser Code scrollt den aktuellen Eintrag ungefähr in die Mitte, so das überhaupt möglich ist.

Delphi-Quellcode:
var
  DI: Integer;
  DY: Integer;
  H: Integer;
  I: Integer;
  R0: TRect;
  R1: TRect;
begin
  if ListView1.Items.Count <= ListView1.VisibleRowCount then Exit;

  R0 := ListView1.Items[0].DisplayRect(drSelectBounds);
  R1 := ListView1.Items[1].DisplayRect(drSelectBounds);
  H := R1.Top - R0.Top; // Höhe eines Eintrags
  DI := (ListView1.VisibleRowCount + 1) div 2; // Anzahl der Items über dem aktuellen
  DY := H*(ListView1.ItemIndex - ListView1.TopItem.Index - DI); // zu scrollender Wert
  ListView1.Scroll(0, DY);
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#3

AW: ListView Scrollen per Code

  Alt 22. Jan 2018, 05:17
...ViewStyle vsReport?
Deine Vermutung trifft ins Schwarze, ViewStyle := vsReport.

Grüße und danke für Vorschlag!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: ListView Scrollen per Code

  Alt 22. Jan 2018, 10:26
Es geht vielleicht auch noch einfacher, in dem man sich nur auf das aktuelle und das neue TopItem konzentriert:
Delphi-Quellcode:
  DI := ListView1.ItemIndex - Succ(ListView1.VisibleRowCount) div 2; // Index des neuen TopItem
  R1 := ListView1.TopItem.DisplayRect(drSelectBounds); // Position des aktuellen TopItem
  R2 := ListView1.Items[DI].DisplayRect(drSelectBounds); // Position des neuen TopItem
  ListView1.Scroll(0, R2.Top - R1.Top);
Es fehlen noch ein paar Plausibilitätsprüfungen wie
  • Gibt es überhaupt Einträge
  • Ist ein Eintrag ausgewählt
  • Sind überhaupt Zeilen sichtbar
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (22. Jan 2018 um 10:50 Uhr)
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#5

AW: ListView Scrollen per Code

  Alt 22. Jan 2018, 10:44
Meines erachtens ist es der Scroll funktion egal ob ein Eintrag vorhanden ist?!

Also, ich kann Scroll(12345) angeben auch wenn null Einträge da sind (was natürlich keinen Sinn macht)
bzw wenn sagen wir 100 Einträge da sind würde Scroll(12345) bewirken das ich am Ende lande.
(Ohne irgendeine Fehlermeldung. Das fängt Windows ab und macht was nützliches draus.)

Den vorangegangen Aufrufen ist es natürlich nicht egal, sie basieren ja auf "Items"

Danke für den Hinweis!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: ListView Scrollen per Code

  Alt 22. Jan 2018, 10:46
Keine Ahnung wo hier ein Problem sein soll.
Bei einem Window Style von LVS_REPORT ist die höhe fixed.
Was gibt es da groß zu berechnen?

Man muss nur dafür sorgen das die gesamthöhe dividiert durch die Items korrekt ist.
Der Rest gibt sich von selbst.

gruss

Geändert von EWeiss (22. Jan 2018 um 10:49 Uhr)
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#7

AW: ListView Scrollen per Code

  Alt 22. Jan 2018, 10:55
Was gibt es da groß zu berechnen?
Könntest Du das bitte mit ein Beispiel für Dummies veranschaulichen, so wie es Uwe Raabe gemacht hat?
Das wäre hilfreich!

Grüße
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: ListView Scrollen per Code

  Alt 22. Jan 2018, 11:00
Was gibt es da groß zu berechnen?
Könntest Du das bitte mit ein Beispiel für Dummies veranschaulichen, so wie es Uwe Raabe gemacht hat?
Das wäre hilfreich!

Grüße
Bei einer List View Höhe von 120 Pixeln und einer Item höhe von 12 dafür benötigst du ein Beispiel für Dummies um zu veranschaulichen wo sich die Mitte befindet?
Ich glaube das kannst du selbst oder?

gruss

Geändert von EWeiss (22. Jan 2018 um 11:10 Uhr)
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#9

AW: ListView Scrollen per Code

  Alt 22. Jan 2018, 11:20
Ich brauch nicht wissen wo die mitte in meiner ListView ist,
ich fragte nach Beispielen wie man ein ausgewähltes Item innerhalb der ListView in den Sichtbaren Bereich bekommt.
Wie ermittelst du das ein Item eine Höhe von 12 hat? Der rest ergibt sich ja dann von selbst.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: ListView Scrollen per Code

  Alt 22. Jan 2018, 11:27
Ich brauch nicht wissen wo die mitte in meiner ListView ist,
ich fragte nach Beispielen wie man ein ausgewähltes Item innerhalb der ListView in den Sichtbaren Bereich bekommt.
Wie ermittelst du das ein Item eine Höhe von 12 hat? Der rest ergibt sich ja dann von selbst.
Gar nicht! ?
Ich übergebe sie und setze lediglich den TopIndex.

Delphi-Quellcode:
  LVPlayList := CTRL_ListViewCreate;
  LVPlayList.SelectedImg := SKAERO_FOLDER + 'ListView\ListSelect.png';
  LVPlayList.HeaderArrowImg := SKAERO_FOLDER + 'ListView\HeaderArrow.png';
  LVPlayList.VTrack := SKAERO_FOLDER + 'ListView\VTrack.png';
  LVPlayList.VThumb := SKAERO_FOLDER + 'ListView\VThumb.png';
  LVPlayList.VBtnUp := SKAERO_FOLDER + 'ListView\VBtnUp.png';
  LVPlayList.VBtnDown := SKAERO_FOLDER + 'ListView\VBtnDown.png';
  LVPlayList.HTrack := SKAERO_FOLDER + 'ListView\HTrack.png';
  LVPlayList.HBtnRight := SKAERO_FOLDER + 'ListView\HBtnRight.png';
  LVPlayList.HThumb := SKAERO_FOLDER + 'ListView\HThumb.png';
  LVPlayList.HBtnLeft := SKAERO_FOLDER + 'ListView\HBtnLeft.png';
  LVPlayList.Sizer := SKAERO_FOLDER + 'ListView\Sizer.png';
  LVPlayList.ArrowImgStateMax := 2;
  LVPlayList.Left := 19;
  LVPlayList.Top := 66;
  LVPlayList.Width := MainWidth - 232;
  LVPlayList.Height := MainHeight - 108;
  LVPlayList.DlgItemID := ID_PLAYLIST;
  LVPlayList.Visible := False;
  LVPlayList.ItemHeight := 19; // <<<< ListView Item Höhe.
  LVPlayList.CreateWindow(hMain);
  LVPlayList.SetFont(14, PWideChar(SKAERO_TEXTFONT), FontStyleBoldItalic,
    SKAERO_ACTIVECAPTION, SKAERO_INACTIVECAPTION, True, 1.5);

  LVPlayList.InsertColumn(LVPlayList.Handle, 0, 'Nr.', 50, False, sortInt);
  LVPlayList.InsertColumn(LVPlayList.Handle, 1, 'Time', 55, False, sortString);
  LVPlayList.InsertColumn(LVPlayList.Handle, 2, 'Title', 250, True, sortString);
  LVPlayList.InsertColumn(LVPlayList.Handle, 3, 'Artist', 250, False, sortString);
  LVPlayList.InsertColumn(LVPlayList.Handle, 4, 'Album', 70, False, sortString);
  LVPlayList.InsertColumn(LVPlayList.Handle, 5, '', -1, False, sortString);

  SKAERO_SetAnchorMode(LVPlayList.Handle, ANCHOR_HEIGHT_WIDTH);
  SKAERO_SetZorder(LVPlayList.Handle, HWND_TOP);
Hmmm.. ich dachte eigentlich das wir über Win32Api reden da ich gelesen habe das du damit arbeitest.
Wenn dem nicht so ist vergesse meine Post.

Aber das es geht siehe shot.
Und bei mir ist der erste sichtbare Eintrag eines ListView, TopItem da muss man nichts berechnen.

gruss

Geändert von EWeiss (11. Jul 2019 um 16:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz