(A2k, WinXP - jeweils aktuelle SPs, HP-Maus an Standard-WinXP-
Maustreiber)
Ich habe ein Endlosformular in dem mehre Datensätze angezeigt werden.
Das Formular ist aber hoch genug, um alle Datensätze auf einmal ohne
Scrollen darstellen zu können. Ich kann nun dennoch mit dem Mausrad
den Datenbestand ein wenig auf und ab schieben - je nach dem mit wie
viel Schwung ich vorgehe. Das Problem ist, dass ich es aber nicht mehr
schaffe so weit zurückzuscrollen, dass auch der erste Datensatz wieder
sichtbar wird. Den kann ich nur anzeigen, indem ich mit Shift-Tab die
Einfügemarke verschiebe oder am vertikalen Scrollbalken den Pfeil nach
oben bemühe.
Habt ihr eine Idee, wie ich dieses Verhalten abstellen kann? Mir
fallen zwar einige Umgehungsmöglichkeiten ein (Scrollen per Mausrad
für solche Fälle abschalten, auf Knopfdruck SelTop setzen, ...), aber
eigentlich hätte ich gerne das geplante Standardverhalten.
Ich danke euch für's Mitdenken.
LG, Paul
Hallo, lieber Paul!
> [Problem mit Scrollverhalten]
Lustig! Ich kann das sofort nachstellen... Ein Grund mehr, warum ich in
meinen Anwendungen bis dato nicht ein einziges EFo habe ;-)
Es hängt ganz offenkundig mit der Formularhöhe zusammen, da das
Mouse-Wheel-Verhalten bei weniger Platz korrekt ist. Deshalb folgender
Workaround:
Private Sub Form_MouseWheel(ByVal Page As Boolean, ByVal Count As Long)
Dim tmpX As Long, tmpY As Long, tmpW As Long, tmpH As Long
If Me.Recordset.RecordCount * Me.Detailbereich.Height < Me.WindowHeight
Then
tmpX = Me.WindowLeft
tmpY = Me.WindowTop
tmpW = Me.WindowWidth
'Hier müsstest du etwas mehr Mühe in den optimalen Wert stecken
'er ist abhängig von Menü, Kopf- und Fußhöhe etc.
'Also nur zum Testen...
tmpH = Me.Recordset.RecordCount * Me.Detailbereich.Height
Call Me.Move(tmpX, tmpY, tmpW, tmpH)
End If
End Sub
Bissi ugly but working ;-)
Wahrscheinlich könntest du auch per SubClassing das Mousewheel-Event vorab
fangen, das Formular verkleinern und dann wieder zurückstellen. Mit "Echo
False" würde das wohl nicht mal flackern...
lg
Gottfried
--
Home: www.develes.net
Mail: g...@develes.net
Paul Rohorzka schrieb:
Ich stelle in meinen Endlosformularen die Bildlaufleiste entsprechend
ein.
z.B.:
Private Sub setScrollBars()
If (Me.Recordset.RecordCount * Me.Section(0).Height) > _
(Me.InsideHeight - Me.Section(1).Height - Me.Section(2).Height) Then
Me.ScrollBars = 2
Else
Me.ScrollBars = 0
End If
End Sub
mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
:) Hallo Gottfried,
danke für deine Antwort.
> > [Problem mit Scrollverhalten]
>
> [Vorschlag mit MouseWheel-Ereignis
> Bissi ugly but working ;-)
... nur leider nicht unter A2k. Das Ereignis gibt's nämlich erst ab
A2k2. ;)
> Wahrscheinlich könntest du auch per SubClassing das Mousewheel-Event vorab
> fangen, das Formular verkleinern und dann wieder zurückstellen. Mit "Echo
> False" würde das wohl nicht mal flackern...
Klar, aber das ist eine Anwendung, die hauptsächlich die Kundin
weiterentwickelt. Und ich kann ihr unmöglich antun, dass sie mit dem
VBE-Bug beim Subclassen leben muss.
Danke und lG!
Paul
> > (A2k, WinXP - jeweils aktuelle SPs, HP-Maus an Standard-WinXP-
> > Maustreiber)
>
> > Ich habe ein Endlosformular in dem mehre Datensätze angezeigt werden.
> > Das Formular ist aber hoch genug, um alle Datensätze auf einmal ohne
> > Scrollen darstellen zu können. Ich kann nun dennoch mit dem Mausrad
> > den Datenbestand ein wenig auf und ab schieben - je nach dem mit wie
> > viel Schwung ich vorgehe. Das Problem ist, dass ich es aber nicht mehr
> > schaffe so weit zurückzuscrollen, dass auch der erste Datensatz wieder
> > sichtbar wird. Den kann ich nur anzeigen, indem ich mit Shift-Tab die
> > Einfügemarke verschiebe oder am vertikalen Scrollbalken den Pfeil nach
> > oben bemühe.
> >
> > [...]
>
> Ich stelle in meinen Endlosformularen die Bildlaufleiste entsprechend
> ein.
>
> z.B.:
> Private Sub setScrollBars()
>
> If (Me.Recordset.RecordCount * Me.Section(0).Height) > _
> (Me.InsideHeight - Me.Section(1).Height - Me.Section(2).Height) Then
> Me.ScrollBars = 2
> Else
> Me.ScrollBars = 0
> End If
>
> End Sub
Großartge Idee!
Ich hab's noch ein bissl aufgebohrt (Berücksichtung der Zeile für
neuen Datensatz, ev. nicht vorhandenen Header und Footer sowie andere
Ansicht des Formulars) und freue mich, auf diesem Weg endlich wieder
etwas an die Community zurückgeben zu können:
In ein Standardmodul (ausnahmsweise - Hihi) Folgendes reinkopieren:
<Code>
Public Sub setScrollBars(ByVal theForm As Access.Form)
Dim neededHeight As Long
Dim availableHeight As Long
If theForm.DefaultView <> 1 Then Exit Sub ' Endlosformular
With theForm
If .AllowAdditions Then
neededHeight = (.Recordset.RecordCount + 1)
* .section(acDetail).Height
Else
neededHeight = .Recordset.RecordCount
* .section(acDetail).Height
End If
availableHeight = .InsideHeight _
- GetSaveSectionHeight(.Form, acHeader) _
- GetSaveSectionHeight(.Form, acFooter)
If neededHeight > availableHeight Then
.ScrollBars = 2 ' Nur vertikalen Scrollbalken anzeigen
Else
.ScrollBars = 0 ' Keine Scrollbalken anzeigen
End If
End With
End Sub
Private Function GetSaveSectionHeight(ByVal theForm As Access.Form,
ByVal section As AcSection) As Integer
On Error Resume Next
GetSaveSectionHeight = theForm.section(section).Height
On Error GoTo 0
End Function
</Code>
Aufruf:
Private Sub Form_Resize()
setScrollBars Me
End Sub
Danke für die Unterstützung!
LG,
P
Paul Rohorzka schrieb:
> Ich hab's noch ein bissl aufgebohrt (Berücksichtung der Zeile für
> neuen Datensatz, ev. nicht vorhandenen Header und Footer sowie andere
> Ansicht des Formulars) und freue mich, auf diesem Weg endlich wieder
> etwas an die Community zurückgeben zu können:
>
> In ein Standardmodul (ausnahmsweise - Hihi) Folgendes reinkopieren:
... bei wird das in einer Klasse für Endlosformulare behandelt. :-))
Wenn du schon beim "Aufbohren" bist: ;-)
Es fehlt noch die Möglichkeit, dass eventuell eine horizontale
Bildlaufleiste vorhanden sein könnte.
If neededHeight > availableHeight Then
.ScrollBars = (.ScrollBars OR 2)
Else
.ScrollBars = (.ScrollBars AND 1)
End If
=> fürs "optimale Aufbohren" müsste man eventuell auch
berücksichtigen, dass der Bedarf einer horizontalen Bildlaufleiste von
der Existenz einer vertikalen abhängen könnte.
weiters: Was ist, wenn im Endlosformular Daten eingegeben werden, das
Resize-Ereignis aber nicht ausgelöst wird? ;-)
Private Sub Form_BeforeInsert(Cancel As Integer)
setScrollBars Me
End Sub
müsste ausreichen.
... und irgendwo sollte man noch darauf reagieren, falls die
Datenbasis aktualisiert wird.
mfg
Josef