[gelöst] Vorlagenpfad(e) mit Basic ändern

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

Moderator: Moderatoren

Benutzeravatar
katzenmann
Beiträge: 6
Registriert: Fr, 10.12.2010 18:28

[gelöst] Vorlagenpfad(e) mit Basic ändern

Beitrag von katzenmann »

Meine Frage ist ziemlich lang, weil ich schon einiges ausprobiert habe, aber an einem bestimmten Punkt nicht weiterkomme.
Hinweis: OOo-Version 3.2.1, Betriebssystem Windows XP.

Ich möchte mit einem Basic-Makro den Standardpfad für Formatvorlagen ändern, wie es ein Benutzer in der OOo-GUI mit der Befehlsfolge >Extras >Optionen >OpenOffice.org >Pfade >Dokumentvorlagen tun kann.
Da kann man (im laufenden Betrieb) Pfade löschen, hinzufügen und einen von mehren Pfaden als Standardpfad auswählen.

Der Service com:sun:star:util:PathSettings scheint für die Aufgabe geeignet zu sein, verhält sich allerdings etwas seltsam.

Was ich im laufenden Betrieb mit Basic nicht hinbekomme:
(1) Einen schon registrierten Pfad als Standardpfad einstellen, ohne dass er mehrfach in der Pfadauswahl auftaucht.

(2) Einen (falschen/veralteten) Pfad löschen, um ihn durch einen neuen (richtigen) Pfad zu ersetzen.

Einiges funktioniert ganz gut, sofern nicht (1) oder (2) auftritt:

(a) Standardpfad in Basic ändern ...

Code: Alles auswählen

Dim oPfade as object
oPfade = createUnoService("com.sun.star.util.PathSettings")
oPfade.Template_writable = ConvertToUrl("D:\Spezialvorlagen")
… funktioniert.
Template_writable ist der Pfad, den man bei eventuell mehreren Pfaden in der GUI als Standardpfad anklicken kann (Radiobutton links neben dem Pfadnamen).

Möglicherweise sollte der 'alte' Standardpfad erhalten bleiben, weil man irgendwann später wieder hauptsächlich mit den dort gespeicherten Vorlagen arbeitet.

(b) Standardpfad ändern und alten Pfad erhalten ...

Code: Alles auswählen

Dim oPfade as object
Dim sAlt as string
oPfade = createUnoService("com.sun.star.util.PathSettings")
'-- alten Pfad merken
sAlt = oPfade.Template_writable
'– neuen Pfad setzen
oPfade.Template_writable = ConvertToUrl("D:\Spezialvorlagen")
'-- alten Pfad in die Liste der Vorlagenpfade eintragen
oPfade.Template = sAlt
… sieht dann in der GUI zB. so aus:
( ) E:\Projekte\A15\Konstruktion\Doku\Formulare
(X) D:\ Spezialvorlagen
Soweit alles Ok.

(c) Der 'gerettete' Pfad soll wieder Standardpfad sein ...

Code: Alles auswählen

oPfade.Template_writable = oPfade.Template_user(0) 'siehe #1
… bewirkt nun dieses:
( ) E:\Projekte\A15\Konstruktion\Doku\Formulare
(X) E:\Projekte\A15\Konstruktion\Doku\Formulare

… oder bei Verfahren (b):
( ) E:\Projekte\A15\Konstruktion\Doku\Formulare
( ) D:\ Spezialvorlagen
(X) E:\Projekte\A15\Konstruktion\Doku\Formulare

Wie entferne ich den überflüssigen Eintrag E:\Projekte... ?

Code: Alles auswählen

sAlt = oPfade.Template_writable
oPfade.Template_writable = oPfade.Template_user(0)
oPfade.Template_user(0) = sAlt
funktioniert nicht !!

Anmerkung #1:
Template_user() ist ein Array mit allen benutzerdefinierten Vorlagenpfaden außer dem eingestellten Standardpfad.
Die benutzerdefinierten Pfade kann man zB. so anzeigen...

Code: Alles auswählen

for i = LBound(oPfade.Template_user()) to UBound(oPfade.Template_user())
   MsgBox oPfade.Template_user(i)
next
… aber nicht ändern.
oPfade.Template_user(0) = "Quatsch" erzeugt keinen Fehler, sondern macht einfach nichts.

Nun kann man die Datei Paths.xcu direkt ändern. Das möchte ich eigentlich nicht, weil zum einen die Änderungen erst wirken, wenn man alle Office-Anwendungen und den Schnellstarter beendet hat und weil es irgendeinen Service geben muß, der über >Extras >Optionen >OpenOffice.org >Pfade ausgeführt wird.

- - Es wäre toll, wenn mir jemand im Forum eine Anregung geben kann! - -

Jetzt noch ein Tipp zu folgender Frage:

Wie komme ich an den Standardpfad für Vorlagen, der typischerweise bei der Installation eingerichtet wird ? Ist hier im Forum - glaube ich - auch schon mal thematisiert worden.

Ich bevorzuge den nachstehenden Code, der im Gegensatz zu einer Reihe anderer Vorschläge, die im Web kursieren, unabhängig vom Betriebssystem ist:

Code: Alles auswählen

Function Standardvorlagenpfad() as string
  Dim oPfadSubst as object
  oPfadSubst = createUnoService("com.sun.star.util.PathSubstitution")
  Standardvorlagenpfad = oPfadSubst.getSubstituteVariableValue("user") + "/template"
End Function

'... Irgendwo anders im Code …

'-- Anzeige in URL-Notation
MsgBox Standardvorlagenpfad()
'-- Anzeige gem. verwendetem Betriebssystem
MsgBox ConvertFromUrl( Standardvorlagenpfad() )
Um andere benutzerbezogene Standardpfade zu ermitteln einfach "/template" durch den passenden Ordnernamen ersetzen, zB. "/autotext" für Textbausteine.

Abschließend noch eine Anmerkung zu den Codeschnippseln vom Anfang:

Nicht wundern, wenn man .Template ausliest. Da erhält man etwa folgenden Bandwurmstring:
"file:///C:/Programme/OpenOffice.org%203/Basis/share/template/de;vnd.sun.star.expand:$UNO_USER_PACKAGES_CACHE/uno_packages/4.tmp_/TemplatePackage.oxt/template;file:///C:/Dokumente%20und%20Einstellungen/katzenmann/Anwendungsdaten/OpenOffice.org/3/user/template;file:///D:/Spezialvorlagen".

Das ist eine Aneinanderreihung aller in OOo irgendwo registrierten Vorlagenpfade.

Die Beschreibungen bei http://api.openoffice.org/docs/common/r ... tings.html oder http://wiki.services.openoffice.org/wik ... h_Settings
sind für mich nicht wirklich erhellend.

Dank Xray-Tools konnte ich sehen, dass der PathSettings-Service gleich mehrere Properties für Vorlagen bietet, die miteinander zusammenhängen. Die Properties heißen:
1) Template (als Multipath-String) <= alle registrierten Pfade
2) Template_user (String-Array) <= benutzerdefinierte Pfade
3) Template_internal (String-Array) <= interne Pfade
4) Template_writable (Singlepath-String) <= Standardpfad

(1) liefert die Zusammenfassung von (2) bis (4). Beim Schreiben wird ein angegebener Pfad bei (2) eingegliedert, sofern er dort noch nicht vorhanden ist.

Tolles Forum! - Und vielleicht weiß jemand Rat?
Gruß an alle von katzenmann
Zuletzt geändert von katzenmann am Mi, 09.02.2011 16:25, insgesamt 1-mal geändert.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Vorlagenpfad(e) mit Basic ändern

Beitrag von DPunch »

Aloha

Schau mal, ob Dir das hier weiterhilft:

Code: Alles auswählen

Sub Main
	ChangeActiveTemplatePath("D:\Spezialvorlagen",True)
End Sub

Sub ChangeActiveTemplatePath(ByVal sNewPath as String, ByVal bKeepOldPath as Boolean)
	oPathSettings = createUnoService("com.sun.star.util.PathSettings")
	sPath = ConvertToURL(sNewPath)
	aPaths = oPathSettings.Template_user
	Dim aTmp() as String
	n = -1
	For i = 0 To UBound(aPaths)
		If aPaths(i) <> sPath Then
			n = n + 1
			ReDim Preserve aTmp(n) as String
			aTmp(n) = aPaths(i)
		End If
	Next i
	If bKeepOldPath AND sPath <> oPathSettings.Template_writable Then
		n = n + 1
		ReDim Preserve aTmp(n) as String
		aTmp(n) = oPathSettings.Template_writable
	End If
	oPathSettings.Template_user = aTmp
	oPathSettings.Template_writable = sPath
End Sub
Benutzeravatar
katzenmann
Beiträge: 6
Registriert: Fr, 10.12.2010 18:28

Re: Vorlagenpfad(e) mit Basic ändern

Beitrag von katzenmann »

Hallo DPunch,
klappt jetzt wunderbar. Entscheidend ist wohl dies:

Code: Alles auswählen

oPathSettings.Template_user = aTmp
Ich hatte wie in Deinem Code auch ein aTmp()-Array erstellt aber dann den Fehler begangen, aTmp nicht komplett an oPathSettings.Template_user zu übergeben. Stattdessen hatte ich versucht die Daten von aTemp einzeln nach .Template_user zu schreiben mit

Code: Alles auswählen

oPathSettings.Template_user(i) = aTmp(i)
' -- Kontrollcode --
um parallel noch etwas Kontrollcode auszuführen, anstatt diesen an anderer Stelle in einer eigenen FOR .. NEXT-Schleife einzubauen. Ich könnte mich würgen :? .

Vielen Dank für Deine Hilfe!
Antworten