Verständigungsproblem mit: BasicLibraries.loadLibrary

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

Moderator: Moderatoren

Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Verständigungsproblem mit: BasicLibraries.loadLibrary

Beitrag von balu »

Hallo liebe Gemeinde,

ich versteh nix mehr. Kriech de Kriese :?

Also, mit BasicLibraries.loadLibrary arbeite ich ja mittlerweile nicht das erste mal. Aber in der Kombination mit "private:factory/scalc", wie hier im Code-Auszug zu sehen ist, klappt momentan gar nichts so wie es soll.

Code: Alles auswählen


	Public oQuelle as Object, oZiel as Object
	Dim myFPq(0) as New com.sun.star.beans.PropertyValue	
	Dim myFPz(0) as New com.sun.star.beans.PropertyValue

Sub Erstellen 
	myFPz(0).name = "Hidden"
	myFPz(0).Value =  False
	oZiel = starDesktop.loadComponentfromURL("private:factory/scalc", "_blank", 0, myFPz())
				oZiel.BasicLibraries.loadLibrary("Standard") ' <=== Erstaufruf = Fehler.


	myFPq(0).name = "Hidden"
	myFPq(0).Value =  True
	oQuelle = starDesktop.loadComponentfromURL(sQuelldatei, "_blank", 0, myFPq())
				oQuelle.BasicLibraries.loadLibrary("Standard")

.....
end sub
sQuelldatei wird mittels FilePicker ausgewählt.

Beim erstenmal bekomme ich in der gekennzeichneten Zeile folgende Fehlermeldung zu Gesicht.
Fehlermeldung.png
Fehlermeldung.png (8.37 KiB) 2083 mal betrachtet
Auch die Reihenfolge; erst oQuelle und dann oZiel, ändert bei der Erstausführung nichts, die Fehlermeldung kommt immer nur bei oZiel.
Aber wenn ich den ganzen Prozess danach noch mal neu starte, dann funktioniert alles wie gewünscht.

Wenn ich jedoch "private:factory/scalc" durch eine existierende Datei ersetze, also quasi so wie für oQuelle, dann habe ich keine Probleme. Folglich muss das etwas mit der leeren Datei zu tun haben. Nur was, das bekomme ich momentan einfach nicht heraus.

Ja, ich habe nicht nur das Forum durchsucht, sondern auch google, Andrew in englisch und in deutsch und auch versucht mich mit der API für den 2. und 3. Parameter für loadComponentfromURL wegen "private:factory/scalc" zu befassen.
http://www.openoffice.org/api/docs/comm ... oader.html
http://www.openoffice.org/api/docs/comm ... hFlag.html
Aber da taucht dann auch schon wieder mein nächstes Problem auf, ich bin der englischen Sprache nicht so mächtig das ich wirklich alles verstehe was dort steht. Trotzdem hatte ich mal mit den beiden Parametern gespielt und festgestellt das sie auch was bewirken, jedoch keine positiven Änderungen für meine Situation.

Ich finde momentan irgendwie nix was auf meine Situation zutrifft. Ich möchte doch nur eine neue und leere Datei erstellen, und eine existierende öffnen, damit ich dann im weiteren Verlauf des Programms den Inhalt der BASIC-Module aus der bestehenden Datei in die leere Datei reinarbeiten kann.

Ich frage euch; könnt ihr mir bitte behilflich sein mein Problem zu beseitigen?

Freue mich schon auf eure Antworten.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Verständigungsproblem mit: BasicLibraries.loadLibrary

Beitrag von DPunch »

Servus

Du darfst nicht vergessen, dass das Laden des neuen Dokuments und Dein Makro-Code asynchron laufen, d.h. Dein Makro wartet nicht, bis das Dokument vollständig geladen und initialisiert ist.
Das kannst Du umschiffen, wenn Du eine kleine Sicherheitsroutine ala

Code: Alles auswählen

	Do While NOT oZiel.BasicLibraries.hasByName("Standard")
		Wait 10
	Loop
	oZiel.BasicLibraries.loadLibrary("Standard")
einbaust.
Davon abgesehen denke ich aber eh nicht, dass Du die Bibliothek überhaupt laden musst, um dort später Module anzulegen und Makro-Code zu schreiben.
Sinn und Zweck des Ladens von Bibliotheken ist, dass zur Laufzeit aufgerufene Funktionen/Prozeduren/Variablen/Dialoge auch dort gesucht werden können - bei einer komplett leeren Bibliothek nicht wirklich ergiebig.
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Verständigungsproblem mit: BasicLibraries.loadLibrary

Beitrag von balu »

Hallo DPunch,
Du darfst nicht vergessen, dass das Laden des neuen Dokuments und Dein Makro-Code asynchron laufen d.h. Dein Makro wartet nicht, bis das Dokument vollständig geladen und initialisiert ist.
Das ein Makro Zeilenweise abgearbeitet wird, ist mir sehr wohl bewusst und daran denke ich auch immer. Jedoch wartet ein Makro, eigentlich genau genommen das Office (Kurzform für: OOo/AOO/LO), den Lade- oder Speichernzyklus einer Datei sehr wohl ab. Denn in dieser Zeit kann man mit dem Office nix anderes machen, und ein Makro wird währenddessen auch "Eingefroren". Bei einer neuen leeren Datei bekommt man davon allerdings nix mit, da sie extrem schnell geladen ist. Je größer die Datei aber ist, umso ehern kann man das schon beobachten das Office so lange wartet bis das die Datei komplett geladen ist.

Das soll jetzt keine Besserwisserei sein, sondern lediglich nur eine weitergabe dessen was ich schon selber praktisch erfahren musste.

Blos das mit dem initialisieren ist für mich jetzt neu, da ich momentan nix damit anfangen kann.

Das kannst Du umschiffen, wenn Du eine kleine Sicherheitsroutine ala

Code: Alles auswählen

	Do While NOT oZiel.BasicLibraries.hasByName("Standard")
		Wait 10
	Loop
	oZiel.BasicLibraries.loadLibrary("Standard")
einbaust.
Daran hatte ich natürlich überhaupt nicht gedacht, hasByName mit einzubeziehen. Hatte zu viel und zu lange an diesem Problem gesessen, weit über eine Woche, und dadurch zu viel in die falsche Richtung gedacht. Der Vorschlag ist schon mal gut.

Davon abgesehen denke ich aber eh nicht, dass Du die Bibliothek überhaupt laden musst, um dort später Module anzulegen und Makro-Code zu schreiben.
Sinn und Zweck des Ladens von Bibliotheken ist, dass zur Laufzeit aufgerufene Funktionen/Prozeduren/Variablen/Dialoge auch dort gesucht werden können
Ich würd sagen: Da irrst Du dich diesmal. Denn wenn ich BasicLibraries.loadLibrary auskommentiere, also verhindere, dann bekomme ich an der Stelle im Makro wo ich auf die Bibliothek zugreifen will folgende Fehlermeldung.

Fehlermeldung2.png
Fehlermeldung2.png (10.43 KiB) 2036 mal betrachtet
Die ist selbst mit meinem schwachen Englischkenntnissen recht eindeutig, die Bibliothek ist nicht geladen. Und erst wenn ich das laden wieder aktiviere, dann verschwindet auch die Fehlermeldung.

balu hat geschrieben: Wenn ich jedoch "private:factory/scalc" durch eine existierende Datei ersetze, also quasi so wie für oQuelle, dann habe ich keine Probleme. Folglich muss das etwas mit der leeren Datei zu tun haben. Nur was, das bekomme ich momentan einfach nicht heraus.
Das muss ich jetzt doch mal ergänzen.
Es liegt daran, dass in der "private:factory/scalc" von Haus aus kein einziges BASIC-Modul existiert. Und nur deshalb habe ich das Problem. Denn wenn ich eine weitestgehend leere Datei, nur mit einem leeren Modul ausgestattet nehme, dann funktioniert es so wie es soll. Das will ich aber vermeiden, weil das nicht mein Ziel und nicht mein Wunsch ist.

So wie es momentan aussieht ist der Einsatz der Sicherheitsroutine in diesem speziellen Falle wohl die einzige Möglichkeit, um mein Problem zu beseitigen. Und dafür Danke ich dir :) . Das hilft mir natürlich weiter.


Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Verständigungsproblem mit: BasicLibraries.loadLibrary

Beitrag von DPunch »

Servus
balu hat geschrieben:(...)Je größer die Datei aber ist, umso ehern kann man das schon beobachten das Office so lange wartet bis das die Datei komplett geladen ist.
Das soll jetzt keine Besserwisserei sein, sondern lediglich nur eine weitergabe dessen was ich schon selber praktisch erfahren musste.(...)
Es ist natürlich so, dass der Makro-Ablauf für die Laufzeit von loadComponentfromURL unterbrochen ist und erst fortgesetzt wird, wenn die Funktion beendet wird, Makros also nicht grundsätzlich asynchron laufen.
Aber, ohne Dir den genauen Grund dafür nennen zu können: das heisst noch nicht zwangsläufig, dass das Dokument zu diesem Zeitpunkt auch komplett geladen ist und somit in seiner ganzen Funktionalität zur Verfügung steht - wie Du ja im vorliegenden Fall sehr gut sehen kannst.
balu hat geschrieben:Ich würd sagen: Da irrst Du dich diesmal. Denn wenn ich BasicLibraries.loadLibrary auskommentiere, also verhindere, dann bekomme ich an der Stelle im Makro wo ich auf die Bibliothek zugreifen will folgende Fehlermeldung.
Dann tust Du dort anscheinend noch etwas anderes, als Du im Ausgangspost angedeutet hattest ("damit ich dann im weiteren Verlauf des Programms den Inhalt der BASIC-Module aus der bestehenden Datei in die leere Datei reinarbeiten kann"), denn das einfache Anlegen von Modulen und Schreiben von Code funktioniert wie erwartet auch ohne das Laden der Bibliothek:

Code: Alles auswählen

Sub Main
	oNewDoc = StarDesktop.loadComponentfromURL("private:factory/scalc", "_blank", 0, Array())
	Do While NOT oNewDoc.BasicLibraries.hasByName("Standard")
		Wait 10
	Loop
	oLib = oNewDoc.BasicLibraries.getByName("Standard")
	s = "Sub HelloWorld"
	s = s & Chr(13) & Chr(9) & "MsgBox (""Hello World"")"
	s = s & Chr(13) & "End Sub"
	oLib.insertByName("NeuesModul",s)
End Sub
balu hat geschrieben:Es liegt daran, dass in der "private:factory/scalc" von Haus aus kein einziges BASIC-Modul existiert. Und nur deshalb habe ich das Problem.
Ich glaube weniger, dass es an existierenden oder nicht existierenden Modulen hängt, sondern eher daran, dass die Bibliotheken bei einer neu erstellten Datei zum Zeitpunkt des Rücklieferns von loadComponentfromURL noch nicht "angelegt"/verfügbar sind. Eine schon existierende Datei hat diesen Vorgang hingegen schon hinter sich und stellt die Bibliothek eben wie gewünscht zur Verfügung.
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Verständigungsproblem mit: BasicLibraries.loadLibrary

Beitrag von balu »

Ich grüße dich DPunch,
balu hat geschrieben:Ich würd sagen: Da irrst Du dich diesmal. Denn wenn ich BasicLibraries.loadLibrary auskommentiere, also verhindere, dann bekomme ich an der Stelle im Makro wo ich auf die Bibliothek zugreifen will folgende Fehlermeldung.
Dann tust Du dort anscheinend noch etwas anderes, als Du im Ausgangspost angedeutet hattest ("damit ich dann im weiteren Verlauf des Programms den Inhalt der BASIC-Module aus der bestehenden Datei in die leere Datei reinarbeiten kann")
Angedeutet hatte ich eigentlich nix, sondern lediglich anders beschrieben. Aber um das Missverständnis aus der Welt zu räumen, sag ich es jetzt mal etwas anders.

.... damit ich dann im weiteren Verlauf des Programms den Inhalt jedes BASIC-Modul einzeln aus der bestehenden Quelldatei in einen String einlese, und anschließend diesen String in die leere Datei in ein neu angelegtes BASIC-Modul reinschreibe. Und das mit jedem einzelnen BASIC-Modul aus der Quelldatei.

Verstehst Du es jetzt besser?
Hätte es gereicht wenn ich gesagt hätte: Ich kopiere die BASIC-Module?
Wäre diese Aussage dann aber nicht ein wenig verwirrend, da ich ja die Module nicht direkt kopiere so wie ein Tabellenblatt via SheetLink?
Der ganze Prozess ist aber auch etwas anders als in deinem Beispiel-Code, oder sehe ich das jetzt falsch?

Verzeih mir wenn meine Worte zur Zeit nicht immer eindeutig sind, aber das ganze Theater raubt mir noch den letzten Nerv. Und so langsam weiß ich schon selber nicht mehr ganz genau wie ich mich am besten ausdrücken soll.

denn das einfache Anlegen von Modulen und Schreiben von Code funktioniert wie erwartet auch ohne das Laden der Bibliothek:
Ja okay, dein Beispiel-Code funktioniert auch bei mir.

Code: Alles auswählen

Sub Main
   oNewDoc = StarDesktop.loadComponentfromURL("private:factory/scalc", "_blank", 0, Array())
   Do While NOT oNewDoc.BasicLibraries.hasByName("Standard")
      Wait 10
   Loop
   oLib = oNewDoc.BasicLibraries.getByName("Standard")
   s = "Sub HelloWorld"
   s = s & Chr(13) & Chr(9) & "MsgBox (""Hello World"")"
   s = s & Chr(13) & "End Sub"
   oLib.insertByName("NeuesModul",s)
End Sub
Aber das ist doch nicht ganz das gleiche wie es bei mir ist.
Hier ist mein Code.

Code: Alles auswählen

...
	myFPz(0).name = "Hidden"
	myFPz(0).Value =  False
	oZiel = starDesktop.loadComponentfromURL("private:factory/scalc", "_blank", 0, myFPz())

	Do While NOT oZiel.BasicLibraries.hasByName("Standard")
		Wait 10
	Loop
'		oZiel.BasicLibraries.loadLibrary("Standard")


	myFPq(0).name = "Hidden"
	myFPq(0).Value =  True
	oQuelle = starDesktop.loadComponentfromURL(sQuelldatei, "_blank", 0, myFPq())
'				oQuelle.BasicLibraries.loadLibrary("Standard")
'
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' BASIC-Module aus der Quelldatei in die Zieldatei einarbeiten.
'
				ModNamArray = oQuelle.BasicLibraries.getByName("Standard").ElementNames
					
				myLib = oZiel.BasicLibraries.getByName( "Standard" )						
	
				For im = LBound(ModNamArray) to UBound(ModNamArray)					
					sInhalt = oQuelle.BasicLibraries.getByName("Standard").getByName(ModNamArray(im))		
					mylib.insertbyname(ModNamArray(im), sInhalt)	
				next im
...
Wie für dich unschwer zu erkennen ist, ist mein Schema doch etwas anders. Denn wenn ich den Erstellungsprozess starte, geht es um 3 Dateien.

1.
Das ist die Erstellungsdatei

2.
Die geladene und bestehende Quelldatei = oQuelle

3.
Die neue und leere Datei = oZiel


Vielleicht siehst Du ja jetzt ob ich irgendwo einen Fehler gemacht habe? Zur Sicherheit habe ich jetzt eine Beispieldatei angehängt, in der das zusammenhängende Makro drin ist. Im Makro habe ich, so wie hier zu sehen ist, das laden der Libraries auskommentiert.

Kurze Bedienungsanleitung:
-> Öffne die BASIC-IDE.
-> Im Tabellenblatt "Tabelle1" auf den Grünen Button klicken, es erscheint dann ein Dialog.
-> Im Dialog als erstes einen x-Beliebigen Namen eingeben, aber ohne Dateiendung (.ods).
-> Per Button eine Quelldatei auswählen die mindestens 1 BASIC-Modul beinhaltet.
-> Jetzt den Pfad auswählen wo gespeichert werden soll.
-> Nun kann auf den Button "Erstellen" geklickt werden.

-> Teil mir bitte schön mit, was Du erlebt und gesehen hast.

-> Du kannst dann natürlich auch daher gehen und das laden der Libraries wieder zulassen, und dann das ganze spielchen noch mal erneut starten.



Gruß
balu
Dateianhänge
Beispiel_BASIC-Module_2.ods
(15.25 KiB) 130-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Verständigungsproblem mit: BasicLibraries.loadLibrary

Beitrag von DPunch »

Servus

Das Problem aus Deiner Beispieldatei hat allerdings recht wenig mit dem ursprünglich erörterten Problem (Standard-Bibliothek noch nicht verfügbar in neuer Datei) und meiner Aussage
Davon abgesehen denke ich aber eh nicht, dass Du die Bibliothek überhaupt laden musst, um dort später Module anzulegen und Makro-Code zu schreiben.
zu tun. Auf das Laden in oZiel kannst Du wie gehabt verzichten.

Das *Auslesen* einer Bibliothek steht wiederum auf einem ganz anderen Blatt.
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Verständigungsproblem mit: BasicLibraries.loadLibrary

Beitrag von balu »

Hallo DPunch,
Das Problem aus Deiner Beispieldatei hat allerdings recht wenig mit dem ursprünglich erörterten Problem (Standard-Bibliothek noch nicht verfügbar in neuer Datei) und meiner Aussage
Davon abgesehen denke ich aber eh nicht, dass Du die Bibliothek überhaupt laden musst, um dort später Module anzulegen und Makro-Code zu schreiben.
zu tun.
Sorry, aber ich versteh nicht was Du da sagst, beziehungsweise was Du mir damit sagen willst. Erklär mir das mal bitte schön genauer.


Auf das Laden in oZiel kannst Du wie gehabt verzichten.
Dank deiner Vorgeschlagenen Sicherheitsroutine stimmt das, wie schon gesagt.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Verständigungsproblem mit: BasicLibraries.loadLibrary

Beitrag von DPunch »

Servus
balu hat geschrieben:Sorry, aber ich versteh nicht was Du da sagst, beziehungsweise was Du mir damit sagen willst. Erklär mir das mal bitte schön genauer.
Ich verstehe nicht, was daran ungenau sein soll, aber gut:
- Dein ursprüngliches Problem war, dass Die Standard-Bibliothek in einer neuen leeren Datei nicht verfügbar war.
- Ich habe einen Vorschlag gemacht, wie Du dieses Problem umschiffen kannst.
- Da Du diese Bibliothek in Deinem ursprünglichen Code versuchst zu laden, habe ich angemerkt, dass ich bezweifle, dass Du die Bibliothek überhaupt laden musst, um darin Module anzulegen und Makros zu schreiben.
- Du präsentierst eine Beispieldatei, in der es ein Problem gibt, wenn die auszulesende Bibliothek nicht geladen ist.

Letzteres hat aber nichts mehr mit dem ursprünglich erörterten Problem zu tun, und auch nicht mit meiner Anmerkung, denn wir reden hier dann nicht mehr über eine nicht verfügbare Bibliothek, und auch das Schreiben in der Zielbibliothek funktioniert, ohne sie zu laden.

Anders sieht das aus, wenn in der Zielbibliothek bereits mindestens ein Modul existiert, in diesem Fall muss die Bibliothek ebenfalls geladen werden. Aber das ist hier ja nicht der Fall.
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Verständigungsproblem mit: BasicLibraries.loadLibrary

Beitrag von balu »

Hallo DPunch,

ich habe das Gefühl, als wenn irgendetwas mit unserer Komunikation nicht so richtig rund läuft. Scheint aber momentan mein Problem zu sein.

Es waren jetzt doch mal ein paar Tage vergangen wo ich mich nicht mit diesem Problem befasst hatte, unter anderem aus Gesundheitlichen Gründen. Und nun habe ich mit einem etwas befreiteren Kopf mir deine Antworten noch mal genauer durchgelesen.

- Dein ursprüngliches Problem war, dass Die Standard-Bibliothek in einer neuen leeren Datei nicht verfügbar war.
Korrekt.
- Ich habe einen Vorschlag gemacht, wie Du dieses Problem umschiffen kannst.
Korrekt, und funktioniert.
- Da Du diese Bibliothek in Deinem ursprünglichen Code versuchst zu laden, habe ich angemerkt, dass ich bezweifle, dass Du die Bibliothek überhaupt laden musst, um darin Module anzulegen und Makros zu schreiben.
Da ich jetzt wieder einen freieren Kopf habe -{aber auch nur bis zum nächsten hier anstehenden Problem}- versteh ich das jetzt auch. Da dies Problem mittels Do While NOT... umgangen wird.

- Du präsentierst eine Beispieldatei, in der es ein Problem gibt, wenn die auszulesende Bibliothek nicht geladen ist.
Und hier hats ein komunikations- Verständigungsproblem zwischen uns beiden gegeben. Wobei dieses Problem mehr bei mir lag. In der Beispieldatei hatte ich wohl das laden der Bibliotheken auskommentiert, dir aber auch gleichzeitig folgenden Hinweis gegeben:
balu hat geschrieben: -> Du kannst dann natürlich auch daher gehen und das laden der Libraries wieder zulassen, und dann das ganze spielchen noch mal erneut starten.
Kommen wir lieber zum Ende dieses vermaledeiten Thema. Ich habe jetzt hier folgendes zusätzlich gelernt und verstanden, neben meinem Hauptproblem:

-> Das laden einer Datei ist klar.
balu hat geschrieben: Blos das mit dem initialisieren ist für mich jetzt neu, da ich momentan nix damit anfangen kann.
-> Durch das Do While NOT... ist mir das jetzt in diesem Falle auch klar.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Antworten