PDA

Vollständige Version anzeigen : ListBox - Aktuell sichtbare DS ermitteln


Alexander Jan Peters
11.05.2001, 16:36
<font color="#000000" size="2" face="Tahoma">Hallo,

ich wundere mich nur, daß sich mir diese Frage nie zuvor gestellt hat.
Wie ermittelt man die, für den Benutzer sichtbaren Datensätze in einem Listenfeld ?
Und wenn wir schon dabei sind, wie ginge das in einem Endlosformular (ich arbeite so gut wie nie damit, aber man weiß ja nie)?
Ich bin über jeden Ansatz zur Lösung dankbar.

Gruß

A.J. Peters</font>

elmar
11.05.2001, 16:53
Darüber wundere ich mich allerdings auch!
Habe ich auch noch nie drüber nachgedacht.
Allerdings könnte das eine reizvolle Aufgabe sein, wenn dabei nicht die speziellen Einstellungen wären:
Höhe des Listenfeldes;
Bildschirmauflösung;
Schriftart (klein, groß oder benutzerdefiniert)

Die Höhe des Listenfeldes in cm bestimmt zusammen mit den anderen Faktoren die für den User sichtbaren Datensätze, die er ohne scrollen der Bildlaufleiste zu sehen bekommt.
Am besten am Objekt abzählen.
---------------------------------
Oder ist hier etwa gefragt, wieviel Datensätze i n s g e s a m t im Listenfeld dargestellt werden???

Alexander Jan Peters
11.05.2001, 17:06
<font color="#000000" size="2" face="Tahoma">Nein,

das kann ich gerade noch allein. Es geht um die für den Benutzer im Formular im Augenblick sichtbaren DS.
Wird wohl eine API-Lösung benötigen.

Gruß

A.J. Peters</font>

Alexander Jan Peters
13.05.2001, 17:54
<font color="#000000" size="2" face="Tahoma">Hallo,

damit auch alle etwas davon haben, poste ich hier mal meinen bisherigen Code. Er funktioniert,
aber warum es nicht auch ohne den Faktor 0,5 klappt...ich weißt es nicht.
An dieser Stelle einmal herzlichen Dank an elmar und Roland Kuenzel (in der Newsgroup de.comp.datenbanken.ms-access),
die mir mit ihren Ideen auf die Sprünge geholfen haben.
Verbessungsvorschläge wären nett.</font>


<font color="#000000" size="2" face="Courier New">
'Konstanten
Private Const LOGPIXELSY = 90
'Variablen
Public TwipsPixelY%
'Funktionen
Private Declare Function GetDC Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hDC As Long, ByVal nIndex As Long) _
As Long
Public Function fVisListRows(ctl As Control, intRecords As Integer) As Integer
'Parameter: ctl Listenfeld, fuer das die Berechnung gemacht werden soll
' intRecords Anzahl der DS in der Datengrundlage
Dim intRows As Integer
Dim bytColHd As Byte
Dim hDC As Long
Dim Dummy

TwipsPixelY = 0
'Pruefung, ob es sich ueberhaupt um ein Listenfeld handelt
If Not ctl.ControlType = acListBox Then
'Kein Listenfeld
fVisListRows = 0
Exit Function
End If

'Twips pro Pixel ermitteln
hDC = GetDC(Application.hWndAccessApp)
TwipsPixelY = 1440 / GetDeviceCaps(hDC, LOGPIXELSY)
Dummy = ReleaseDC(Application.hWndAccessApp, hDC)

'Spaltenueberschriften/-koepfe beruecksichtigen
If ctl.ColumnHeads = True Then
bytColHd = 1
Else
bytColHd = 0
End If

'Eigentliche Ermittlung der vollstaendig (!) sichtbaren Zeilen
'ohne Spaltenueberschriften
intRows = CInt((ctl.Height / (ctl.FontSize * TwipsPixelY)) * 0.5 - bytColHd)
If intRecords < intRows Then intRows = intRecords
fVisListRows = intRows
End Function</font>


<font color="#000000" size="2" face="Tahoma">
Ach, noch ein kleiner Hinweis, dieser Code funktioniert nur für TrueType-Fonts.

Gruß

A.J. Peters</font>