Hier ist eine plattform-unabhängige Lösung, die die Anzahl sichtbarer Zeilen ermittelt. Durch Vergrößerung oder Verkleinerung des Fensters ändert sich die Anzahl der sichtbaren Zeilen und die geänderte Anzahl wird im Fenstertitel dann auch angezeigt.
Diese Lösung verwendet die für das jeweilige Betriebssystem nötigen API-Funktionen, um die Anzahl sichtbarer Zeilen zu ermitteln. Ich habe versucht, das Beispiel so einfach wie möglich zu halten. Dadurch unterscheiden sich leider die angezeigten Ergebnisse in Details abhängig vom Betriebssystem. Dies wäre durch eine aufwendigere Programmierung natürlich ebenfalls zu lösen, aber es zeigt, dass der Teufel im Detail steckt und ein wirklicher Test auf jeder Betriebssystemplattform absolut unerläßlich ist...
Dies sind die Unterschiede der jetzigen Lösung zwischen den Betriebssystemen:
Wann wird eine Zeile als "sichtbar" gewertet?
- Linux: wenn eine Zeile vollständig sichtbar ist (durch Entfernen von Int() bei ProcedureReturn lassen sich auch Bruchteile angezeigter Zeilen ermitteln)
- MacOS: wenn eine Zeile etwa zu 1/4 sichtbar ist
- Windows: wenn eine Zeile vollständig sichtbar ist
Werden nur tatsächlich vorhandene Zeilen gezählt, z.B. wenn das Fenster so aufgezogen ist, dass mehr als die 10 im Beispiel vorhandenen Zeilen angezeigt werden?
- MacOS: nur tatsächlich vorhandene
- Linux und Windows: auch nicht vorhandene als leer angezeigte Zeilen
Bei allen 3 Betriebssystemen wird die Option #PB_ListIcon_GridLines (dadurch erhöht sich die Höhe einer Zelle) sowie angezeigte oder ausgeblendete Spaltenbeschriftungen oder horizontale Scrollbalken bei der Berechnung der angezeigten Zeilen korrekt berücksichtigt!
Ich habe das Beispiel auf folgenden Betriebssystemen getestet:
- Lubuntu 14.04 x86 mit PB 5.31 x86
- MacOS X 10.6.8 (Snow Leopard) mit PB 5.31 x86 und x64
- Ubuntu 14.04 x64 mit KDE und PB 5.31 x64
- Ubuntu 14.04 x64 mit Unity und PB 5.31 x64
- Windows 7 SP1 x64 mit PB 5.31 x86 und x64
Code: Alles auswählen
EnableExplicit
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
ImportC ""
gtk_tree_view_get_grid_lines(*TreeView.GtkTreeView)
gtk_widget_style_get(*Widget.GtkWidget, PropertyName.S, *Value, Null)
EndImport
Procedure.I GetVisibleRows(ListIconID.I)
Protected *Adjustment.GtkAdjustment
Protected CellHeight.I
Protected CellWidth.I
Protected Column.I
Protected GridLineHeight.F
Protected TreeView.I = GadgetID(ListIconID)
Protected xOffset.I
Protected yOffset.I
Column = gtk_tree_view_get_column_(TreeView, 0)
If Column
gtk_tree_view_column_cell_get_size_(Column, 0, @xOffset, @yOffset, @CellWidth, @CellHeight)
EndIf
*Adjustment = gtk_tree_view_get_vadjustment_(TreeView)
If gtk_tree_view_get_grid_lines(TreeView)
GridLineHeight = 1.0
EndIf
ProcedureReturn Int(*Adjustment\page_size / (CellHeight + GridLineHeight))
EndProcedure
CompilerCase #PB_OS_MacOS
Procedure.I GetVisibleRows(ListIconID.I)
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 number of rows visible
CocoaMessage(@VisibleRange, GadgetID(ListIconID), "rowsInRect:@", @VisibleRect)
ProcedureReturn Int(VisibleRange\length)
EndIf
EndProcedure
CompilerCase #PB_OS_Windows
Procedure.I GetVisibleRows(ListIconID.I)
ProcedureReturn SendMessage_(GadgetID(ListIconID), #LVM_GETCOUNTPERPAGE, 0, 0)
EndProcedure
CompilerEndSelect
Define i.I
Define WindowEvent.I
OpenWindow(0, 100, 100, 330, 131, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
ListIconGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 10, "Spalte 1", 140, #PB_ListIcon_GridLines)
AddGadgetColumn(0, 1, "Spalte 2", 140)
For i = 1 To 10
AddGadgetItem(0, -1, "Zeile " + Str(i) + ", Spalte 1" + #LF$ + "Zeile " + Str(i) + ", Spalte 2")
Next i
While WindowEvent() : Wend
SetWindowTitle(0, "Sichtbare Zeilen: " + Str(GetVisibleRows(0)))
Repeat
WindowEvent = WaitWindowEvent()
If WindowEvent = #PB_Event_SizeWindow
ResizeGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 10)
SetWindowTitle(0, "Sichtbare Zeilen: " + Str(GetVisibleRows(0)))
EndIf
Until WindowEvent = #PB_Event_CloseWindow