🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

"Speichern unter" am alten Ort per Makro?

Alles zur Programmierung im LibreOffice.
akoerber
Beiträge: 197
Registriert: Di 4. Okt 2011, 19:30

"Speichern unter" am alten Ort per Makro?

Beitrag von akoerber » Fr 11. Apr 2025, 09:39

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

akoerber
Beiträge: 197
Registriert: Di 4. Okt 2011, 19:30

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

Beitrag von akoerber » Fr 11. Apr 2025, 13:57

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?

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2533
Registriert: Fr 10. Dez 2010, 10:01

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

Beitrag von karolus » 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
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

mikele
* LO-Experte *
Beiträge: 1927
Registriert: Mo 1. Aug 2011, 20:51

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

Beitrag von mikele » 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
Gruß,
mikele

akoerber
Beiträge: 197
Registriert: Di 4. Okt 2011, 19:30

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

Beitrag von akoerber » Mo 28. Apr 2025, 14:59

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!

akoerber
Beiträge: 197
Registriert: Di 4. Okt 2011, 19:30

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

Beitrag von akoerber » 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.

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

akoerber
Beiträge: 197
Registriert: Di 4. Okt 2011, 19:30

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

Beitrag von akoerber » 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.

akoerber
Beiträge: 197
Registriert: Di 4. Okt 2011, 19:30

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

Beitrag von akoerber » Mo 28. Apr 2025, 15:12

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.

mikele
* LO-Experte *
Beiträge: 1927
Registriert: Mo 1. Aug 2011, 20:51

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

Beitrag von mikele » 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:

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
Gruß,
mikele

akoerber
Beiträge: 197
Registriert: Di 4. Okt 2011, 19:30

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

Beitrag von akoerber » Do 1. Mai 2025, 11:54

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!


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten