In Base per Makro erkennen, ob ein Formular geöffnet ist

gefragt 2019-10-27 10:34:49 +0100

HBa Gravatar-Bild

Meine Datenbank verfügt über mehrere Formulare. Das wichtigste Formular heißt "Verwaltung" und von dort aus soll (über einen Button per Makroaufruf bei "Maustaste losgelassen") überprüft werden, ob das Formular "Projekte" geöffnet ist, um darin z.B. einen bestimmten Datensatz auszuwählen.

Ich scheitere bereits beim Überprüfen, ob das Formular "Projekte" geöffnet ist. Für Tipps, wie ich die Überprüfung durchführen kann und wie ich auf das geöffnete Formular zugreifen kann, wäre ich sehr dankbar.

Bearbeiten Tags ändern Melden schließen vereinen löschen

Kommentare

Vermutlich musst Du da irgendwie über die vom StarDesktop aus geöffneten Fenster ran. So etwas wie

StarDesktop.Frames.getByIndex(0).Frames.getByIndex(...).Title Über den Title wirst Du das entsprechende Formular finden können. Du musst natürlich alle von dem Hauptframe abhängigen Fenster untersuchen.

RobertG Gravatar-BildRobertG ( 2019-10-27 12:16:05 +0100 )Bearbeiten

Vielen Dank, aber irgendwie komme ich damit auch nicht weiter: Mit der Funktion

Sub IsFormOpen()
    Dim Frames As Object, i As Long, Frame As Object
    Frames = StarDesktop.GetFrames()
    For i = 0 To Frames.Count - 1
        MsgBox "Frame mit Titel '" & Frames(i).Title & "' gefunden."
    Next i
End Sub

über ein Button-Ereignis in meinem Fomular "Verwaltung" erhalte ich leider nur die Titel der Datenbankanwendung und des Programmierfensters mit dem Makro-Code

Frame mit Titel 'MyDBS.odb - LibreOffice Base' gefunden    
Frame mit Titel 'MyDBS.odb.Standard - LibreOffice Basic' gefunden.

Die ebenfalls geöffneten Formulare "Verwaltung" und "Projekte" werden nicht gefunden.

HBa Gravatar-BildHBa ( 2019-10-27 14:44:20 +0100 )Bearbeiten

Das Formular liegt nicht in der obersten Ebene der Frames. Es ist abhängig von dem Frame des Base-Fensters. Deswegen ist bei meinem Vorschlag auch der Weg in eine weitere Ebene erhalten.

Sub IsFormOpen()
Dim Frames As Object, i As Long, Frame As Object
Frames = StarDesktop.GetFrames()
For i = 0 To Frames.Count - 1
    SubFrames = Frames(i).GetFrames()
    For k = 0 To SubFrames.Count - 1
    MsgBox "Frame mit Titel '" & SubFrames(k).Title & "' gefunden."
    NEXT k
Next i
End Sub

Dies gibt bei mir das geöffnete Formular aus.

RobertG Gravatar-BildRobertG ( 2019-10-27 15:09:36 +0100 )Bearbeiten

Hoppla, das warst Du schneller als ich tippen konnte. Ich ziehe meine geplante Antwort zurück und versuche deinen tieferen Ansatz. Das wird aber leider heute nichts mehr, da ich gleich weg muss. Vielen Dank, ich melde mich wieder. Einen schönen Sonntag noch ;)

HBa Gravatar-BildHBa ( 2019-10-27 15:24:43 +0100 )Bearbeiten

Servus RobertG. Vielen herzlichen Dank. So klappt die Überprüfung, ob ein Formular geöffnet ist sehr elegant. Jetzt muss ich nur noch einen Weg finden, wie ich mich zu dem geöffneten Formular "Projekte" durchhangle. Über

ThisDatabaseDocument.FormDocuments...

scheint der Zugriff auf die Instanz des Formulars nicht zu klappen. Ich versuch(t)e es jetzt mal über

ThisComponent...

habe jedoch den Eindruck, dass ich dort im aufrufenden Formular "Verwaltung" feststecke.

HBa Gravatar-BildHBa ( 2019-10-28 07:10:18 +0100 )Bearbeiten

Nach einer Bestätigung, dass das Formular "Projekte" geöffnet ist, habe ich jetzt versucht vom Formular "Verwaltung" über ein Button-Ereignis eine Verbindung zum Formular "Projekte" mit

Form = ThisComponent.Parent.FormDocuments.getByName("Projekte")

aufzubauen. Ein nachfolgendes

Form.updateRow()

führt allerdings zur Fehlermeldung

Eigenschaft oder Methode nicht gefunden: updateRow

Es scheint mir so, als dass ich zwar zur programmtechnischen Struktur des Formulars "Projekte" gelangt bin, nicht aber zur geöffneten Instanz des Formulars "Projekte". Kann das sein? Ich weiß leider momentan wieder mal nicht weiter und bitte um Rat. Besten Dank

HBa Gravatar-BildHBa ( 2019-10-28 09:39:15 +0100 )Bearbeiten

Mein dringender Rat: Lade Dir XRay herunter. Damit untersuche ich für Makros immer die vorhandenen Eigenschaften und Methoden.

Wenn Du bei dem Formulardokument bist, dann bist Du noch nicht bei den Formularen, die in dem Dokument liegen. Das ist ein bisschen blöd vom Sprachgebrauch her. Ich mache das einmal an dem folgenden Code deutlich:

oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("Filter")

oDoc ist das Formulardokument. Die Drawpage ist das, was alle möglichen für Dich auch sichtbaren Inhalte des Formulars enthält. Auf dieser Drawpage hast Du dann mindestens ein Formular, meist auch noch ein Unterformular oder Nebenformular sitzen. Was bei Deinem Code oben "Form" heißt, das ist bei dem obigen Code oDoc.

RobertG Gravatar-BildRobertG ( 2019-10-28 17:07:42 +0100 )Bearbeiten

Vielen Dank für die ergänzenden Erläuterungen. Das mit dem XRay werde ich mal probieren. Für das erste habe ich aber vielleicht eine Lösung gefunden, bei der ich das Formular einfach neu öffne. Das wirkt nach meinem ersten Eindruck wie ein Reload für das geöffnete Formular, ohne tatsächlich ein neues zu öffnen:

Dim oDoc AS Object, Form AS Object
oDoc = ThisDatabaseDocument.FormDocuments.getByName("Projekte").open
Form = oDoc.Drawpage.Forms.MainForm
do  
  wait 10
loop until Form.isLoaded
Form.updateRow()
HBa Gravatar-BildHBa ( 2019-10-29 06:09:53 +0100 )Bearbeiten