Makro funktioniert nicht wenn fremdgestartet

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

chrdz
**
Beiträge: 39
Registriert: Mi, 19.04.2006 11:57
Wohnort: Bayern

Makro funktioniert nicht wenn fremdgestartet

Beitrag von chrdz »

Hallo,

mein Makro "Rack_Display" funktioniert an sich einwandfrei. Dies gilt aber nur solange, wie ich das Formular in dem ich das Makro aufrufe direkt (über Formulare - Doppelklick auf Formular) starte. Öffne ich dieses Formular aber via Makro aus einem anderen Formular:

Code: Alles auswählen

FormName = oButtonName
Context=CreateUnoService("com.sun.star.sdb.DatabaseContext")
DB=Context.getByName("GCS-tool-management")
Conn=DB.getconnection("GCS","Shanghai")
Args(0).Name="ActiveConnection" : Args(0).Value=Conn
Args(1).Name="OpenMode" : Args(1).Value="open"
FormDoc=DB.DatabaseDocument.FormDocuments.loadComponentFromURL(FormName,"_self",2,Args()) REM << BASIC-Laufzeitfehler.
FormDoc.CurrentController.Frame.ContainerWindow.setFocus()
kommt bei der Ausführung der Fehler "BASIC-Laufzeitfehler. Objektvariable nicht belegt."

Hier noch das Problemmakro:

Code: Alles auswählen

Sub Rack_Display2
Dim oMyForm as object
Dim oControl as Object
Dim Filter as String
Dim oPB as Object
Dim oMRI as object
Dim i as Integer
Dim oName as String
'oMyForm = StarDesktop.CurrentComponent.Drawpage.Forms.getbyName("Tools").getbyname("Tool_details")
oMyForm = thisComponent.Drawpage.Forms.getbyName("Tools").getbyname("Tool_details")
	oMRI = CreateUnoService( "mytools.Mri" )
	oMRI.inspect( oMyForm )
	msgBox "wartamol"
'oControl = oMyForm.getbyname("Sites_Concat")
'Filter = Left(oControl.getCurrentValue(),Instr(oControl.getCurrentValue(),":")-1)
'oMyForm.getColumns.getbyname("location_id").Value = Filter
oControl = oMyForm.getColumns.getbyname("location_id")
Filter = oControl.Value
oMyForm = StarDesktop.CurrentComponent.Drawpage.Forms.getbyName("Tools").getbyname("Tool_details").getbyname("Storage")
oControl = oMyForm.getbyname("Location")

if Filter = "2" then
	for i = 1 to 4
	oName = "Location"+Str(i)
	oControl = oMyForm.getbyname(oName)
	'oMRI = CreateUnoService( "mytools.Mri" )
	'oMRI.inspect( oControl )
	oControl.EnableVisible = True
	next i
	else
	for i = 1 to 4
	oName = "Location"+Str(i)
	oControl = oMyForm.getbyname(oName)
	oControl.EnableVisible = False
	next i
endif
	
'msgBox Filter
End Sub
Kann mir jemand weiterhelfen?

Gruß
Christian
Viele Wege führen zum Ziel, aber alle nach Rom.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Makro funktioniert nicht wenn fremdgestartet

Beitrag von DPunch »

Aloha

Wann und wie rufst Du denn das "Promlemmakro" auf?
chrdz
**
Beiträge: 39
Registriert: Mi, 19.04.2006 11:57
Wohnort: Bayern

Re: Makro funktioniert nicht wenn fremdgestartet

Beitrag von chrdz »

DPunch hat geschrieben:Aloha

Wann und wie rufst Du denn das "Promlemmakro" auf?
Das Makro wird aus einem anderen Formular per Mausklick gestartet (über 1. Makro Code). Mein eigener Verdacht ist, dass das geöffnete Formular nicht als "StarDesktop.CurrentComponent" oder "thisComponent" angesprochen werden kann.
Muss ich den Aufruf des Formulars (Makro 1) anders gestalten? Fehlt noch ein Befehl im Aufruf um das Formular als "CurrentComponent" zu deklarieren? Oder muss ich ganz einfach das Formular im Makro "hart" aufrufen (Datenbank-Container - Formular) ansprechen.
Hierfür brauche ich allerdings Hilfe, da ich trotz Suchens noch nichts gefunden habe.

Gruß

Christian
Viele Wege führen zum Ziel, aber alle nach Rom.
keksi1970
*****
Beiträge: 464
Registriert: So, 27.01.2008 11:47
Wohnort: DU

Re: Makro funktioniert nicht wenn fremdgestartet

Beitrag von keksi1970 »

Hi,

soweit ich weiss, kann man Makros in Dateien nicht durch eine andere Datei aktivieren/ausführen

Lasse mich aber gerne eines besseren belehren
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Makro funktioniert nicht wenn fremdgestartet

Beitrag von DPunch »

Aloha
chrdz hat geschrieben:Das Makro wird aus einem anderen Formular per Mausklick gestartet (über 1. Makro Code).
Möglicherweise stehe ich auf dem Schlauch, aber ich kann immer noch nicht erkennen / erahnen, wann und wie Du das Makro aufrufst.
Im 1. Makro Code sehe ich nur einen Codeschnippsel, in dem ein Formular geöffnet werden soll.
chrdz
**
Beiträge: 39
Registriert: Mi, 19.04.2006 11:57
Wohnort: Bayern

Re: Makro funktioniert nicht wenn fremdgestartet

Beitrag von chrdz »

DPunch hat geschrieben:Aloha
chrdz hat geschrieben:Das Makro wird aus einem anderen Formular per Mausklick gestartet (über 1. Makro Code).
Möglicherweise stehe ich auf dem Schlauch, aber ich kann immer noch nicht erkennen / erahnen, wann und wie Du das Makro aufrufst.
Im 1. Makro Code sehe ich nur einen Codeschnippsel, in dem ein Formular geöffnet werden soll.
Hallo,

richtig erkannt. Makro 1 (Codeschnipsel) startet nach Mausklick auf einen Button das Formular (oButtonName), Button-Name und Formularname sind gleich. Das Formular wird geöffnet. Beim Start von Makro 2 (Aktion ausgelöst durch das makro-gestartete Formular) kommt ohne Diagnosemöglichkeit der "BASIC-Laufzeitfehler. Objektvariable nicht belegt."

Starte ich das gleiche Formulare per Doppelklick direkt, läuft das Makro ohne "Mullen und knullen" fröhlich durch.

Wird jetzt klar, wann das Problem auftritt?

Grüße aus Shanghai

Christian
Viele Wege führen zum Ziel, aber alle nach Rom.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Makro funktioniert nicht wenn fremdgestartet

Beitrag von DPunch »

Aloha
chrdz hat geschrieben:Wird jetzt klar, wann das Problem auftritt?
Es hört sich zwar danach an, als würde das Makro beim OnLoad-Event aufgerufen, aber klar ist das immer noch nicht ;)
Jedenfalls liess sich der Fehler beim OnLoad-Event nicht reproduzieren, schon gar nicht in der bemängelten Codezeile, eine Ferndiagnose ist (zumindest mir) daher mit den momentanen Infos unmöglich.
chrdz
**
Beiträge: 39
Registriert: Mi, 19.04.2006 11:57
Wohnort: Bayern

Re: Makro funktioniert nicht wenn fremdgestartet

Beitrag von chrdz »

DPunch hat geschrieben:Aloha
chrdz hat geschrieben:Wird jetzt klar, wann das Problem auftritt?
Es hört sich zwar danach an, als würde das Makro beim OnLoad-Event aufgerufen, aber klar ist das immer noch nicht ;)
Jedenfalls liess sich der Fehler beim OnLoad-Event nicht reproduzieren, schon gar nicht in der bemängelten Codezeile, eine Ferndiagnose ist (zumindest mir) daher mit den momentanen Infos unmöglich.
danke erst mal für das bisherige Interesse.

Eigentlich ist der Titel meines Posts nicht ganz richtig. Er sollte heißen, Makro funktioniert nicht, wenn Formular fremdgestartet. Das fällt mir jetzt endlich auf. Auch auf die Gefahr hin, dass ich mich wiederhole:

In meinem Base-Container "GCS-Tool-Management.odb" habe derzeit ich folgende Formulare:
000_Control_Center
701_Sites
702_Supervisors
801_Tool_Names
802_Tool_Details
etc.
Das ganze ist an eine MySQL Datenbank angebunden.
Der Plan ist, dass nur das Formular 000_Control_Center gestartet wird und die anderen Formulare hieraus gestartet werden. Dies soll über den gleichnamigen Button und Formularnamen realisiert werden. Folgende Makros werden zum Öffnen der Formulare (aus dem Control-Center) benutzt:

Code: Alles auswählen

Sub nameButton( oEvent )
Dim oButtonName as String
oButtonName = oEvent.Source.Model.Name
FormSitesButton ( oButtonName )
End Sub

Sub FormSitesButton(oButtonName)
REM Globalscope.BasicLibraries.LoadLibrary( "MRILib" )
Dim oDataBaseContext as Object
Dim oMyForm as Object
Dim oMyActiveButton as Object
Dim oPB as Object
Dim oMRI as object
Dim Context AS Object
Dim Conn As Object
Dim DB As Object
Dim FormDoc As Object
Dim Args(1) As New com.sun.star.beans.PropertyValue
Dim FormName As String
Registrieren
FormName = oButtonName
Context=CreateUnoService("com.sun.star.sdb.DatabaseContext")
DB=Context.getByName("GCS-tool-management")
Conn=DB.getconnection("GCS","Shanghai")
Args(0).Name="ActiveConnection" : Args(0).Value=Conn
Args(1).Name="OpenMode" : Args(1).Value="open"
FormDoc=DB.DatabaseDocument.FormDocuments.loadComponentFromURL(FormName,"_self",2,Args) REM << BASIC-Laufzeitfehler.
FormDoc.CurrentController.Frame.ContainerWindow.setFocus()

End Sub
die Sub "Registrieren" überprüft, bzw. registriert die geöffnete "Datenbank" (.odb) in OpenOffice.

Die Formulare werden ohne Problem geöffnet.

Mit dem Makro

Code: Alles auswählen

Sub Rack_Display
Dim oMyForm as object
Dim oControl as Object
Dim Filter as String
Dim oPB as Object
Dim oMRI as object
Dim i as Integer
Dim oName as String
oMyForm = StarDesktop.CurrentComponent.Drawpage.Forms.getbyName("Tools").getbyname("Tool_details")
oControl = oMyForm.getColumns.getbyname("location_id")
Filter = oControl.Value
oMyForm = StarDesktop.CurrentComponent.Drawpage.Forms.getbyName("Tools").getbyname("Tool_details").getbyname("Storage")
oControl = oMyForm.getbyname("Location")

if Filter = "2" then
	for i = 1 to 4
	oName = "Location"+Str(i)
	oControl = oMyForm.getbyname(oName)
	'oMRI = CreateUnoService( "mytools.Mri" )
	'oMRI.inspect( oControl )
	oControl.EnableVisible = True
	next i
	else
	for i = 1 to 4
	oName = "Location"+Str(i)
	oControl = oMyForm.getbyname(oName)
	oControl.EnableVisible = False
	next i
endif
End Sub
soll, im Fall dass sich das Werkzeug im Haus (site-id 2) befindet, der Lagerort angezeigt werden. Ausgelöst einmal bei "loadComponent" oder aber bei Maustaste losgelassen bei einer Neuauswahl in einer Tabelle innerhalb des Formulars.

Lade ich das Formular über das Control-Center, bekomme ich die Fehlermeldung "Basic Laufzeitfehler...". Lade ich das Formular über einen Doppelklick in der Formularseite des odb-Containers funktioniert alles.

Grüße aus Shanghai

Christian
Viele Wege führen zum Ziel, aber alle nach Rom.
Benutzeravatar
Koala
**
Beiträge: 48
Registriert: Mi, 18.10.2006 12:58

Re: Makro funktioniert nicht wenn fremdgestartet

Beitrag von Koala »

Ich würde an die Fehlersuche wie folgt rangehen (ab Kommentar "NEU"):
chrdz hat geschrieben:

Code: Alles auswählen

Sub FormSitesButton(oButtonName)
REM Globalscope.BasicLibraries.LoadLibrary( "MRILib" )
Dim oDataBaseContext as Object
Dim oMyForm as Object
Dim oMyActiveButton as Object
Dim oPB as Object
Dim oMRI as object
Dim Context AS Object
Dim Conn As Object
Dim DB As Object
Dim FormDoc As Object
Dim Args(1) As New com.sun.star.beans.PropertyValue
Dim FormName As String
Registrieren
FormName = oButtonName
Context=CreateUnoService("com.sun.star.sdb.DatabaseContext")
DB=Context.getByName("GCS-tool-management")
Conn=DB.getconnection("GCS","Shanghai")
Args(0).Name="ActiveConnection" : Args(0).Value=Conn
Args(1).Name="OpenMode" : Args(1).Value="open"
' ALT:
FormDoc=DB.DatabaseDocument.FormDocuments.loadComponentFromURL(FormName,"_self",2,Args) REM << BASIC-Laufzeitfehler.

' NEU:
DBDD = DB.DatabaseDocument
DBDDFormDoc = DBDD.FormDocuments
FormDoc=DBDDFormDoc.loadComponentFromURL(FormName,"_self",2,Args) REM << BASIC-Laufzeitfehler.

FormDoc.CurrentController.Frame.ContainerWindow.setFocus()

End Sub
Wenn DatabaseDocument oder FormDocument nicht existieren, sollte es an der entsprechenden Zeile eine Fehlermeldung geben.
Hat denn "FormName" einen Inhalt?
Sven
chrdz
**
Beiträge: 39
Registriert: Mi, 19.04.2006 11:57
Wohnort: Bayern

Re: Makro funktioniert nicht wenn fremdgestartet [gelöst]

Beitrag von chrdz »

Die Lösung:

Wenn ich es auch im Detail noch nicht wirklich verstanden habe, habe ich hier http://user.services.openoffice.org/en/ ... 39&t=24866 eine Lösung gefunden.

Wenn ich es richtig verstehe, liegt es nur an "parent"... bin mir aber nicht sicher.

Vielleicht gibt es aber jemanden, der mir eine kurze verständliche Erklärung geben kann. Ich lerne nämlich gern dazu.

An alle, die mir Tips gegebn, bzw. mich animiert haben in eine andere Richtung zu denken, ein herzliches Danke.

Grüße aus Shanghai

Christian
Viele Wege führen zum Ziel, aber alle nach Rom.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Makro funktioniert nicht wenn fremdgestartet

Beitrag von DPunch »

Aloha

Der dort vorgeschlagene Weg unterscheidet sich prinzipiell nicht von Deinem Weg.
chrdz hat geschrieben:Wenn ich es richtig verstehe, liegt es nur an "parent"... bin mir aber nicht sicher.
Im Endeffekt greift das Makro dort nur auf einen anderen Weg auf den Datenbank-Container zu, indem es sich zunutze macht, dass das Formular in direkter Verbindung mit diesem Container steht und somit auch direkte Zugriffe darauf erlaubt.
Ein Formular in einer Datenbank hat als Parent das DatabaseDocument selber. Dieses wiederum beinhaltet u.A. Informationen zu den Formularen der Datenbank und ermöglicht so auch das Öffnen derselben (siehe API: Service OfficeDatabaseDocument).
In der Praxis sollte es keinen Unterschied geben, ob Du das Formular mit Deinem Code oder ganz einfach per

Code: Alles auswählen

	FormName = "meinFormular"
	oForm = thisComponent 'Das aufrufende Formular
	oDatabaseDoc = oForm.Parent 'Das DatabaseDocument
	oFormDocuments = oDatabaseDoc.FormDocuments 'Alle darin enthaltenen Formulare
	oNewFormBlueprint = oFormDocuments.getByName(FormName) 'Sozusagen die Blaupause des zu öffnenden Formulars
	oNewForm = oNewFormBlueprint.Open 'Das zu öffnende Formular wird instanziiert, sprich geöffnet
bzw in Kurzform

Code: Alles auswählen

	FormName = "meinFormular"
	oNewForm = thisComponent.Parent.FormDocuments.getByName(FormName).Open
öffnest.

Trat bzw. tritt der Fehler in Deinem Originalcode auch auf, wenn das geöffnete Formular keinen OnLoad-Event hatte?
Antworten