Ich hatte im englischen Forum bereits einmal ein Beispiel von Blue, das unter Windows die oberste sichtbare Zeile in einem ListViewGadget ermittelt, um den Linux- und Mac-spezifischen Teil erweitert:Kukulkan hat geschrieben:Allerdings muss ich vorher noch die Positionen ermitteln, damit ich bei einem Restart des Programms an exakt die selbe Position scrollen kann. Hat jemand auch dazu die passenden Befehle um die Position zu ermitteln?
http://www.purebasic.fr/english/viewtop ... 25&start=6
Für ein ListIconGadget muß in der dort gezeigten Prozedur GetVisibleTopRow() lediglich für Windows in der SendMessage_()-Funktion die Konstante #LB_GETTOPINDEX (ListBox bei Microsoft, ListViewGadget bei PureBasic) gegen #LVM_GETTOPINDEX (ListView bei Microsoft, ListIconGadget bei PureBasic) ausgetauscht werden.
Ich habe trotzdem noch einmal ein komplett neues Beispiel erstellt, das bei Betätigen der Schaltfläche "Get current top row" im Fenstertitel die Zeilennummer der obersten sichtbaren Zeile anzeigt. Zu beachten ist, dass - wie in meinem englischen Posting erwähnt - betriebssystembedingt bei Linux und MacOS als oberste Zeile auch eine oberste Zeile angegeben wird, die nur teilweise sichtbar ist. Wenn man nur die Zeilennummer der obersten voll sichtbaren Zeile haben möchte, müßte man die Zeilennummer bei Linux und MacOS entsprechend aufrunden.
Ich habe das Beispiel erfolgreich unter folgenden Betriebssystemen getestet:
- MacOS X 10.6.8 (Snow Leopard)
- Ubuntu 12.04 x64 mit KDE (Gtk2 und Gtk3)
- Windows 7 x64 SP1
Code: Alles auswählen
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
ImportC ""
gtk_tree_view_get_visible_range(*TreeView.GtkTreeView, *StartPath, *EndPath)
EndImport
CompilerEndIf
Procedure.I GetVisibleTopRow(ListIconID.I)
Protected VisibleTopRow.I
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
Protected *EndPath
Protected *StartPath
If gtk_tree_view_get_visible_range(GadgetID(ListIconID), @*StartPath, @*EndPath)
VisibleTopRow = PeekI(gtk_tree_path_get_indices_(*StartPath))
gtk_tree_path_free_(*StartPath)
gtk_tree_path_free_(*EndPath)
EndIf
CompilerCase #PB_OS_MacOS
Protected ContentView.I
Protected EnclosingScrollView.I
Protected VisibleRange.NSRange
Protected VisibleRect.NSRect
; ----- Get scroll view inside of ListIconGadget
EnclosingScrollView = CocoaMessage(0, GadgetID(ListIconID), "enclosingScrollView")
If EnclosingScrollView
ContentView = CocoaMessage(0, EnclosingScrollView, "contentView")
; ----- Get visible area
; (automatically subtract horizontal scrollbar if shown)
CocoaMessage(@VisibleRect, ContentView, "documentVisibleRect")
; ----- Subtract border width
If CocoaMessage(0, EnclosingScrollView, "borderType") > 0
VisibleRect\size\height - 5
EndIf
; ----- Get visible top row
CocoaMessage(@VisibleRange, GadgetID(ListIconID), "rowsInRect:@", @VisibleRect)
VisibleTopRow = Int(VisibleRange\location)
EndIf
CompilerCase #PB_OS_Windows
VisibleTopRow = SendMessage_(GadgetID(ListIconID), #LVM_GETTOPINDEX, 0, 0)
CompilerEndSelect
ProcedureReturn VisibleTopRow
EndProcedure
OpenWindow(0, 100, 100, 200, 155, "")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 55, "Column 1",
100)
ButtonGadget(1, 10, WindowHeight(0) - 35, WindowWidth(0) - 20, 25,
"Get current top row")
For i = 1 To 50
AddGadgetItem(0, -1, "Item " + Str(i))
Next i
SetWindowTitle(0, "Top row: " + Str(GetVisibleTopRow(0) + 1))
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 1
SetWindowTitle(0, "Top row: " + Str(GetVisibleTopRow(0) + 1))
EndIf
EndSelect
ForEver