![]() |
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:
So funktioniert es meist relativ gut aber manchmal nicht präzise genug.
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; (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 |
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; |
AW: ListView Scrollen per Code
Zitat:
Grüße und danke für Vorschlag! |
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:
Es fehlen noch ein paar Plausibilitätsprüfungen wie
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);
|
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! |
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 |
AW: ListView Scrollen per Code
Zitat:
Das wäre hilfreich! Grüße |
AW: ListView Scrollen per Code
Zitat:
Ich glaube das kannst du selbst oder? gruss |
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. |
AW: ListView Scrollen per Code
Zitat:
Ich übergebe sie und setze lediglich den TopIndex.
Delphi-Quellcode:
Hmmm.. ich dachte eigentlich das wir über Win32Api reden da ich gelesen habe das du damit arbeitest.
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); 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 04:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz