ACCESS - Verberg applicatie scherm en centreer forms

  • Onderwerp starter Onderwerp starter hausi
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

hausi

Gebruiker
Lid geworden
17 jan 2010
Berichten
84
Ik wil graag dat mijn database eruit ziet als een normale Windows applicatie en wil daarom het applicatie scherm verbergen en de formulieren buiten dat applicatie scherm weergeven.
Omdat de database op meerdere monitoren met verschillende resoluties moet kunnen worden weergegeven, zou ik willen dat de formulieren netjes gecentreerd worden weergegeven, onafhankelijk van de gebruikte resolutie.
Is daar een oplossing voor?
 
Huur een professional in, zou ik zeggen. Dit is een mega klus.
 
Geen budget voor helaas, dan moet ik zelf maar een professional worden :-)
 
Het is een behoorlijk ingewikkelde klus namelijk, en vereist heel wat programmeerwerk. En wat is het netto resultaat? Je kunt de meeste zaken toch wel verbergen in Access, wat kan het boeien dat je Access op de taakbalk ziet staan? Ik zou mijn tijd nuttiger besteden...
 
In Excel/word/powerpoint/outlook worden userforms als default daar geplaatst.
Via het uitlezen van een userformpositie in een van deze programma's kun je achterhalen waar jouw Accessformulieren zouden moeten worden geplaatst.
 
Hier in ieder geval een voorbeeldje waarmee je de Accessomgeving kan verbergen. Het positioneren van de formulieren is een redelijke standaard techniek, waarbij je de schermresolutie moet uitlezen. Aanpassen van formulieren aan de resolutie is een klus waar je echt niet aan moet beginnen; je moet dan echt alles gaan opschalen en afschalen op zo'n formulier, en dat ziet er doorgaans dan niet meer uit. Maak je formulieren op de kleinste resolutie, dan zien ze er op de grotere schermen ook goed uit.
 

Bijlagen

Edit: Je was me net voor Michel, ik zal er naar kijken, bedankt.

Hmm, misschien ben ik niet duidelijk geweest in mijn vraag.
Mijn wens is om de formulieren buiten het application window gecentreerd op het scherm te krijgen. In de taakbalk wordt de naam van de database weergegeven, dat is prima.
Ik heb voor beide wensen afzonderlijke code gevonden, maar die werken niet samen helaas.
De code om het application window te verbergen:
Code:
Option Compare Database

Public Declare Function MoveWindow Lib "user32" (ByVal hWnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Public Const SM_CXSCREEN = 0 'X Size of screen
Public Const SM_CYSCREEN = 1 'Y Size of Screen


Public Function AdjstAccssWndw(Optional ByVal MyX As Long = 200, Optional ByVal MyY As Long = 25)
    Dim errNum As Long, errDesc As String
    On Error GoTo SubEx
    Call MoveWindow(Application.hWndAccessApp, CLng(Round((GetSystemMetrics(SM_CXSCREEN) - MyX) / 2, 0)), CLng(Round((GetSystemMetrics(SM_CYSCREEN) - MyY) / 2, 0)), MyX, MyY, True)
ExitMe:
    Exit Function
SubEx:
    errNum = Err.Number: errDesc = Err.Description: Err.Clear
    Resume ExitMe
End Function
Bij het openen van de database wordt de functie AdjstAccssWndw aangeroepen en het application window verdwijnt.

De code om formulieren gecentreerd te krijgen
Code:
Option Compare Database
Option Explicit

' API declarations:
Private Declare Function apiGetClientRect Lib "user32" Alias "GetClientRect" (ByVal hwnd As Long, lpRect As typRect) As Long
Private Declare Function apiGetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As Long, lpRect As typRect) As Long
Private Declare Function apiSetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function apiShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

' Type declarations:
Private Type typRect
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

' Constant declarations:
Private Const SW_RESTORE = 9
Private Const SWP_NOSIZE = &H1 ' Don't alter the size
Private Const SWP_NOZORDER = &H4 ' Don't change the Z-order
Private Const SWP_SHOWWINDOW = &H40 ' Display the window

' **************************************
' * Center a form in the Access window *
' **************************************
' Created 1-22-2002 by Peter M. Schroeder
Public Function gfncCenterForm(parForm As Form) As Boolean
    Dim varAccess As typRect, varForm As typRect
    Dim varX As Long, varY As Long
    
    On Error GoTo CenterForm_Error
    Call apiGetClientRect(hWndAccessApp, varAccess) ' Get the Access client area coordinate
    Call apiGetWindowRect(parForm.hwnd, varForm) ' Get the form window coordinates
    varX = CLng((varAccess.Left + varAccess.Right) / 2) - CLng((varForm.Right - varForm.Left) / 2) ' Calculate a new left for the form
    varY = CLng((varAccess.Top + varAccess.Bottom) / 2) - CLng((varForm.Bottom - varForm.Top) / 2) ' Calculate a new top for the form
    varY = varY - 45 ' Adjust top for true center
    varY = varY - 20 ' Adjust top for appearance
    Call apiShowWindow(parForm.hwnd, SW_RESTORE) ' Restore form window
    Call apiSetWindowPos(parForm.hwnd, 0, varX, varY, (varForm.Right - varForm.Left), (varForm.Bottom - varForm.Top), SWP_NOZORDER Or SWP_SHOWWINDOW Or SWP_NOSIZE) ' Set new form coordinates
    gfncCenterForm = True
    Exit Function
    
CenterForm_Error:
    gfncCenterForm = False
End Function

De code om het application window te verbergen begrijp ik niet helemaal maar het werkt.
In de code om de formulieren gecentreerd te krijgen, zie ik dat het application window als referentie wordt gebruikt en daar loopt het mank.

Ik hoop dat jullie begrijpen wat ik eigenlijk precies wil....
Ik ben blij met jullie meedenken.
 
Laatst bewerkt:
Mijn wens is om de formulieren buiten het application window gecentreerd op het scherm te krijgen.
Dat is ook in Access gewoon een optie die je aan- of uit kunt zetten bij formulieren.
 
Dat is ook in Access gewoon een optie die je aan- of uit kunt zetten bij formulieren.
Ik weet dat je dat bij de formuliereigenschappen kunt aanvinken maar dat is alleen een horizontale uitlijning en het werkt niet als het formulier zich niet in het application window bevindt. :(
 
Ik zou zeggen: get a life :D.
 
Waar maak je je druk om, bedoel ik daarmee. Ik vind het een beetje zonde van de tijd om daar veel energie in te steken. Maar met een beetje googlen heb je zo een functie gemaakt die de resolutie uitleest en de formulieren centreert.
Code:
Function SchermResolutie() As String
Dim x  As Long, y   As Long
Dim MyMessage As String
Dim MyResponse As VbMsgBoxResult
     
    x = GetSystemMetrics(SM_CXSCREEN)
    y = GetSystemMetrics(SM_CYSCREEN)
    SchermResolutie = x & "|" & y
End Function

En dat gebruik je dan bijvoorbeeld zo:
Code:
Dim iBr As Long, iHo As Long, iL As Long, iT As Long
    On Error Resume Next
    DoCmd.RunCommand acCmdWindowHide
    
    arrS = Split(SchermResolutie, "|")
    Me.InsideWidth = 7125
    Me.InsideHeight = 9000
    iBr = CInt(arrS(LBound(arrS)))
    iHo = CInt(arrS(UBound(arrS)))
    iL = ((iBr * 15) - Me.InsideWidth) / 2
    iT = ((iHo * 15) - Me.InsideHeight) / 2
    DoCmd.MoveSize iL, iT

't Is dat ik de code al had liggen :).
 
Misschien niet helemaal wat je zoekt:
Ik doe dat door een leeg formulier te maximaliseren waarop ik het feitelijke formulier als subformulier centreer bij het openen.
Dit subformulier geef je de afmeting mee welke iets kleiner is dan de laagste resolutie waarbij het altijd goed leesbaar is.
Je blijft in de access omgeving zitten maar de looks zijn zoals je ze wilt hebben denk ik. (en het is eenvoudig te realiseren) :)
 
Mijn oplossing is denk ik wat netter. Sowieso hou ik niet van onnodige subformulieren; levert alleen maar extra ellende op.
 
Dat klopt, ik gebruik het dan ook alleen bij het startscherm, de rest werkt ook full screen of als popup. Daardoor blijft het zicht voor de gebruiker als een normale windows omgeving aangezien het startscherm altijd actief is.
 
@ OctaFish
De applicatie wordt gebruikt door zo'n 40 verschillende medewerkers. Ik heb de database gesplitst en iedere medewerker krijgt een front-end. Omdat er verschillende monitoren worden gebruikt, van verschillende afmetingen, lijkt het me netjes dat, ongeacht welk soort monitor wordt gebruikt, de formulieren netjes gecentreerd worden weergegeven. Ik heb me verder als doel gesteld dat de drempel om formulieren in te vullen zo laag mogelijk moet zijn. Mede om die reden wil ik dat de database eruit ziet als een op zichzelf staande applicatie. Vandaar mijn wens het application window te verbergen.

Ik heb jouw code geprobeerd in een snelle opzet; formulier gemaakt met een knop die, als je erop klikt, de code onder "DoCmd.RunCommand acCmdWindowHide" uitvoert.
In een module heb ik de Functie "SchermResolutie()" geplakt. Als op de knop gedrukt wordt, verdwijnt het formulier en wordt de functie aangeroepen, daar krijg ik dan een compileerfout te zien: Sub of Functie niet gedefinieerd.
Die fout heeft betrekking op "GetSystemMetrics".
Moet ik een extra verwijzing toevoegen?
Het valt me natuurlijk op dat het formulier verdwijnt, dat is niet wat ik graag wil, ik wil dat het Access Application Window niet zichtbaar is maar het formulier wel.
Ik ben bang dat ik op de een of andere manier niet goed duidelijk maak wat ik precies wil.
 
Je mist nog een variabele die je ergens in een module moet zetten:
Code:
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Overigens haal je een beetje kulargumenten aan als je het mij vraagt; als iemand in Word een brief maakt, of in Excel een werkblad, dan verberg je de werkomgeving toch ook niet? Je kunt een Access database behoorlijk dichttimmeren zodat gebruikers geen verkeerde dingen kunnen doen (probeer dat eens bij Word :) ), maar wel met de functies die gebruikers nu eenmaal kennen van de Office pakketten.
 
Deze laat het werken...:)
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Maar dan hoort het volgende er volgens mij ook bij
Public Const SM_CXSCREEN = 0
Public Const SM_CYSCREEN = 1

Wat dit doet snap ik niet....:confused:
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long

Overigens is het zo dat de werknemers die deze applicatie moeten gaan gebruiken geen kantoormensen zijn. Het zijn mensen die luchtverkeer leiden, dat is hun core business, operationeel bezig zijn. Alles wat daar extra bij komt zijn bijzaken en dus lastig. Argumenten kunnen "kul" zijn in sommige situaties, in andere niet, maar dat is dan weer "als je het mij vraagt".
Maar het is wel heel fijn dat er mensen zoals jij zijn, die veel kennis van Access en VBA hebben en ook nog bereid zijn de tijd te nemen om die te delen, bedankt.
 
Laatst bewerkt:
Die laatste declare heb je inderdaad niet nodig; de regels kwamen uit een andere functie waar ze wél allebei in zitten. Dus deze keer iets teveel gekopieerd. Hopelijk compenseert dat voor de vorige code waarin te weinig was gezet :D.
 
of

Code:
Sub M_snb()
  For Each it In GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select * from Win32_DesktopMonitor")
      MsgBox "height: " & it.ScreenHeight & vbLf & "width: " & it.ScreenWidth
  Next
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan