![]() |
ListViewBox: An eine bestimmte Stelle scrollen?
Hi Leute
ich hab eine ListViewBox mit über 100 Einträgen(zwangsläufig mit Scrollbalken) und in einer Spalte jeweils eine Uhrzeit. Jetzt möchte ich gerne das die Zeile dessen Uhrzeit am besten zur aktuellen Uhrzeit paßt in die Mitte der Liste gerückt wird (soweit es möglich ist). Bisher hab ich es geschafft den entsprechenden Eintrag zu markieren, aber das macht ja kein Sinn, wenn er auf Grund der Länge der Liste nicht angezeigt wird. |
Moin X-Dragon,
wenn Du den Eintrag markieren kannst, kannst Du ja auch die Eigenschaft TopIndex setzen. |
Zitat:
|
Jetzt hab ich schon mal eine Lösung gefunden für Visual Bsaic, aber gibts etwas vergleichbares zu "EnsureVisible" in Delphi?
Delphi-Quellcode:
Quelle:
Private Sub Form_Load()
Dim x As Integer With ListView1 For x = 1 To 20 .ListItems.Add Key:="foo" & x, Text:="foo" & x Next x .SelectedItem = .ListItems("foo20") .SelectedItem.EnsureVisible End With End Sub ![]() [edit] ich bin schon mal wieder etwas weiter gekommen:
Delphi-Quellcode:
Ist zwar noch nicht ganz ausgereift, zumindest für meine Zwecke, aber grundsätzlich funktioniert es schon mal :).
var
pos : Integer; DisplayRec: TRect; begin uhrzeit := Copy(uhrzeit,1,4)+'0'; lv := lvbox[PC1.ActivePageIndex+1]; // Auswahl des akt. ListViews for i := 0 to lv.Items.Count -1 do if lv.Items[i].SubItems[1] = uhrzeit then begin lv.SetFocus; DisplayRec := lv.Items[0].DisplayRect(drBounds); pos := (DisplayRec.Bottom - DisplayRec.Top) * i; lv.Scroll(0,pos); break; end; end; [edit2] und ich hab noch eine Lösung gefunden, und zwar "MakeVisible" ist aber leider für meine Zwecke nicht ganz das wahre ... [edit3] Hab mich jetzt für die "DisplayRect"-Lösung entschieden und verschieb "pos" noch um 1/3 der ListView-Höhe nach unten, dann paßt das ganz gut. |
Re: ListViewBox: An eine bestimmte Stelle scrollen?
Da editieren ja jetzt nicht mehr geht, hier nochmal kurz eine Korrektur, da die oben von mir beschriebene Lösung so nicht funtkioniert!
Mein Hauptdenkfehler lag dabei, das der Befehl "Scroll" keine Positionsangabe erlaubt sondern nur die Angabe um wieviel sich die Scollbalken in welche Richtung (+/-) verschieben sollen. Also so funktioniert es jetzt bei mir:
Delphi-Quellcode:
for i := 0 to listview1.Items.Count -1 do
if listview1.Items[i].SubItems[1] = uhrzeit then // um einen Eintrag mit einer bestimmten Uhrzeit zu markieren/zentrieren begin listview1.SetFocus; listview1.ItemIndex := i; DisplayRec := listview1.Items[i].DisplayRect(drBounds); zh := DisplayRec.Bottom - DisplayRec.Top; // Zeilen-Höhe pos := listview1.TopItem.Index * zh; // Pos. des 1. sichtbaren Eintrags pos2 := i * zh; // Pos. des akt. Eintrags pos3 := pos2 - Round(listview1.ClientHeight/3); // neue Pos. listview1.Scroll(0,pos3-pos); // an neue Pos. verschieben break; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 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 by Thomas Breitkreuz