Hallo Freischreiber,
sondern ich ärgere mich jedesmal und ziehe das Fenster manuell zurecht.
Diesen Ärger schaffte ich mir durch ein einziges Makro vom Hals, mit dem ich Datenbankformulare so automatisch öffnen lasse, wie ich es wünsche.
Die position, zoom, menu u.a. Daten stehen in einer einzigen Tabelle der Datenbank mit den Formularnamen als Zugriffschlüssel/ID. Jedes Formular öffnet mit dem gleichen Startmakro, welches nun seine Daten aus der Tabelle ausliest und das Formular genaus so und an der Stelle öffnet, wie ich es eingestellt habe.
Ich habe sogar einen Standardeintrag so festgelegt, dass jedes, (etwa noch) nicht explizit eingerichtetes Formular zunächst etwa mittig und voll sichtbar dargestellt wird. Dieses Vorgehen ist besonders für große Bildschirme und entsprechende Formulare m. M. n. ratsam. Meine Formulare werden alle im Normal- und eben nicht Web-Modus dargestellt.
Code: Alles auswählen
Sub SETFORM
'Makro beim Starten eines Formulars um sein Layout zu definieren,
'die Datenbank muss angemeldet sein, ihr Name muss der
'Name des .odb-Containers in Großbuchstaben sein!
'Das Makro sollte im Hauptformular unter "Beim Laden" eingetragen sein
ON ERROR GOTO Abbruch 'bei Fehler wird dieser angezeigt und Programm abgebrochen!
Dim WINIST As New com.sun.star.awt.Rectangle
'der aktuelle Frame ist das zu öffnende Formularfenster
oFrame=thisComponent.CurrentController.Frame
'akt. Fenstertitel des Frames, etwa "db1.odb : Form1 - LibreOffice Base ..."
sTITLE = oFrame.Title
'Auslesen des Dateinamens, etwa "db1"
sName0 = Split(sTITLE,".")
'Zuweisen des - angemeldeten - DB-Namens, Großbuchstaben!
sDB = UCase(sName0(0))
sName1 = Split(sTITLE,":")
sName0 = Split(Trim(sName1(1)),"-")
'Name des Formulars wie unter "Formulare"
sFormName = Trim(sName0(0))
'in der Tabelle T_FORMANZ sollten Größe u. Pos. eingetragen sein, sonst wie dortiger "STANDARD"-Datensatz!
sSQL = "SELECT * FROM T_FORMANZ WHERE FORMNAME='" & sFormName & "'"
Abfrageergebnis = SQLSTATEM(sDB).executeQuery(sSQL)
If Not Abfrageergebnis.next THEN
sSQL = "SELECT * FROM T_FORMANZ WHERE FORMNAME='STANDARD'"
Abfrageergebnis = SQLSTATEM(sDB).executeQuery(sSQL)
Abfrageergebnis.next
EndIf
lX=Abfrageergebnis.getLong(2)
lY=Abfrageergebnis.getLong(3)
lBREITE=Abfrageergebnis.getLong(4)
lHOEHE=Abfrageergebnis.getLong(5)
'Bildschirm mit 3840*2160 Pixel
If lX=0 THEN lX = (3840-lBREITE)/2
If lY=0 THEN lY = (2160-lHOEHE)/2
n=0
bSETZTITEL=Abfrageergebnis.getBoolean(6)
bOHNEMENUE=Abfrageergebnis.getBoolean(7)
bNAVILEISTE=Abfrageergebnis.getBoolean(8)
SPR1:
n=n+1
oFrame.ContainerWindow.SetPosSize(lX,lY,lBREITE,lHOEHE,15)
wait n*100
WINIST = oFrame.ContainerWindow.getPosSize()
IF NOT (WINIST.X=lX AND WINIST.Y=lY AND WINIST.WIDTH=lBREITE AND WINIST.HEIGHT=lHOEHE) AND n<7 THEN GoTo SPR1
'MsgBox n
oFrame.Controller.ViewSettings.ZoomValue = 100
IF bSETZTITEL THEN
oFrame.SetTitle(sFormName)
EndIf
IF bOHNEMENUE THEN
lmgr = oFrame.LayoutManager
LayoutElements = lmgr.getElements
for i = 0 to UBound(LayoutElements, 1)
lmgr.hideElement(LayoutElements(i).ResourceURL)
next i
EndIf
'aElemente(0) = "private:resource/menubar/menubar"
'aElemente(1) = "private:resource/statusbar/statusbar"
'aElemente(2) = "private:resource/toolbar/formsnavigationbar"
'aElemente(3) = "private:resource/toolbar/standardbar"
'aElemente(4) = "private:resource/toolbar/formdesign"
'aElemente(5) = "private:resource/toolbar/formcontrols"
IF bNAVILEISTE THEN
BAR = "private:resource/toolbar/formsnavigationbar"
IF NOT(lmgr.requestElement(BAR)) THEN
lmgr.createElement(BAR)
END IF
lmgr.showElement(BAR)
EndIf
Exit Sub
Abbruch:
MsgBox "Fehler " & ERR & ": " & ERROR$ + CHR(13) + "In Zeile : " + ERL + CHR(13) + NOW , 16 ,"Fehler aufgetreten"
Ende:
End Sub
Das Leben ist zu kurz, um sich - unnötig - zu ärgern.
Mit herz4lichen Grüßen