Seite 1 von 2

"Speichern unter" am alten Ort per Makro?

Verfasst: Fr 11. Apr 2025, 09:39
von akoerber
Hallo,

ich habe vor ein paar Tagen festgestellt, dass es keine Möglichkeit gibt, einzustellen, dass LO beim "Speichern unter" von Dateien zwingend dasselbe Verzeichnis nimmt, aus dem heraus sie geöffnet wurden. Bei "Speichern" mit dem alten Namen geht das natürlich.
Zumeist wird bei "Speichern unter" das letzte Verzeichnis genommen, in das etwas gespeichert wurde.

Ich würde dazu gerne einen Makro haben, kenne mich aber mit den APIs etc überhaupt nicht aus.

Hat jemand einen Makro, der
1. ausliest, aus welchem Verzeichnis eine Datei geöffnet wurde (in welchem sie zum Zeitpunkt des Aufrufs "liegt"),
2. dann einen "Speichern unter"-Dialog öffnet, in dem der Pfad schon eingetragen ist, nicht aber der Dateiname (weil man ja etwa etwas hinzufügen will, sonst kann man ja "Speichern" nehmen)?

... und den man dann auf die Symbolleiste legen kann - als Ersatz für "Speichern unter"?

Dank im Voraus

Re: "Speichern unter" am alten Ort per Makro?

Verfasst: Fr 11. Apr 2025, 13:57
von akoerber
Ich habe nun einen Versuch gemacht, der aber leider noch hakt:

Code: Alles auswählen

sub Speicherntestunfertig1
if (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) then
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
 end if
dim document   as object
dim dispatcher as object
Dim oDoc As Object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
oDoc = ThisComponent
sDocURL      = oDoc.getURL()
sDocPath     = DirectoryNameoutofPath(sDocURL, "/")
sDocName     = GetFileNameWithoutExtension(sDocURL, "/")
sDocExt      = GetFileNameExtension(sDocURL, "/")

rem If oDoc.HasLocation() Then
rem   Print "The Document URL is " & oDoc.getURL()
rem Else
rem   Print "The document has not yet been stored"
rem End If

msgbox sDocPath

rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = sDocPath & "/" & sDocName & "." & sDocExt


dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())

end sub
Dieser Macro greift zum Speichern der Datei offenkundig wirklich auf das Verzeichnis zu, in dem sie geöffnet wurde, aber
1. er speichert sie direkt (oder versucht es), als wäre es "Save", nicht "Save as"
2. es gibt immer wieder mal Zugriffsberechtigungsfehler

Kann jemand helfen?

Re: "Speichern unter" am alten Ort per Makro?

Verfasst: Mo 14. Apr 2025, 11:32
von karolus
Du kannst es drehen, wenden oder formulieren wie du willst, aber letztlich entspricht: »speichern unter dem bereits benutzten Pfad« eben »speichern« … ergo Strg S oder wenns denn unbedingt per Makro sein soll:

Code: Alles auswählen

sub speichern
  thisComponent.store(True)
End Sub

Re: "Speichern unter" am alten Ort per Makro?

Verfasst: Mo 14. Apr 2025, 16:55
von mikele
Hallo,
teste mal:

Code: Alles auswählen

Sub SpeichernDialog

	'Arbeitsverzeichnis auslesen
	oContext = GetProcessServiceManager().DefaultContext
	oPathSettings = oContext.getValueByName("/singletons/com.sun.star.util.thePathSettings")
	pfad=oPathSettings.Work
	'URL des aktuellen Dokuments auslesen
	url=ThisComponent.Url
	if url<>"" then	'aktuelles Verzeichnis setzen falls vorhanden
		aUrl=split(url,"/")
		aUrl(ubound(aUrl))=""
		pfad=join(aUrl,"/")
	end if
	'Speichern-Dialog aufrufen
	Dialog=createunoservice("com.sun.star.ui.dialogs.FilePicker")
	Dim Dialogtyp(0)
	DialogTyp(0) =com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS
	'weitere Dialog-Typen: https://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1ui_1_1dialogs_1_1TemplateDescription.html
	Dialog.initialize( DialogTyp)
	Dialog.displaydirectory=pfad
	'Definition der einzusetzenden Filter.
	Dialog.AppendFilter("Alle Dateien (*.*)", "*.*")
	Dialog.AppendFilter("OOo Writer (*.odt)", "*.odt")
	Dialog.AppendFilter("OOo Calc (*.ods)", "*.ods")
	Dialog.AppendFilter("OOo Draw (*.odg)", "*.odg")
	Dialog.AppendFilter("OOo Impress (*.odp)", "*.odp")
	Dialog.SetCurrentFilter("Alle Dateien (*.*)")
	Dialog.execute
End sub

Re: "Speichern unter" am alten Ort per Makro?

Verfasst: Mo 28. Apr 2025, 14:59
von akoerber
karolus hat geschrieben:
Mo 14. Apr 2025, 11:32
Du kannst es drehen, wenden oder formulieren wie du willst, aber letztlich entspricht: »speichern unter dem bereits benutzten Pfad« eben »speichern« … ergo Strg S oder wenns denn unbedingt per Makro sein soll:

Code: Alles auswählen

sub speichern
  thisComponent.store(True)
End Sub
?? Das ist etwas anderes. Man kann im selben Pfad "speichern unter", wenn man etwa den Dateinamen oder das Format verändern will! Dass das aber immer einen völlig unzutreffenden anderen Pfad anbietet, weil zwischendurch eine andere Datei bearbeitet wurde, ist Unsinn!

Re: "Speichern unter" am alten Ort per Makro?

Verfasst: Mo 28. Apr 2025, 15:02
von akoerber
Äh, nein, leider doch nicht. Nachdem ich in einem Fenster (A) damit richtig speichern konnte, wurde auch durch diesen Makros für die zuvor schon offene Datei in einem anderen Fenster (B) das Verzeichnis der Datei in A angeboten.

mikele hat geschrieben:
Mo 14. Apr 2025, 16:55
Hallo,
teste mal:

Code: Alles auswählen

Sub SpeichernDialog

	'Arbeitsverzeichnis auslesen
	oContext = GetProcessServiceManager().DefaultContext
	oPathSettings = oContext.getValueByName("/singletons/com.sun.star.util.thePathSettings")
	pfad=oPathSettings.Work
	'URL des aktuellen Dokuments auslesen
	url=ThisComponent.Url
	if url<>"" then	'aktuelles Verzeichnis setzen falls vorhanden
		aUrl=split(url,"/")
		aUrl(ubound(aUrl))=""
		pfad=join(aUrl,"/")
	end if
	'Speichern-Dialog aufrufen
	Dialog=createunoservice("com.sun.star.ui.dialogs.FilePicker")
	Dim Dialogtyp(0)
	DialogTyp(0) =com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS
	'weitere Dialog-Typen: https://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1ui_1_1dialogs_1_1TemplateDescription.html
	Dialog.initialize( DialogTyp)
	Dialog.displaydirectory=pfad
	'Definition der einzusetzenden Filter.
	Dialog.AppendFilter("Alle Dateien (*.*)", "*.*")
	Dialog.AppendFilter("OOo Writer (*.odt)", "*.odt")
	Dialog.AppendFilter("OOo Calc (*.ods)", "*.ods")
	Dialog.AppendFilter("OOo Draw (*.odg)", "*.odg")
	Dialog.AppendFilter("OOo Impress (*.odp)", "*.odp")
	Dialog.SetCurrentFilter("Alle Dateien (*.*)")
	Dialog.execute
End sub

Re: "Speichern unter" am alten Ort per Makro?

Verfasst: Mo 28. Apr 2025, 15:08
von akoerber
akoerber hat geschrieben:
Mo 28. Apr 2025, 15:02
Äh, nein, leider doch nicht. Nachdem ich in einem Fenster (A) damit richtig speichern konnte, wurde auch durch diesen Makros für die zuvor schon offene Datei in einem anderen Fenster (B) das Verzeichnis der Datei in A angeboten.
Manchmal geht es aber. Kann noch nicht genau sagen, welche Bedingung zieht. Es wäre aber schön, wenn der existierende Dateiname vorgeschlagen würde, ohne dass der Speichervorgang stattfindet.

Gruß,
A.

Re: "Speichern unter" am alten Ort per Makro?

Verfasst: Mo 28. Apr 2025, 15:12
von akoerber
akoerber hat geschrieben:
Mo 28. Apr 2025, 15:08
akoerber hat geschrieben:
Mo 28. Apr 2025, 15:02
Äh, nein, leider doch nicht. Nachdem ich in einem Fenster (A) damit richtig speichern konnte, wurde auch durch diesen Makros für die zuvor schon offene Datei in einem anderen Fenster (B) das Verzeichnis der Datei in A angeboten.
Manchmal geht es aber. Kann noch nicht genau sagen, welche Bedingung zieht. Es wäre aber schön, wenn der existierende Dateiname vorgeschlagen würde, ohne dass der Speichervorgang stattfindet.

Gruß,
A.
Auch scheint die Änderung des Dateiformats (etwa von .pptx zu .odp) nicht zu funktionieren. Der makro hängt dann einfach.

Re: "Speichern unter" am alten Ort per Makro?

Verfasst: Mo 28. Apr 2025, 21:53
von mikele
Hallo,
da fehlte aber noch einiges in meinem Makro (u. a. dass überhaupt etwas gespeichert wird :oops: )
Neuer, erweiterter Verscuh:

Code: Alles auswählen

Sub SpeichernDialog

	'Arbeitsverzeichnis auslesen
	oContext = GetProcessServiceManager().DefaultContext
	oPathSettings = oContext.getValueByName("/singletons/com.sun.star.util.thePathSettings")
	pfad=oPathSettings.Work
	'aktuelles Dokument
	oDoc=ThisComponent
	'URL des aktuellen Dokuments auslesen
	url=oDoc.Url
	sName=""
	if url<>"" then	'aktuelles Verzeichnis setzen falls vorhanden
		aUrl=split(url,"/")
		sName=convertFromUrl(aUrl(ubound(aUrl)))
		aUrl(ubound(aUrl))=""
		pfad=join(aUrl,"/")
	end if
	'Speichern-Dialog aufrufen
	Dialog=createunoservice("com.sun.star.ui.dialogs.FilePicker")
	Dim Dialogtyp(0)
	DialogTyp(0) =com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_AUTOEXTENSION
	'weitere Dialog-Typen: https://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1ui_1_1dialogs_1_1TemplateDescription.html
	Dialog.initialize( DialogTyp)
	Dialog.displaydirectory=pfad
	'Definition der einzusetzenden Filter.
	Dialog.AppendFilter("Alle Dateien (*.*)", "*.*")
	Dialog.AppendFilter("Writer (*.odt)", "*.odt")
	Dialog.AppendFilter("Calc (*.ods)", "*.ods")
	Dialog.AppendFilter("Draw (*.odg)", "*.odg")
	Dialog.AppendFilter("Impress (*.odp)", "*.odp")
	Dialog.AppendFilter("Base (*.odb)", "*.odb")
	If oDoc.supportsService("com.sun.star.sheet.SpreadsheetDocument") Then
		Dialog.SetCurrentFilter("Calc (*.ods)", "*.ods")
	ElseIf oDoc.supportsService("com.sun.star.text.TextDocument") Then
		Dialog.SetCurrentFilter("Writer (*.odt)", "*.odt")
	ElseIf oDoc.supportsService("com.sun.star.drawing.DrawingDocument") Then
		Dialog.SetCurrentFilter("Draw (*.odg)", "*.odg")
	ElseIf oDoc.supportsService("com.sun.star.presentation.PresentationDocuments") Then
		Dialog.SetCurrentFilter("Impress (*.odp)", "*.odp")
	ElseIf oDoc.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") Then
		Dialog.SetCurrentFilter("Base (*.odb)", "*.odb")
	End If
	Dialog.setDefaultName(sName)
	result=Dialog.execute
	if result=1 then 'Dialog wurde nicht abgebrochen
		tmp=Dialog.getfiles
		'Speichern unter
		Dim arg()
		oDoc.storeToUrl(tmp(0),arg())
	end if
End sub

Re: "Speichern unter" am alten Ort per Makro?

Verfasst: Do 1. Mai 2025, 11:54
von akoerber
mikele hat geschrieben:
Mo 28. Apr 2025, 21:53
Hallo,
da fehlte aber noch einiges in meinem Makro (u. a. dass überhaupt etwas gespeichert wird :oops: )
Neuer, erweiterter Verscuh:
Danke! Das scheint gut zu funktionieren.
Ein paar Kleinigkeiten wären noch schön, aber ich hoffe ja noch, dass LO in einer der kommenden Versi9onen wirklich wieder normal funktioniert.

Mir fällt etwas auf, dass dieses Makros die Datei richtig zum "Speichern unter" in ihrem bisherigen Verzeichnisn anbietet und so auch Umbenennungen zulässt. Im Gegensatz zum eigentlichen "Speichern unter" ist nach einen solchen Speichern mit Namensänderung (etwa: Ergänzung) die bearbeitete Datei weiterhin mit dem "alten" Namen versehen, nicht mit dem geänderten.

Das hat selbst Vor- und Nachteile und es wäre schön, wenn (auch) das klassische "Speichern unter" einen Schalter erhielte, mit dem man angeben kann, ob man den alten Namen beibehalten oder aber mit dem geänderten weiter arbeiten will.

Was zudem noch "fehlt" ist die Möglichkeit, auch das Dateiformat zu ändern - etwa zu docx. Wenn man derzeit eine docx-Datei aufruft und mit diesem Macro speichert, wird "docx" im Dateinamen angeboten, das Format aber bei ".odt" belassen, so dass der Name "xxx.docx.odt" resultiert.

Aber das sind Dinge, die erst relevant würden, wenn nicht bald eine Korrektur des wirklichen "Speichern unter" -Dialogs erfolgt

Erst einmal aber herzliches Danke!