Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView Scrollen per Code (https://www.delphipraxis.net/194943-listview-scrollen-per-code.html)

Fukiszo 21. Jan 2018 18:54

ListView Scrollen per Code
 
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

Uwe Raabe 21. Jan 2018 21:22

AW: ListView Scrollen per Code
 
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;

Fukiszo 22. Jan 2018 04:17

AW: ListView Scrollen per Code
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1391568)
...ViewStyle vsReport?

Deine Vermutung trifft ins Schwarze, ViewStyle := vsReport.

Grüße und danke für Vorschlag!

Uwe Raabe 22. Jan 2018 09:26

AW: ListView Scrollen per Code
 
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

Fukiszo 22. Jan 2018 09:44

AW: ListView Scrollen per Code
 
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!

EWeiss 22. Jan 2018 09:46

AW: ListView Scrollen per Code
 
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

Fukiszo 22. Jan 2018 09:55

AW: ListView Scrollen per Code
 
Zitat:

Zitat von EWeiss (Beitrag 1391598)
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

EWeiss 22. Jan 2018 10:00

AW: ListView Scrollen per Code
 
Zitat:

Zitat von Fukiszo (Beitrag 1391600)
Zitat:

Zitat von EWeiss (Beitrag 1391598)
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

Fukiszo 22. Jan 2018 10:20

AW: ListView Scrollen per Code
 
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.

EWeiss 22. Jan 2018 10:27

AW: ListView Scrollen per Code
 
Zitat:

Zitat von Fukiszo (Beitrag 1391605)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:40 Uhr.
Seite 1 von 2  1 2      

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