Libre Office

Gelöst: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Aubergino
Beiträge: 44
Registriert: Di 6. Feb 2024, 20:12

Re: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren

Beitrag von Aubergino » So 8. Mär 2026, 13:49

Moin die Runde, nun bin ich wohl am Ziel: Auch das vollständige Schließen der DB nach Formular-Schließen klappt, wenn ich nicht einen passwortgeschützen Adminmode eingeschaltet habe (globale Bool'sche Variable, die über einen Button im Formular umgeschaltet wird).

Und auch die LO-Prozesse, die im Taskmanager stehen blieben und sich sogar beim Speicherbedarf mit jedem Mal steigerten, bekomme ich nun zu, mit einer von der Google-KI vorgeschlagenen Zeile (wo auch immer die das hernimmt).

(Das dürfte allerdings vermutlich nur für Windows-Nutzer passen)

Zusammen mit dem automatischen Öffnen des Anwenderformulars und dem Ausblenden der Menus und Menuleisten ist es somit (ohne Passwort) nicht mehr möglich, in das Datenbankfenster bzw. die Programmierebene zu gelangen (oder gibt es noch was über Tastenkombinationen?).

Hier der Code für das Schließen. Er wird als Ereignis aufgerufen unter "Formular bearbeiten"->"Anpassen"->"Ereignisse"-> "Dokument wird geschlossen". Der Code steht nicht unter "meine Makros und Dialoge", sondern in den Datenbankeigenen Makros. Ohne das "if oFrames.Count = 0" würde der Code auch alle anderen LO-Fenster rücksichtslos schließen, mit dieser Überprüfung passiert das nicht und es wird nur das Datenbankfenster der aktuell bearbeiteten Datenbank geschlossen.

Code: Alles auswählen

Sub CLoseDB
  Dim dispatcher
  Dim oForm As Object
  Dim oDocument As Object
  Dim oParent As Object
  Dim oFrames As Object
  Symbolleisten_an
  wait(200)
  If not Adminmode then  
    oDocument   = ThisComponent.Parent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    dim args1(0) as new com.sun.star.beans.PropertyValue
    args1(0).Value = 0
    dispatcher.executeDispatch(oDocument, ".uno:Save", "", 0, args1())
    oParent = ThisComponent.getParent()
    oParent.close(true)
    oFrames = StarDesktop.Frames
    IF oFrames.Count = 0 THEN
      wait(1000)
      Shell "taskkill /F /IM soffice.bin", 0
    End if
  end if  
End Sub
Das Schließen des Formulars kann über das Schließkreuz ausgelöst werden, soll aber über einen dafür vorgesehenen Button ausgelöst werden, damit u.a. Änderungen gespeichert werden. Das Ereignis, das dieser Button auslöst, enthält am Ende:

Code: Alles auswählen

  oDoc = ThisDatabaseDocument 
  oDoc.Store()
  wait(200)
  ThisDatabaseDocument.FormDocuments.getByName("frmObjekte").close
Das in der DBClose-Sub aufgerufene "Symbolleisten_an" zum Wiedereinschalten der Symbol- und Menuleisten (nötig, falls man als Admin nachher in den Formularbearbeitungsmodus gehen will) sieht so aus:

Code: Alles auswählen

Sub Symbolleisten_an
Dim oFrames As Object
DIM oFrame AS OBJECT
DIM oLayoutMng AS OBJECT
DIM aElemente()
DIM oWin AS OBJECT
DIM i AS integer
  oFrame = StarDesktop.getCurrentFrame()
  oLayoutMng = oFrame.LayoutManager
  aElemente = oLayoutMng.getElements()
  FOR i = LBound(aElemente) TO UBound(aElemente)
    oLayoutMng.showElement(aElemente(i).ResourceURL)
  NEXT
  ThisComponent.CurrentController.Sidebar.Visible = True
  ThisComponent.CurrentController.ViewSettings.ShowRulers = True
  'Datenbankfenster einblenden
  oFrames = StarDesktop.Frames
  For i = 0 To oFrames.Count - 1
    oFrame = oFrames.getByIndex(i)
    If oFrame.Name = "Bestand.odb" Or InStr(oFrame.Title, "– LibreOffice Base") > 0 Then
      oFrame.ContainerWindow.setVisible(True)
    End If
  Next i
End Sub
Der Vollständigkeit halber hier noch die Abläufe beim Starten der Datenbank:
im Datenbankfenster unter Extras -> "Anpassen" ->"Ereignisse"->"Dokument öffnen" wird eine Sub "OnOpenDocument" aufgerufen:

Code: Alles auswählen

Sub OnOpenDocument()
Dim oController AS OBJECT
Dim oDoc AS OBJECT
Dim sUrl_Start AS STRING
  oDoc = ThisComponent
  sUrl_Start = oDoc.URL
  if FileExists(sUrl_Start & ".lck") Then
    Msgbox("Datei bereits an anderem Arbeitplatz geöffnet")
    Exit Sub
  End if
  oController = ThisDatabaseDocument.CurrentController
  If not (oController.isConnected()) Then oController.connect() ' Connect to the database, if necessary 
  DialogLibraries.LoadLibrary("Standard")
  Datenbankbackup
  oController.loadComponent(com.sun.star.sdb.application.DatabaseObject.FORM, "frmObjekte", FALSE)
End Sub
Hier wird das Anwenderformular geöffnet, und dem wurde im Bearbeitungsmodus unter "Extras" -> "Anpassen"->"Ereignisse"->"Dokument öffnen" noch das Ausschalten der Symbol- und Menuleisten mitgegeben:

Code: Alles auswählen

Sub Symbolleisten_aus(oEvent AS Object)
Dim oFrames As Object
DIM oFrame AS OBJECT
DIM oWin AS OBJECT
DIM oLayoutMng AS OBJECT
DIM aElemente()
DIM i AS integer
oFrame = oEvent.Source.CurrentController.Frame
oFrame.setTitle "Objekterfassung"
oWin = oFrame.getContainerWindow()
oLayoutMng = oFrame.LayoutManager
aElemente = oLayoutMng.getElements()
FOR i = LBound(aElemente) TO UBound(aElemente)
  IF aElemente(i).ResourceURL = "private:resource/toolbar/formsnavigationbar" THEN
  ELSE
' Folgende Zeile auskommentieren, wenn im Bearbeitungsmodus geöffnet
' werden soll und dafür dann die Menuleiste des Formulars gebraucht wird!
    oLayoutMng.hideElement(aElemente(i).ResourceURL)
  END IF
NEXT
ThisComponent.CurrentController.Sidebar.Visible = False
ThisComponent.CurrentController.ViewSettings.ShowRulers = False
ThisComponent.CurrentController.ViewSettings.ShowParaBreaks = False
'Datenbankfenster ausblenden
oFrames = StarDesktop.Frames
For i = 0 To oFrames.Count - 1
  oFrame = oFrames.getByIndex(i)
  If oFrame.Name = "Bestand.odb" Or InStr(oFrame.Title, "– LibreOffice Base") > 0 Then
    oFrame.ContainerWindow.setVisible(False)
  End If
Next i
End Sub
Da bis auf den KI-empfohlenen kleinen Schnipsel mit dem "Kill" praktisch alle Codeteile nur leicht angepasste Codeteile von Robert G sind, hier noch mal meinen herzlichen Dank für Deine Veröffentlichungen, Robert! Korrekturen, Vereinfachungsvorschläge und Optimierungen werden gern genommen, denn ich verstehe lange nicht alle Codezeilen und kann mir gut vorstellen, dass da Redundanzen drin sind.

Tschüs,
Aubergino

Aubergino
Beiträge: 44
Registriert: Di 6. Feb 2024, 20:12

Re: Gelöst: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren

Beitrag von Aubergino » Mo 9. Mär 2026, 09:06

...heute morgen auch auf dem Anwenderrechner getestet - auch da klappt es stabil...

Open Office
Antworten