Seite 1 von 2
Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Sa, 03.03.2012 17:19
von wellmo
Sali zäme
Situation
Ich will von einem Formular aus Base per Button folgendes Makro starten.
Code: Alles auswählen
Sub Dokuerstellen
Dim Dlg as Object
Dim Doc As Object
Dim Url As String
Dim Dummy()
Url = "file:///C:/Users/Dave/Desktop/nur Dave Offertenvorlage1.ods"
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy())
GlobalScope.DialogLibraries.LoadLibrary( "Standard" )
Dlg = CreateUnoDialog( GlobalScope.DialogLibraries( "dOffertenerstellen" )
Dlg.execute()
End Sub
Der Dialog ist im Dokument "nur Dave Offertenvorlage1.ods" abgespeichert und heisst "dOffertenerstellen".
Bei der Codezeile: Dlg.execute() kommt die Fehlermeldung BASIC-Laufzeitfehler. Objektvariable nicht belegt.
Das Calc-Dokument wird zwar geöffnet aber der Dialog nicht und die Makros darin funktionieren nicht.
Weiss da wer Rat?
Gruss Dave
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Sa, 03.03.2012 17:47
von F3K Total
Hi Dave,
mit der Zeile
lädst Du die Standard Dialog Library unter
Meine Makros&Dialoge
Willst Du die Library im gerade geöffneten Dokument laden, geht das z.B. so.
Code: Alles auswählen
Sub Dokuerstellen
Dim Dlg as Object
Dim Doc As Object
Dim Url As String
Dim Dummy()
Url = "file:///C:/Users/Dave/Desktop/nur Dave Offertenvorlage1.ods"
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy())
Doc.DialogLibraries.LoadLibrary("Standard")
oForm = Doc.DialogLibraries.Standard.dOffertenerstellen
Dlg = CreateUnoDialog(oForm)
Dlg.execute()
End Sub
Gruß R
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Sa, 03.03.2012 18:02
von wellmo
Hi R
Vielen Dank, ich habe so viele Varianten hier im Forum gefunden und ausprobiert und alle hatten versagt.
Nun passts und ich kann weiter tüffteln
Gruss Dave
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Sa, 03.03.2012 20:02
von wellmo
So, nachdem ich nun den Code erweitert habe damit er mir auch gleich Texte von den Feldern aus dem Formular in den Dialog einträgt ( was funktioniert

) ist nun das Problem, dass die Buttons auf dem Dialog nicht funktionieren.
Ums besser zu erklären:
Auf dem Dialog sind mehrere Buttons die den Dialog schliessen und mich direkt auf ein bestimmtes Sheet bringen und dort die Werte eintragen.
z.B.
Code: Alles auswählen
Sub DialogCloseLieferschein
dlg.endExecute()
Dim oController as Object
Dim oResults as Object
Dim oDoc as Object
oDoc = thisComponent
oController = oDoc.getCurrentController()
oResults = oDoc.Sheets().getByIndex(50)
oController.setActiveSheet(oResults)
end Sub
Bisher hat der Code einwandfrei funktioniert aber nun bekomme ich bei dlg.endExecute() die Fehlermeldung BASIC-Laufzeitfehler. Objektvariable nicht belegt. Wobei dlg global als Object definiert ist.
Code: Alles auswählen
Sub DialogCloseLieferschein
Dim dlg As Object
dlg.endExecute()
Dim oController as Object
Dim oResults as Object
Dim oDoc as Object
oDoc = thisComponent
oController = oDoc.getCurrentController()
oResults = oDoc.Sheets().getByIndex(50)
oController.setActiveSheet(oResults)
end Sub
Bei diesem Code das selbe
Code: Alles auswählen
Sub DialogCloseLieferschein
Dim dlg As Object
DialogLibraries.LoadLibrary( "Standard" )
dlg = CreateUnoDialog( DialogLibraries.Standard.dOffertenerstellen )
dlg.endExecute()
Dim oController as Object
Dim oResults as Object
Dim oDoc as Object
oDoc = thisComponent
oController = oDoc.getCurrentController()
oResults = oDoc.Sheets().getByIndex(50)
oController.setActiveSheet(oResults)
end Sub
und bei diesem Code wechselt zwar das Sheet, aber der Dialog bleibt offen und die Werte aus dem Dialog werden nicht im Sheet übernommen.
Ich nehme an das liegt daran das ich den Dialog ein zweites mal geladen habe.
Wie kann ich das aber umgehen?
Muss ich denn bei:
Code: Alles auswählen
Sub Dokuerstellen
Dim Dlg as Object
Dim Doc As Object
Dim Url As String
Dim Dummy()
Url = "file:///C:/Users/Dave/Desktop/nur Dave Offertenvorlage1.ods"
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy())
Doc.DialogLibraries.LoadLibrary("Standard")
oForm = Doc.DialogLibraries.Standard.dOffertenerstellen
Dlg = CreateUnoDialog(oForm)
Dlg.execute()
End Sub
noch
einbauen?
Dies hab ich nämlich versucht aber nicht hinbekommen
So langsam wirds komplizierter

Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Sa, 03.03.2012 20:11
von DPunch
Servus
wellmo hat geschrieben:So langsam wirds komplizierter
Eigentlich ist das nicht wirklich kompliziert.
Selbst wenn Du "dlg" global als Objekt deklariert hast, durch
Code: Alles auswählen
Sub DialogCloseLieferschein
Dim dlg As Object '########## <--------------------
dlg.endExecute()
überschreibst Du die globale Variable dlg durch eine lokale, nur für die Laufzeit der Prozedur gültige, neue, leere Variable dlg.
Schmeiss die erneute Deklaration von dlg aus allen Prozeduren raus.
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Sa, 03.03.2012 20:21
von wellmo
Hallo DPunch
Ich muss dich und mich leider enttäuschen.
egal ob mit oder ohne dlg, der Fehler kommt leider.
Edit:
Liegt es nicht daran das die Basic.lib beim laden des Dialoges nicht mitgeladen wird?
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: So, 04.03.2012 04:14
von DPunch
Servus
wellmo hat geschrieben:egal ob mit oder ohne dlg, der Fehler kommt leider.
Wenn der Dialog geladen und angezeigt wird, ist die Meldung nur durch einen Fehler Deinerseits erklärbar.
Ohne den kompletten Quellcode bleibt jeder Hilfeversuch dabei allerdings ein Stochern im Dunkeln.
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: So, 04.03.2012 10:04
von Frieder D.
Hallo wellmo,
du könntest versuchen, beim Laden des Dokuments,
den Makro-Ausführungsmodus auf "Ausführen ohne nachzufragen"(=4) zu setzen .
Code: Alles auswählen
Dim myProp(0) as new com.sun.star.beans.PropertyValue
myProp(0).name="MacroExecutionMode"
myProp(0).value = 4
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, myProp())
Des weiteren kannst du natürlich auch die Dokumenten-Bibliotheken laden:
Code: Alles auswählen
Doc.BasicLibraries.loadLibrary("Name der Bibliothek im Dokument")
Das könnte allerdings zu Problemen führen, falls du Subs- oder Funktionen im ods-Dokument hast,
deren Name Identisch mit Namen von Subs- oder Funktionen in der Base-Bibliothek sind.
Gruß
Frieder
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: So, 04.03.2012 11:11
von wellmo
Hallo
@DPunch
DPunch hat geschrieben:
Wenn der Dialog geladen und angezeigt wird, ist die Meldung nur durch einen Fehler Deinerseits erklärbar.
Davon gehe ich aus.
Die ganzen Quellcodes sind gross, zumindest denk ich das. Leider hab ich auch erst am Dienstag wieder zugriff drauf.
@Frieder D.
Frieder D. hat geschrieben:
Des weiteren kannst du natürlich auch die Dokumenten-Bibliotheken laden:
Code: Alles auswählen
Doc.BasicLibraries.loadLibrary("Name der Bibliothek im Dokument")
dies hab ich folgendermassen gemacht:
Code: Alles auswählen
Sub Dokuerstellen
Dim Dlg as Object
Dim Doc As Object
Dim Url As String
Dim Dummy()
Url = "file:///C:/Users/Dave/Desktop/nur Dave Offertenvorlage1.ods"
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy())
Doc.BasicLibraries.loadLibrary("Standard")
Doc.DialogLibraries.LoadLibrary("Standard")
oForm = Doc.DialogLibraries.Standard.dOffertenerstellen
Dlg = CreateUnoDialog(oForm)
Dlg.execute()
End Sub
dies bringt aber die gleiche Fehlermeldung.
Was bewirkt dein Vorschlag
Frieder D. hat geschrieben:
du könntest versuchen, beim Laden des Dokuments,
den Makro-Ausführungsmodus auf "Ausführen ohne nachzufragen"(=4) zu setzen .
Wie erwähnt kann ich es leider erst am Dienstag ausprobieren.
Dabei werd ich auch mal testen was passiert wenn ich die Sub "CloseDialogLieferschein" mal zusätzlich in die Basic.Lib des Basedokuments schreibe.
Auf jedenfall Danke für die Hilfestellungen und ich werd mich am Dienstag mit weiteren Infos wieder melden.
Gruss Dave
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Mo, 05.03.2012 07:20
von DPunch
Servus
wellmo hat geschrieben:dies hab ich folgendermassen gemacht:
(...)
dies bringt aber die gleiche Fehlermeldung.
Kein Wunder.
Da Du auch in diesem Fall mit
eine lokale Variable für den Dialog erzeugst, kannst Du ihn aus keiner anderen Prozedur heraus ansprechen - jeder Versuch würde in der Fehlermeldung "Objektvariable nicht belegt" enden...
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Mo, 05.03.2012 18:03
von wellmo
Hallo DPunch
DPunch hat geschrieben:Servus
Ohne den kompletten Quellcode bleibt jeder Hilfeversuch dabei allerdings ein Stochern im Dunkeln.
Damit Ihr nicht mehr im Dunkeln stochern müsst habe ich mal beide Dateien hochgeladen.
Bitte nicht erschrecken ab den Code, ich hab ja schon diverse Möglichkeiten genannt bekommen um gewisse Codezeilen zu kürzen, habs aber noch nicht gemacht.
Die Offertenvorlage1 funktioniert alleine einwandfrei, nur wenn ich es über das Baseformular starte nicht.
PS: Die paar Namen in der DB sind frei erfunden
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Mo, 05.03.2012 20:16
von F3K Total
Hi, es ist schwer durchzusteigen,
Es liegt meiner Meinung nach daran, das Du den Dialog
dlg aus einem in Base gestarteten Makro öffnest, dann ist er dem Calc-Dokument wohl unbekannt.
Willst Du
dlg in zwei Dokumenten verwenden, geht das als
globale Variable in der Application-Bibliothek
meine Makros/Standard.
Ausserdem hast Du
dlg noch zweimal innerhalb einer Sub definiert, und zwar in
OfferteBau und
OfferteSauna.
Auch
odialog solltest Du wie folgt definieren:
, dass geht wiederum im Calc Dokument, weil das Makro, was
odiaolg geöffnet hat hier definiert ist.
Gruß R
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Mo, 05.03.2012 20:26
von wellmo
Wow, du bist durch meine Codes durchgestiegen
Vielen Dank für deine Vorschläge, ich werde die Codes morgen ändern und Meldung erstatten.
Gruss Dave
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Di, 06.03.2012 08:47
von wellmo
Guete Morgä mitenand
Leider hat's nichts genutzt dlg global in der Application-Bibliothek meine Makros/Standard zu definieren, hab auch alle Dokumente geschlossen und neu geöffnet damit sicher alles richtig geladen wird.
hat sonst noch jemand Lösungsvorschläge?
Edit: Ups, es funktioniert doch, ich muss natürlich auch die dlg-Definition in der Base-Bibliothek rausnehmen damit die globale benutzt wird

Der Dialog schliesst nun und wechselt auf das gewünschte Sheet. Aber die Werte werden nicht in das Sheet übertragen.
Gruss Dave
Re: Von Base-Formular einen Calc-Dialog öffnen
Verfasst: Di, 06.03.2012 14:48
von wellmo
UPDATE
Ich habe nun viel versucht und rumgetüfftelt.
Ich habs nun soweit das auch die Werte des Dialogs ins Sheet eingetragen werden, dazu musste ich allerdings alle Abfrage-Routinen in die Base-Bibliothek schreiben, die Variablen anpassen etc.
Allerdings hab ich auf den Sheets auch Buttons zum Speichern ( auf die Festplatte und einen Link in die Datenbank) und Drucken des jeweiligen Sheets.
Diese Buttons funktionieren nun allerdings auch nicht mehr. Ich werde wohl nicht drumherum kommen, diese auch in die Base-Bibliothek zu schreiben und anzupassen.
Ich hoffe allerdings, es gibt da noch einen anderen weg, weil mich graust es schon wenn ich den "Jacuzzi-Dialog" samt allem Code zum Abfragen und einfügen auch umschreiben muss.