Makro1 Daten in Makro2-Dialog schreiben.

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

Moderator: Moderatoren

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

Makro1 Daten in Makro2-Dialog schreiben.

Beitrag von balu »

Mahlzeit liebe Gemeinde.

Ich weiß nicht ob ihr den Sinn des Betreffs schon versteht, oder nicht, deshalb will ich ihn noch mal verdeutlichen.

Also, ich habe 2 Dateien, jede mit Makro und Dialog ausgestattet.
Datei 1 = Quelldatei
Datei 2 = Zieldatei

Die Quelldatei lädt die Zieldatei Hidden, und führt in ihr einige Aktionen aus. Danach wird die Zieldatei von der Quelldatei auch automatisch gespeichert und geschlossen. Das alles funktioniert wunderbar. Es ist also kein Problem das die Quelldatei IN der Zieldatei irgend etwas macht.

Jetzt möchte ich aber das die Quelldatei das Makro in der Zieldatei etwas ändert, ergänzt oder wie auch immer. In der Zieldatei, im dortigen Dialog, möchte ich einen bestimmten Text fest eintragen. Bis jetzt hole ich mir diesen Text aus der Zieldatei selber. Das möchte ich jetzt aber nicht mehr.

Ich weiß jetzt also nicht wie ich weiter vorgehen muss. Da die Zieldatei ja schon geladen ist, auch wenn nur Hidden, müsste man doch jetzt theoretisch auch auf das schon existierende Makro zugreifen können. Oder geht das nicht, da ja beim laden das Makro durch die nicht aktivierte Sicherheitsabfrage nicht zugelassen ist? <-{ist nur ne Anfängerüberlegung}-

Theoretisch könnte man ja gleich im Dialog von der Zieldatei den Text direkt eintragen. Aber die Quelldatei erstellt aus der Ursprünglichen Zieldatei jeden Monat eine neue Datei, die dann im Dialog den Monatsnamen anzeigt. Es ist also so gesehen eine Variable Angelegenheit.

Meine Fragen lauten also.
- Wie hoch ist der Aufwand dafür um mein Ziel zu erreichen?
- Wie muss ich dazu vorgehen um zum Ziel zu gelangen?
- Oder würdet ihr das ganze anders angehen?
- Könntet ihr mir bitte behilflich sein?

Zur praktischen demonstration habe ich ein abgespecktes Beispielpaket angehängt, welches ich an bestimmten Stellen in den Dateien Kommentiert habe.

Freue mich schon auf eure Antworten, und bedanke mich schon mal für eure Bemühungen.


Gruß
balu



Archivdatei, bitte entpacken.
Dateianhänge
simpel-test.zip
(31.58 KiB) 131-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
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Makro1 Daten in Makro2-Dialog schreiben.

Beitrag von komma4 »

balu hat geschrieben:- Oder würdet ihr das ganze anders angehen?

1. Vorschlag:
Auswahl des Monatsnamens in QUELLE durch Daten>Gültigkeit>Zellbereich>K3:K14

2. Vorschlag:
die Matrix K3:L14 auf ein anderes (verdecktes!) Blatt ("Voreinstellungen"?) verschieben


3. Vorschlag:
habe noch keinen Weg gefunden Änderungen an einem Dialog durch Code zu speichern.
Deshalb würde ich hier den Textinhalt des Kontrollfelds beim Aufruf durch Code setzen... den Wert kannst Du ja aus der QUELLE oder einer INI-Datei laden



Weitere Anmerkungen:
Im Fall, dass der FilePicker keine Vorlagendatei auswählt hast Du noch keine Fehlerbehandlung vorgesehen.
Die Reihenfolge von SCHALTFLÄCHEN sollte (nach CUA, und auch bei Dir) lauten: Zurück - Abbrechen - OK und Beenden


Hoffe, dass hilft Dir schonmal weiter.
Viel Erfolg!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro1 Daten in Makro2-Dialog schreiben.

Beitrag von balu »

Hallo Winfried,

auch wenn es jetzt noch nicht so ersichtlich ist, so soll in der fertigen Quelldatei alles nur per Dialog gesteuert werden. Und von daher sind die Vorschläge 1 & 2 weniger interessant. Ich weiß natürlich das Du sie als alternativen vorgeschlagen hast.
3. Vorschlag:
habe noch keinen Weg gefunden Änderungen an einem Dialog durch Code zu speichern.
Wenn Du das schon sagst, soll das was heißen.
Ich hatte nämlich schon so ein Gefühl, das es entweder sehr kompliziert ist, oder gar nicht machbar ist. Ich meine ich hätte hier mal was gelesen, das ein Makro ein bestehendes Makro ändert aber das dies mehr auf der Komandozeilenebene stattfand. Falls ich mich nu nicht vertu.

Deshalb würde ich hier den Textinhalt des Kontrollfelds beim Aufruf durch Code setzen... den Wert kannst Du ja aus der QUELLE oder einer INI-Datei laden
So was ähnliches (INI-Datei) ging mir auch schon durch den Kopf. Aber das ist wiederum auch nicht gut, da ja dann die Zieldatei auf die INI zugreifen muss und vor allem dann wissen muss wo die sich befindet. Und die Gefahr das aus Versehen jemand die INI löscht, ist leider gegeben da das Projekt nicht für mich ist.
Und ferner sind hinterher die Quell- und die Zieldatei weit voneinander getrennt. Also müsste dann die Zieldatei die Quelldatei suchen, falls die Pfade nicht fest eingestellt werden.

Also werd ich im Prinzip bei meinem alten Verfahren bleiben, jedoch die besagte Zelle in einen *ungefährlichen* Bereich hin verschieben, mit anschließendem ausblenden des Bereichs. Es sei denn, es kommt da noch ne gute Fee vorbei und hat ne Überraschung für mich.

Weitere Anmerkungen:
Im Fall, dass der FilePicker keine Vorlagendatei auswählt hast Du noch keine Fehlerbehandlung vorgesehen.
Die Reihenfolge von SCHALTFLÄCHEN sollte (nach CUA, und auch bei Dir) lauten: Zurück - Abbrechen - OK und Beenden
Mir jetzt egal wer CUA ist :wink:, aber deine Anmerkung versteh ich schon. Diesen Dialog hatte ich am Wochenende mal auf die Schnelle zusammengeschustert, um zu sehen ob und wie meine Idee überhaupt funktioniert. Die sogenannte "Feuertaufe" hat es ja schon mal überstanden, nun müssen noch die Feinheiten erarbeitet werden. Ich bin halt noch Anfänger, und von daher fehlt mir noch so einiges an Wissen.

Ich danke dir dennoch für deine Vorschläge und Anmerkungen :D.


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: Makro1 Daten in Makro2-Dialog schreiben.

Beitrag von DPunch »

Aloha

Für solche Zwecke kann man auch einfach die benutzerdefinierten Eigenschaften des Dokuments verwenden (Datei -> Eigenschaften -> Reiter Benutzerdefinierte Eigenschaften)
Beim Erzeugen der Datei gibst Du ihr noch eine entsprechende Eigenschaft mit auf den Weg

Code: Alles auswählen

oDok2 = starDesktop.loadComponentfromURL(url, "_blank", 0, myFileProp())
oDok2.DocumentProperties.UserDefinedProperties.addProperty("Monatsinfo",129,"Januar")
und vor dem Starten des Dialogs in der erstellten Datei liest Du die Eigenschaft entsprechend wieder aus und schreibst sie an die gewünschte Stelle

Code: Alles auswählen

sMonat = thisComponent.DocumentProperties.UserDefinedProperties.getPropertyValue("Monatsinfo")
oMeinDialog.Title = "Daten für Monat " & sMonat
So kannst Du beliebig viele Eigenschaften setzen, so sie denn dokumentspezifisch und nicht dynamisch sind.
Dass diese Eigenschaften von ungeübter Hand einfach mal so gelöscht oder verändert werden, halte ich für sehr unwahrscheinlich.
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro1 Daten in Makro2-Dialog schreiben.

Beitrag von balu »

Hallo DPunch,

ja das ist eine Alternative die mir gefällt :D.

Ich sehe das also richtig, dass ich in den Benutzerdefinierten Eigenschaften bei Name und Wert frei entscheiden kann was ich eintrage, jedoch bei Typ an die 4 vorgegebenen Möglichkeiten gebunden bin. Das ist natürlich Klasse. Schöner wärs natürlich noch wenn ich die Typennummern wüsste. Typennummer 129 entspricht ja dem Typ Text, aber wie sieht das denn z.B. bei Datum aus?
Kannst Du mir das auch noch verraten, beziehungsweise erklären wo ich das nachlesen kann? Denn F1 bringt mich da echt nicht weiter, oder ich übersehe da etwas.
So kannst Du beliebig viele Eigenschaften setzen, so sie denn dokumentspezifisch und nicht dynamisch sind.
Verzeih, aber ich führe heute momentan einen Mehrfrontenkrieg mit verschiedenen Dateien und OOo-Versionen, so das ich jetzt nicht ganz genau weiß was Du mir damit sagen möchtest. Könntest Du mich bitte darüber *aufklären*? Danke.

Du bist also meine Fee gewesen. Und dafür danke ich dir herzlich :D.


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: Makro1 Daten in Makro2-Dialog schreiben.

Beitrag von DPunch »

Aloha
balu hat geschrieben:ch sehe das also richtig, dass ich in den Benutzerdefinierten Eigenschaften bei Name und Wert frei entscheiden kann was ich eintrage, jedoch bei Typ an die 4 vorgegebenen Möglichkeiten gebunden bin.
Das ist korrekt.
Schöner wärs natürlich noch wenn ich die Typennummern wüsste. Typennummer 129 entspricht ja dem Typ Text
Nicht ganz, die 129 ist ein gesetzter Flagwert für die neu hinzugefügte Eigenschaft. Dazu siehe OOo API: PropertyAttribute. Die 129 besagt also, dass die Eigenschaft leer sein darf (Flag 1) und entfernbar sein soll (Flag 128), also: 1+128=129.
balu hat geschrieben:aber wie sieht das denn z.B. bei Datum aus?
Prinzipiell kannst Du alles als String eintragen, das ist die einfachste Variante.
Der Datentyp ergibt sich aus dem übergebenen Wert.
Double:

Code: Alles auswählen

oDok2.DocumentProperties.UserDefinedProperties.addProperty("Faktor",129,5.33)
Beim Datentyp Double ergibt sich ein Problem, dass ich bis jetzt nur per Workaround lösen konnte - ich habe mich allerdings auch nicht wirklich damit beschäftigt.
Es lassen sich keine Geraden Zahlen wie "5" bzw als Double "5.0" übergeben beim Erstellen der Eigenschaft, warum auch immer.
Das sieht dann ungefähr so aus:

Code: Alles auswählen

x = 5 '<--Integer
Dim y as Double
y = x + 0.5
oDok2.DocumentProperties.UserDefinedProperties.addProperty("Faktor",129,y)
oDok2.DocumentProperties.UserDefinedProperties.setPropertyValue("Faktor",y-0.5)
Boolean:

Code: Alles auswählen

oDok2.DocumentProperties.UserDefinedProperties.addProperty("Geprüft",129,True)
Beim Datum wird es schon komplizierter, denn dort brauchst Du zwingend ein Struct vom Typ OOo API: DateTime

Code: Alles auswählen

Dim myDate as new com.sun.star.util.DateTime
myDate.Month = MONTH(DATE)
myDate.Year = YEAR(DATE)
myDate.Day = DAY(DATE)
oDok2.DocumentProperties.UserDefinedProperties.addProperty("Heute",129,myDate)
balu hat geschrieben:so das ich jetzt nicht ganz genau weiß was Du mir damit sagen möchtest. Könntest Du mich bitte darüber *aufklären*?
Vielleicht etwas unklar ausgedrückt:
Du kannst natürlich so oder so beliebig viele Eigenschaften setzen, es macht aber nur Sinn, wenn die entsprechenden Eigenschaften konkrete Infos zu genau diesem Dokument beinhalteten (=dokumentspezifisch) und sich eigentlich nicht ändern, wie in Deinem Fall z.B. der Monat (=nicht dynamisch).
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro1 Daten in Makro2-Dialog schreiben.

Beitrag von balu »

Hallo DPunch,

vielen Dank für deine Infos, jetzt wird mir einiges klarer. Werd nun mal schaun wie ich die ganzen Infos nutzbringend für mich unterbringen kann. Hab nun einiges zum testen :).


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
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro1 Daten in Makro2-Dialog schreiben.

Beitrag von balu »

Aus aktuellem Anlass hebe ich diesen Thread wieder aus der Versenkung hervor, da ich mein Eingangsproblem "fast Perfekt" gelöst habe.

Hallo DPunch,

in diesem Thread: Makro in Datei ausführen, die 'hidden' geöffnet ist, hattest Du eine Möglichkeit vorgestellt wie man in einer HIDDEN geladene Datei ein Makro ausführen kann. Und das kam mir jetzt in doppelter Hinsicht zu gute.

Aktuell stand ich vor dem Problem, wie kann ich aus der Datei 1 in die Datei 2, welche HIDDEN geladen ist, ein neues, zusätzliches BASIC-Modul mit Inhalt anlegen. Das Problem ist, es geht so nicht wie anfangs gedacht.
Also nach diesen Codezeilen

Code: Alles auswählen

    myFileProp(1).name= "Hidden"
    myFileProp(1).value= TRUE
	oDok2 = starDesktop.loadComponentfromURL(url, "_blank", 0, myFileProp())
einfach den Code für das Modul anlegen ausführen, funktioniert nicht.
Wenn ich aber FALSE für Hidden setze, also die Datei ist im Vordergrund, dann geht es. Aber das wollte ich aus verschiedenen Gründen vermeiden. Doch zum Glück bin ich heut auf den eben verlinkten Thread hier im Forum gestoßen. Und nach etwas Anpassung des dortigen Code auf das hier:

Code: Alles auswählen

	sLibName = "Standard"
	sModuleName = "Module1"
	sMakroName = "NullSub" 
	sScriptURI = "vnd.sun.star.script:" & sLibName & "." & sModuleName & "." & sMakroName & "?language=Basic&location=document"
	oScript = oDok2.ScriptProvider.getScript(sScriptURI)
	oScript.invoke(Array(dummy),Array(),Array())
Habe ich mein Ziel erreicht. Jedoch musste ich aber in der Datei 2 im Module1 noch eine Scheinsub anlegen.

Code: Alles auswählen

Sub NullSub 
' Trick 17 ;-)
End Sub
Nun kann ich das was ich hier eingangs wollte, über den kleinen Umweg eines zusätzlichen Mdouls, doch zufriedenstellend erledigen. Daten die ich vorher in der Datei in einem Tabellenblatt geschrieben hatte, verschwinden nun in das Makro. Das hat natürlich doch so einige Vorteile. Und deshalb Danke ich dir vielmals für deinen Lösungsvorschlag aus dem verlinkten Thread :D.

Aber ein Frage hätte ich da dennoch.

Kann der jetzige eingesetzte ScriptProvider so umgeschrieben werden, das ich in der anderen Datei auf die NullSub verzichten kann?

Da mir diese Hohe Kunst der Makroprogrammierung doch noch zu hoch ist, stelle ich die Frage.
Sollte das nicht möglich sein, so wäre das auch nicht weiter tragisch da ich auch so mit dem aktuellem Ergebnis doch sehr zufrieden bin.

Ich hänge jetzt mal ein neues Datei-Paket an, in dem die aktuellen Änderungen zu sehen sind. In der Datei "Quelldatei2.ods" im Modul "Fertigstellen" sind die interessanteren Dinge zu finden.




Gruß
balu
Dateianhänge
simpel-test_V2.zip
(33.14 KiB) 101-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: Makro1 Daten in Makro2-Dialog schreiben.

Beitrag von DPunch »

Servus

Sorry, ich hatte leider in letzter Zeit keinerlei Musse, mich mit OOo zu beschäftigen.

Soweit ich das überblicken kann, benutzt Du Deine NullSub nur, um die Bibliothek zu laden.
Anstatt des gesamten Blockes, der die NullSub aufruft, sollten folgende Zeilen vollkommen ausreichend sein

Code: Alles auswählen

	If NOT oDok2.BasicLibraries.hasByName("Standard") Then
		oDok2.BasicLibraries.createLibrary("Standard")
	End If
	oDok2.BasicLibraries.loadLibrary("Standard")
Desweiteren musst Du eigentlich keine Sub für die Monatsvariablen anlegen, stattdessen kannst Du die Variablen auch einfach als Konstanten direkt festlegen

Code: Alles auswählen

(...)
	sKette = sKette & "Public Const sAktMonat as String = """ & oErstellen.getCellRangeByName("C1").string & """" & CHR(13)
	sKette = sKette & "Public Const vLabelHinterFarbe as String = """ & 65535 & """" & CHR(13)
	sKette = sKette & "Public Const vLabelTextFarbe as String = """ & 0 & """" & CHR(13)
	myLib.insertByName(sModulName,sKette)
(...)
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Makro1 Daten in Makro2-Dialog schreiben.

Beitrag von balu »

Hallo DPunch,
Sorry, ich hatte leider in letzter Zeit keinerlei Musse, mich mit OOo zu beschäftigen.
Macht doch nichts.

Soweit ich das überblicken kann, benutzt Du Deine NullSub nur, um die Bibliothek zu laden.
Überblicken tu ich das nicht wirklich. Hatte das aus dem anderen Thread nur so weit abgeändert, bis ich ein funktionierendes Ergebnis hatte.

Anstatt des gesamten Blockes, der die NullSub aufruft, sollten folgende Zeilen vollkommen ausreichend sein
Dieser kurze und knackige 4-Zeiler ist allemale besser und übersichtlicher, als das andere. Und ja, er ist ausreichend und außerdem auch zeitlich schneller (Zeit kann ich aber nicht messen).

Desweiteren musst Du eigentlich keine Sub für die Monatsvariablen anlegen
Da magst Du wohl Recht haben, aber das ist auch noch als *Spielwiese* zu betrachten, da ich bei dem Thema "Modul in einer zweiten Datei anlegen" noch nicht so viel Erfahrung habe.

stattdessen kannst Du die Variablen auch einfach als Konstanten direkt festlegen
Das werde ich demnächst so Schrittweise ausprobieren.

Ich Danke dir vielmals für deine Bemühungen und für die Optimierung :).



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