[Gelöst] Problem mit dynamischer Erzeugung von Modulen auf Anwendungsebene?

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

Moderator: Moderatoren

marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

[Gelöst] Problem mit dynamischer Erzeugung von Modulen auf Anwendungsebene?

Beitrag von marcel_at_work »

Hallöchen mal wieder, 8)

vielleicht kennt das ja schon jemand. Um Werte zur Laufzeit aus dem Dokument in eine Anwendungsbibliothek einzutragen, hab' ich mir folgende Funktion erstellt (wichtig ist hierbei nur die If-Abfrage):

Code: Alles auswählen

'dynamische Generierung einer zweiten Standardbibliothek auf Anwendungsebene, mit einem Modul, in das die aktuelle Systemzeit geschrieben wird
Dim sLibrary As String : sLibrary = "dynasoftBasics" 'Zuweisung der Standardbibliothek
Dim sDynamicText As String

'Zusammenstellung des Modultextes
sDynamicText = "Option Explicit" & cstCR &_
				   cstCR &_
				   "'Bemerkung: Dieses Modul wurde dynamisch zur Laufzeit erzeugt." & cstCR &_
				   cstCR &_
				   "Public Function libraryDateModified() As Date" & cstCR &_
				   "	libraryDateModified() = " & Format(Now(), "YYYYMMDDHHMMSS") & cstCR &_
				   "End Function"

Dim sDynamicLibrary As String : sDynamicLibrary = sLibrary & "_dynV" 'Zuweisung eines Präfixes für die neue Bibliotheksbezeichnung

'Prüfung auf Existenz der Standardbibliothek in der Anwendungsebene
If GlobalScope.BasicLibraries.hasByName(sLibrary) Then
	'Prüfung auf Existenz des dynamischen Bibliotheksbezeichners in der Anwendungsebene
	If GlobalScope.BasicLibraries.hasByName(sDynamicLibrary) Then
		'bei positivem Ergebnis werden die dazugehörigen Bibliotheken gelöscht
		GlobalScope.BasicLibraries.removeLibrary(sDynamicLibrary)
		GlobalScope.DialogLibraries.removeLibrary(sDynamicLibrary)
	End If

	'Erzeugung einer neuen Bibliothek mit dem angegebenen Bezeichner
	GlobalScope.BasicLibraries.createLibrary(sDynamicLibrary)
	GlobalScope.DialogLibraries.createLibrary(sDynamicLibrary)
	'Erzeugung eines Moduls und Integration des aktualisierten Modultextes
	GlobalScope.BasicLibraries.getByName(sDynamicLibrary).insertByName("content", sDynamicText)
End If
Dies funktioniert soweit prima, aber es wird hier eine mit Präfix gekennzeichnete zweite/zusätzliche Bibliothek (genau wie in der Xray-Bibliothek) erzeugt, was ich eigentich gar nicht möchte.

Mit folgendem Code habe ich jetzt einige Zeit herumgetestet, aber mir wird bei der Erzeugung eines Moduls in einer bestehenden Anwendungsbibliothek, jedesmal zusätzlich ein leeres Modul im Dokument erstellt, wenn der Modulname dort noch nicht vorhanden ist. Zudem bricht die Programmausführung auch immer wieder einmal direkt nach diesem Vorgang ab.

Code: Alles auswählen

If GlobalScope.BasicLibraries.hasByName("Test") Then
	GlobalScope.BasicLibraries.loadLibrary("Test") 
	If GlobalScope.BasicLibraries.getByName("Test").hasByName("testMod") Then
		GlobalScope.BasicLibraries.getByName("Test").removeByName("testMod")
		GlobalScope.BasicLibraries.getByName("Test").insertByName("testMod", sDynamicText)
	Else
		GlobalScope.BasicLibraries.getByName("Test").insertByName("testMod", sDynamicText)
	End If
Else
	GlobalScope.BasicLibraries.createLibrary("Test")
	GlobalScope.BasicLibraries.getByName("Test").insertByName("testMod", sDynamicText)
End If
Ist das ein Bug oder sehe ich den Wald vor lauter Bäumen nicht?

Viele Grüße,

Marcel
Zuletzt geändert von marcel_at_work am So, 05.01.2020 16:51, insgesamt 1-mal geändert.
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Problem mit dynamischer Erzeugung von Modulen auf Anwendungsebene?

Beitrag von Toxitom »

Hey Marcel,

das sind ja mal wieder Fragen *grins*.

Und ja, Du kannst sowohl Module in (bestehenden) Bibliotheken als auch Bibliotheken selbst per Makro erzeugen und verändern.

Ich nutze das zum Beispiel, um benutzergenerierte Optionswerte zu speichern. Dazu gibt es dann eigene, makrogenerierte (dynamische) Module in der Bibliothek.

Den Nutzen, eine eigene Bibliothek zu erzeugen, habe ich noch nicht gefunden.

So, nun ein paar Bemerkungen zu Deinen Codeschnipseln:

der dargestellt Text (sDynamicText) ist sicher nur ein Testbeispiel - er ergäbe praktisch keinen Sinn. Das, was Du dort "dynamisch" einträgst, könntest Du genauso gut statisch eintragen und dann bei Bedarf als Funktion aufrufen.

Zum zweiten Codebereich:

Code: Alles auswählen

...
If GlobalScope.BasicLibraries.getByName("Test").hasByName("testMod") Then
		GlobalScope.BasicLibraries.getByName("Test").removeByName("testMod")
		GlobalScope.BasicLibraries.getByName("Test").insertByName("testMod", sDynamicText)
	Else
	...
Das ist ziemlicher Unsinn. Könnte zwar funktionieren, sollte so aber nicht geschrieben werden. Ein Objekt zu löschen und es dann gleich wieder mit gleichen Namen einzufügen - das wird dir immer Probleme bereiten. Die Objekte (Module) sind schließlich nur Textdateien an speziellen Plätzen, wenn die intern gelöscht werden und gleich wieder mit gleichen Namen geschrieben werden, kann das schon alles mal "haken".

Um das zu lösen, gibt es die Methode ".replaceByName("testMod", sDynamicText)" - die funktioniert sicher und wäre hier die richtige Wahl.

Aber auch hier gilt: Baue keine eigene Bibliothek - sondern ersetze / erzeuge Dir lediglich ein neues Modul in Deiner bestehenden BIbliothek.

Bedenke auch: Dynamisch erzeugte Module werden in der IDE *nicht* aktualisiert - dazu müsstest Du LO/AOO erst schließen und neustarten. Intern jedoch sind neue/veränderte Module sofort aktiv. Verändere also nie etwas manuell in einem dynamisch erzeugten Modul - Du weisst nie, mit was Du da gerade arbeitest;)

VG
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Problem mit dynamischer Erzeugung von Modulen auf Anwendungsebene?

Beitrag von marcel_at_work »

Hey Tom,
das sind ja mal wieder Fragen *grins*.
"wer schlau sein will, muss fragen" oder so ähnlich, sagte schon Konfuzius. :lol:
Den Nutzen, eine eigene Bibliothek zu erzeugen, habe ich noch nicht gefunden.
Wenn die Erzeugung auf Modulebene auch funktioniert (teste ich gleich), kann ich mich da nur anschließen. Dann ist die zweite, dynamische Xray-Library aber auch unnötig.
der dargestellt Text (sDynamicText) ist sicher nur ein Testbeispiel - er ergäbe praktisch keinen Sinn. Das, was Du dort "dynamisch" einträgst, könntest Du genauso gut statisch eintragen und dann bei Bedarf als Funktion aufrufen.
Jepp, so ist es.
Das ist ziemlicher Unsinn. Könnte zwar funktionieren, sollte so aber nicht geschrieben werden. Ein Objekt zu löschen und es dann gleich wieder mit gleichen Namen einzufügen - das wird dir immer Probleme bereiten. Die Objekte (Module) sind schließlich nur Textdateien an speziellen Plätzen, wenn die intern gelöscht werden und gleich wieder mit gleichen Namen geschrieben werden, kann das schon alles mal "haken".
Ich habe diesen Workarround aus dem OOME-Tutorial. Die Methode .replaceByName hatte ich erst gestern Abend in Xray entdeckt - aber seit meinem Problem mit .findColumn (anderer Thread) traue ich Xray irgendwie nicht mehr so richtig. :shock:

Ich hatte mich dann auf die Erzeugung einer kompletten Bibliothek fokusiert, weil es funktionierte - ich hatte damit Erfolgserlebnisse... 8)
Bedenke auch: Dynamisch erzeugte Module werden in der IDE *nicht* aktualisiert - dazu müsstest Du LO/AOO erst schließen und neustarten. Intern jedoch sind neue/veränderte Module sofort aktiv. Verändere also nie etwas manuell in einem dynamisch erzeugten Modul - Du weisst nie, mit was Du da gerade arbeitest;)
Jepp, diese Tatsache hat mich gestern fast wahnsinnig gemacht. Ich werd' mir das zu Herzen nehmen! :lol:

Na,... zumindest eine Sache wäre damit mal gelöst, bist ein Schatz - Danke! 8)

Viele Grüße,

Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Antworten