Base: Formulare ohne Symbolleisten in einem Fenster

Hallo zusammen!

Im Handbuch wird beschrieben, wie man in Base Symbolleisten ausblenden kann. Das funktioniert auch wunderbar, wenn man ein Dokument öffnet über einen Makros, der wie im Handbuch beschrieben gestartet wird (und zwar über die Eigenschaften des Formularfensters: Extras → Anpassen → Ereignisse → Dokument öffnen → Symbolleisten_Ausblenden

Wenn man jedoch beim Programmstart über ein Makros unmittelbar ein ausgewähltes Formular öffnet (also man klickt nur auf den Ordner name.odb) und das ausgewählte Formular öffnet, dann ist es nicht immer so, dass die Symbolleisten ausgeblendet sind (abhängig vom Betriebssystem).

Sie SIND DANN NICHT IM FORMULAR AUSGEBLENDET, sondern in der Ebene darüber (also dem allerersten Fenster von Base - Tabellen, Abfragen, Berichte). Der Befehl "Wait" führt nicht weiter, zumindest nicht immer.

Das Problem liegt wohl in der Befehlszeile: oFrame = StarDesktop.getCurrentFrame() ! WIE LAUTET der Befehl, um das Formular (hier Frame) direkt, also über getByName aufzurufen?

Grüße
Gerhard

Muster-Makro aus dem Handbuch:

SUB Symbolleisten_Ausblenden
DIM oFrame AS OBJECT
DIM oWin AS OBJECT
DIM oLayoutMng AS OBJECT
DIM aElemente()
DIM i AS INTEGER
oFrame = StarDesktop.getCurrentFrame()
oWin = oFrame.getContainerWindow()
oWin.IsMaximized = true
oLayoutMng = oFrame.LayoutManager
aElemente = oLayoutMng.getElements()
FOR i = LBound(aElemente) TO UBound(aElemente)
    IF aElemente(i).ResourceURL = "private:resource/toolbar/formsnavigationbar" THEN
    ELSE
    oLayoutMng.hideElement(aElemente(i).ResourceURL)
END IF
NEXT
END SUB

Hallo Gerhard,

kannst Du mir einmal ein einfaches Beispiel dafür zuschicken. Ich teste
das gerne, habe zum Nachbauen aber im Moment nicht die große Lust.

Das Problem liegt wohl in der Befehlszeile: oFrame =
StarDesktop.getCurrentFrame() ! WIE LAUTET der Befehl, um das Formular
(hier Frame) direkt, also über getByName aufzurufen?

Du hast doch das Makro zum Ausblenden weiterhin direkt an das Formular
gekoppelt, oder?

Gruß

Robert

Hallo Robert,

hier ein Muster. Hier zuhause auf meinem Rechner mit LinuxMint funktioniert die Sache.  (Ich muss mal auf Arbeit testen mit Windows).
Der Makro wirkt sicherlich eigenartig, weil er sich aus Unter-Makros zusammen setzt, die hier keinen (Architektur-)Sinn haben. In "meinem" Base sind mehrere Formulare, die in dem angehängten Beispiel "Ausblenden.odb" nicht enthalten sind. Ich habe es so stehen lassen, damit Du erkennen kannst, wie die Struktur des Makros ist.

Die einzelnen Makros sind deinem Handbuch entnommen.

Grüße
Gerhard

Hallo Gerhard,

hier ein Muster. ...

falls Du die Mail nur an die Liste geschickt hast, musst Du den Anhang auf einem frei zugänglichen Server bereitstellen; Datei-Attachments werden in der Liste nicht übermittelt.

Ich verwende für solche Fälle gemäß der Empfehlung von Kuketz <https://forum.kuketz-blog.de/viewtopic.php?t=890> die Seite <https://transfer.sh/> https://transfer.sh/.

Gruß
Michael

Danke Klaus,

hier der Link

https://transfer.sh/ff8ZE/Ausblenden.odb

zum meinem kleinen Beispiel "Ausblenden von Symbolleisten".

Das Beispiel funktioniert (leider) bei Windows und Linux, wie ich inzwischen feststellen musste.

Bei der "fehlerbehafteten" Base-Anwendung vollzieht sich das Ausblenden nur auf der Startseite, aber nicht im Dokument (obwohl das Dokument per Makro angesprochen wird und nicht die Startseite). Vielleicht hat es damit zu tun, dass diese Base-Anwendung eine mysql-Datenbank auf einen Server aufruft. Da dauert das Laden naturgemäß länger. Vielleicht liegt es daran.

Grüße
Gerhard

Hallo gerhard,

Das Beispiel funktioniert (leider) bei Windows und Linux, wie ich
inzwischen feststellen musste.

Bei der "fehlerbehafteten" Base-Anwendung vollzieht sich das Ausblenden
nur auf der Startseite, aber nicht im Dokument (obwohl das Dokument per
Makro angesprochen wird und nicht die Startseite). Vielleicht hat es
damit zu tun, dass diese Base-Anwendung eine mysql-Datenbank auf einen
Server aufruft. Da dauert das Laden naturgemäß länger. Vielleicht liegt
es daran.

Wie lädst Du denn die MySQL-Datenbank? Auch vorher per Makro ohne
Nutzereingabe des Passwortes?

Gruß

Robert

Hallo Gerhard,

noch ein Hinweis: Versuche es einmal damit, dass Du beim Formular
"Ansicht wurde erzeugt" mit dem Makro verbindest. In Formularen wird
dieses Ereignis noch ausgegeben, direkt beim Öffnen von einer Base-Datei
leider nicht.

Gruß

Robert

Hallo Robert,
die mysql-Datenbank wird per Makro geladen ohne Passworteingabe. Sie ist für mehrere Benutzer eingerichten ("für unser Kulturhaus"). Die Trennung der Nutzer erfolgt dabei gemäß Handbuch  "Filter - CONNECTION_ID()"

Grüße
Gerhard

Option Explicit

GLOBAl user_GL as STRING
PUBLIC iBetriebssystem AS INTEGER
GLOBAL stBrief_GL AS STRING
GLOBAL Bildschirmgroesse_GL  AS INTEGER
GLOBAL Druckgroesse_GL AS INTEGER

PUBLIC iMouseClick_GL AS INTEGER 'für Dialoge

rem ========== Startformular öffnen ==========
' Makro Start über Hauptdokument (erstes Dokument9 --> Dokument öffnen
SUB Startformular_oeffnen
   CALL  Tabelle_Filter_Connection_ID ' SUBroutine!
   DIM oController
   DIM oFILTER AS OBJECT
   DIM oFrame AS OBJECT
   oFrame = StarDesktop.getCurrentFrame()
   oController = ThisDatabaseDocument.CurrentController
   IF not ( oController.isConnected() ) THEN oController.connect() ' Connect to the database, if necessary
   wait 3000
   ThisDatabaseDocument.formdocuments.getbyname("pPerson").open
END SUB

SUB  Tabelle_Filter_Connection_ID
'On Error GoTo ExErrorHandler
   DIM oDatenquelle AS OBJECT
   DIM oVerbindung AS OBJECT
   DIM oSQL_Anweisung AS OBJECT
   DIM oAbfrageergebnis AS OBJECT
   DIM sSql AS STRING
   DIM maxfilterid AS INTEGER
   DIM connection_id AS INTEGER
   DIM idaa AS INTEGER
   DIM l_OS_Index AS INTEGER 'Betriebssystemabfrage
   DIM s_OS AS STRING 'Betriebssystemabfrage
   oDatenquelle = thisDatabaseDocument.CurrentController
   IF NOT (oDatenquelle.isConnected()) THEN oDatenquelle.connect()
   oVerbindung = oDatenquelle.ActiveConnection()
   oSQL_Anweisung = oVerbindung.createStatement()

' -------- SQL-Befehle --------------------
' --- Löschen von Filter-Zeilen, die älter als 20 Tage sind
    sSql = "DELETE FROM az.filter WHERE  DATEDIFF( `datum`, CURDATE( ) ) < -20"
        oSql_Anweisung.executeUpdate(sSql)
    sSql = "SELECT min(idaa) FROM az.aaktenzeichen AS aaktenzeichen WHERE SIGN( DATEDIFF( a_datum, CURDATE( ) ) + 1 ) > 0 ORDER BY idaa ASC"
        oAbfrageergebnis = oSQL_Anweisung.executeQuery(sSql)
           WHILE oAbfrageergebnis.next
            idaa = oAbfrageergebnis.getLong(1)
        Wend
   sSql = "DELETE FROM `filter` WHERE `connection_id` = CONNECTION_ID();"
        oSql_Anweisung.executeUpdate(sSql)
' DEFINITIONEN . Hinweis: Auch gibt es Einträge in die Tabelle Filter -> Defaultwerte
   sSql = "REPLACE INTO filter (fil_lb_info, of_udate_sign, fil_lb_anmeldung, connection_id, name, datum) VALUES( 0, 1,"+idaa+", CONNECTION_ID(), USER(), CURRENT_TIMESTAMP())"
   oSQL_Anweisung.executeUpdate(sSql)

sSql = "SELECT SUBSTRING_INDEX( USER(), '@', 1)"
      oAbfrageergebnis = oSQL_Anweisung.executeQuery(sSql)
           WHILE oAbfrageergebnis.next
            user_GL = oAbfrageergebnis.getString(1)
        Wend
REM ---------------------------------- DEFINITIONEN
' Bildschimgröße und Druckgröße
    IF user_GL     = "GDi" THEN
        Bildschirmgroesse_GL  = 125
        Druckgroesse_GL = 125
    ELSEIF user_GL = "Syl" THEN
        Bildschirmgroesse_GL  = 120
        Druckgroesse_GL = 95
    ELSEIF user_GL = "JKu" THEN
        Bildschirmgroesse_GL  = 110
        Druckgroesse_GL = 95
    ELSE
        print "User für Bildschirmgröße nicht festgelegt --> Makro start"
    END IF

stDateiaufruf_3_GL = "/KULTUR" ' gilt für alle! Ausnahmen dann bei den einzelnen Nutzern, z.B. GMi (siehe unten)
    stBrief_GL = user_GL
    IF user_GL     = "GTe" THEN
       stBrief_GL  = "GDi"
    ELSEIF user_GL = "LapVM" THEN
       stBrief_GL  = "LapVM"
    ELSEIF user_GL = "SGr" THEN
       stDateiaufruf_3_GL = "/Daten/KULTUR"
    END IF
' Betriebssystem anhand des verwendeten Fenster-Managers ermitteln
   l_OS_Index = GetGUIType()
   Select Case l_OS_Index
rem ------------------------------------------------- DEFINITIONEN
   Case 1
      ' Kennung für dieTask: 0
      iBetriebssystem = 0
   Case 3
      s_OS = "MacOS (in dieTask nicht definiert)" ' nicht definiert
      msgbox "Diese LibreOffice.org läuft unter: " & s_OS , "OOo Makro: Betriebssystem ermitteln"
   Case 4
      ' Kennung für dieTask: 1
      iBetriebssystem = 1
   Case ELSE
   s_OS = "unbekannter Rückgabewert für Betriebssystem"
   msgbox "Diese LibreOffice.org läuft unter: " & s_OS , "Makro-Einträge"
END Select
Exit SUB
'ExErrorHandler:
'    MsgBox("Die Datenbank konnte nicht verbunden werden! Sie wird geschlossen."+CHR$(13)+"Bitte 'dieTask' neu starten!", 48 + 0, "Info!")
'    ThisDatabaseDocument.Close(True)
END SUB

SUB PCName
DIM stPC1 AS STRING
DIM stPC2 AS STRING
stPC1 = Environ("HOME")  'HOME (Windows leer)
MsgBox "'" & stPC1 & "'" ,64,"Computername 1:"
stPC2 = Environ("USER")   '(Windows leer)
MsgBox "'" & stPC2 & "'" ,64,"Computername 2:"
END Sub

Hallo Gerhard und Robert,

Bei der "fehlerbehafteten" Base-Anwendung vollzieht sich das Ausblenden nur auf der Startseite, aber nicht im Dokument (obwohl das Dokument per Makro angesprochen wird und nicht die Startseite).

Ich habe jetzt die Ausblenden.odb heruntergeladen und verstehe das Problem falsch oder kann es nicht nachvollziehen:

1. odb im Explorer mit Doppelklick starten:
      * Formular öffnet, ohne Menuleiste (Datei  Bearbieiten, ...) und
        ohne Symbolleisten, d.h. weißen Blatt mit Text "leer" und dem
        Button.
2. Formular schließen, Formular öffnen:
      * Verhalten und Anzeige wie unter 1.)
3. In das Makro " Symbolleisten_Ausblenden_pPerson" ein MsgBox nach
    "WAIT 600" eingebaut (ich denke das ist das zitierte "Dokument"?)
      * Formular öffnet, mit Menuleiste, MsgBox erscheint, nach
        Bestätigung Verhalten und Anzeige wie unter 1.)

Wenn ich die erste Anfrage richtig verstehe, ist sind 1.) und 2.) doch das gewünschte Verhalten?!

LibreOffice (Original ODF-Download) Version: 6.1.5.2, Build-ID: 90f8dcf33c87b3705e78202e3df5142b201bd805, CPU-Threads: 4;
BS: Linux 4.18; UI-Render: Standard; VCL: kde4; Gebietsschema: de-DE (de_DE.UTF-8); Calc: group threaded
kUBUNTU 18.04

Gruß Michael

Hallo Robert,

wenn ich den Makro mit "Ansicht wurde erzeugt" verbinde, dann friert das Formular, was sich öffnen soll, ein. Ich muss dann Base neu starten.
Ich versuche mal, in die Richtung zu arbeiten, das zu öffnende Dokument direkt zu adressieren.

oForm = thisComponent.Parent.FormDocuments
oDoc = oForm.getByName("pPerson").open

Im Base-Handbuch ist bei Symbolleisten ausblenden allerdings  die  Zuweisung mit oFrame.
Ich muss schauen, ob das analog geht.

Ansonsten baue ich eine "Zwischenseite", also eine Menü-Seite, die sich dann öffnet und auf der man die einzelnen Module auswählen kann, anstelle sofort in ein Modul beim Programmstart zu gelangen.

Grüße
Gerhard

Hallo Michael,

das Verhalten lässt sich ja bei der Beispieldatenbank nicht
nachvollziehen, da die keine Anbindung zu einer externen Serverdatenbank
hat. Deswegen funktioniert die interne Datenbank ja korrekt, bei mir mit
"Ansicht wurde erzeugt" anscheinend sogar flüssiger.

Gruß

Robert

Hallo Gerhard,

ich habe das jetzt auch einmal getestet. Selbst bei einer
MySQL/MariaDB-Datenbank, zu der die Verbindung bereits besteht, wird
statt der Symbolleisten und des Menüs im Formular das Menü und die
Symbolleisten des übergeordneten Dokumentes (*.odb-Datei) ausgeblendet.
Teste ich noch einmal etwas mehr.

Gruß

Robert

Hallo Michael,

umgekehrt soll es sein: die Symbolleisten von (hier) "pPerson" soll ausgeblendet werden. Aber statt dessen werden die Symbolleisten von der Startseite (also die Seite mit "Tabellen / Abfragen /Formulare / Berichte" ausgeblendet (und die Symbolleisten vom Formular "pPersonen" nicht).

Leider tritt in meiner Beispieldatei der unerwünschte Effekt nicht auf. Ich vermute mal, dass das Laden von "Base" aufgrund der externen Anbindung einer mysql-Datenbank mit vielen Feldern relativ lange (also ein paar Milisekungen mehr)  dauert, so die Befehlszeile des Makros mit "oFrame = StarDesktop.getCurrentFrame()" die Startseite ansteuert und nicht das Formular "pPerson".

Zuhause habe ich einen Linuxrechner im Einsatz, auf dem zugleich der mysql-Server installiert ist (also alles in einem Gerät). Da tritt dieser Fehler nicht auf. Auf der Arbeit Windowsrechner mit Windows 7 und 10 und externen my-sql-Server: da treten der Fehler auf.

Grüße
Gerhard

Hallo Robert,

ich habe bei mir folgende Lösung gefunden: damit die Symbolleisten des angesprochenen Formulars und nicht die des übergeordneten Menüs (*.odb-Datei) ausgeblendet werden.
Man muss das Formular (Formularname hier bei mir in meiner Datenbank "pPerson") explizit ansprechen (dann braucht man auch keine wait-Kommandos mehr).
Also:
oForm = thisComponent.Parent.FormDocuments
oDoc = oForm.getByName("pPerson").open

Der gesamte Makro in meiner Datenbank

Grüße
Gerhard

SUB Symbolleisten_Ausblenden_pPerson
DIM oDrawpage AS OBJECT
DIM oForm AS  OBJECT
DIM oDoc AS OBJECT
oForm = thisComponent.Parent.FormDocuments
oDoc = oForm.getByName("pPerson").open
DIM oFrame AS OBJECT
DIM oWin AS OBJECT
DIM oLayoutMng AS OBJECT
DIM aElemente()
DIM i AS INTEGER
'oFrame = StarDesktop.getCurrentFrame() <- müsste wohl auch funktionieren, dieses Kommando ist im Handbuch aufgeführt.
oFrame = Thiscomponent.currentcontroller.frame '<- dieses habe ich verwendet
ThisComponent.CurrentController.Frame.Title = "Person"
ThisComponent.CurrentController.ViewSettings.ZoomValue  = Bildschirmgroesse_GL
oWin = oFrame.getContainerWindow()
oWin.IsMaximized = true
oLayoutMng = oFrame.LayoutManager
aElemente = oLayoutMng.getElements()
FOR i = LBound(aElemente) TO UBound(aElemente)
    IF aElemente(i).ResourceURL = "private:resource/toolbar/formsnavigationbar" THEN
    ELSE
    oLayoutMng.hideElement(aElemente(i).ResourceURL)
    END IF
NEXT
END SUB