BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Kantenglättung per Basic deaktivieren / aktivieren

Alles zur Programmierung im LibreOffice.
Antworten
aladin
Beiträge: 37
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Kantenglättung per Basic deaktivieren / aktivieren

Beitrag von aladin » Fr 2. Aug 2019, 14:46

Hallo Lieb(r)eOffice-Gemeinde.

kennt jemand einen Weg per Basic die Kantenglättung (Extras - Optionen - Ansicht) zu deaktivieren bzw. aktivieren?

Hintergrund ist, in meiner Software werden unter Umständen sehr lange Dokumente (Angebot, Rechnungen) generiert.
Um den Übertrag an die richtig Position einzufügen, muss mit jedem einfügen eines Datensatzes auf die Seitenzahl zugegriffen werden.
Damit man die korrekte Seitenzahl bekommt, muss auf das generierte Dokument bei jedem Datensatz ein Refresh ausgeführt werden.

Um es kurz zu machen, mit ausgeschalteter Kantenglättung werden die Dokumente ein vielfaches schneller generiert.

Die Idee nun ist, vor der Generierung des Dokumentes die Kantenglättung zu deaktivieren und im Anschluss wieder zu aktivieren.

Viele Grüße
Heiko

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Kantenglättung per Basic deaktivieren / aktivieren

Beitrag von gogo » Sa 3. Aug 2019, 00:53

Du kannst ein Dokument auch generieren ohne es anzuzeigen. Kannst Du kurz erklären wie das Dokument erstellt wird?
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

aladin
Beiträge: 37
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Re: Kantenglättung per Basic deaktivieren / aktivieren

Beitrag von aladin » Sa 3. Aug 2019, 08:16

Hallo gogo.
gogo hat geschrieben:
Sa 3. Aug 2019, 00:53
Du kannst ein Dokument auch generieren ohne es anzuzeigen. Kannst Du kurz erklären wie das Dokument erstellt wird?
Das zu generieren Dokument enthält eine Text-Tabelle in welche die Datensätze aus der Datenbank eingefügt werden.
Bei Angeboten und Rechnungen, möchte ich, dass bei mehrseitigen Dokumenten die Überträge eingefügt werden.
Da man aber im voraus nicht wissen kann, wie viele Positionen auf ein Blatt passen, wird nach jedem Einfügen eines Datensatzes geprüft, ob sich die Seitenzahl geändert hat. Das erfolgt mit folgender Funktion:

Code: Alles auswählen

Function fiPageCount AS Integer
	Dim oDocument AS Object,oTextfield AS Object,oCurElement AS Object
	Dim iElementCount AS integer
	oDoc.refresh()
'	oDoc.getTextFields().refresh()
	oDocument = oDoc.CurrentController.Model
	oTextfield = oDocument.getTextfields.CreateEnumeration
	iElementCount=0
	While oTextField.hasmoreElements
		oCurElement = oTextField.NextElement
		if oCurElement.SupportsService("com.sun.star.text.TextField.PageCount") AND iElementCount=0 then
			fiPageCount=oCurElement.getPresentation(False)
'Print oCurElement.getPresentation(true), oCurElement.getAnchor.getString
			iElementCount=1
		end if
	Wend
End Function


Um zu prüfen. auf welcher Seite der letzte Datensatz eingefügt wurde, musste ich den ViewCursor verwenden.

Code: Alles auswählen

Function fsInsertCarry(iPageCountBefore AS integer,iCountInsert AS Integer,iLastPos AS Integer) AS String
	Dim oTables AS Object
	Dim vTableLeistungen AS Variant
	Dim vViewCursor AS Variant

	oTables = createunoservice("com.sun.star.text.TextTables")
	oTables = oDoc.getTextTables
	vTableLeistungen = createunoservice("com.sun.star.text.TextTable")
	vTableLeistungen = oTables.getByName("Leistungen")
	vViewCursor = oDoc.CurrentController.getViewCursor()
	vViewCursor.gotoRange(vTableLeistungen.getCellByName("B"& iCountInsert).createTextCursor(), False)
	vViewCursor.jumpToEndOfPage()
	oDoc.refresh()

	If NOT IsEmpty(vViewCursor.Cell) then
		if vViewCursor.TextTable.Name = "Leistungen" then
			if CLng(Mid(vViewCursor.Cell.CellName,2)) = CLng(vTableLeistungen.Rows.getCount) then
				if iLastPos = 1 Then	
					if fiPageCount > vViewCursor.getPage() then
						fsInsertCarry = "1;"& vViewCursor.getPage()
					else
						fsInsertCarry = "0;"& iPageCountBefore
					End if
				else
					fsInsertCarry = "0;"& iPageCountBefore
				end if 
			elseif CLng(Mid(vViewCursor.Cell.CellName,2)) < CLng(vTableLeistungen.Rows.getCount) then
				fsInsertCarry = "1;"& vViewCursor.getPage()
			End if
		else
			fsInsertCarry = "0;"& iPageCountBefore
		End if
	else
		fsInsertCarry = "0;"& iPageCountBefore
	End if
'	print fsInsertCarry
End Function
Das war die Lösung, um einen Übertrag einzufügen, die ich vor vielen Jahren entwickelt hatte.
Ob es da derzeit einfachere oder bessere Methoden gibt, kann ich nicht einschätzen.

Aber für diese Lösung, musste man das Dokument generieren, während es angezeigt wird.

Gruß
Heiko

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Kantenglättung per Basic deaktivieren / aktivieren

Beitrag von gogo » Sa 3. Aug 2019, 14:21

Einfach mal probieren - am Anfang:

Code: Alles auswählen

...
oDoc.getCurrentController.getFrame.getContainerWindow().setVisible(false)
...
und irgendwo am Ende dann ... .setVisible(true)

... ein Übertrag - was für ein Anachronismus! War früher mal etwas damit Mensch kontrollieren konnte ob Mensch einen Fehler gemacht hat - heute fügt Mensch (sehr kompliziert) einen Übertrag ein, damit ein Computergeneriertes Dokument einen hat :lol: . Um einen Computerfehler nachzuvollziehen braucht's eher eine laufende Summe. Aber schon lustig, dass ich täglich Überträge sehe und mir noch nie Gedanken gemacht habe wie man so einen erstellt ;)
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

aladin
Beiträge: 37
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Re: Kantenglättung per Basic deaktivieren / aktivieren

Beitrag von aladin » Mo 5. Aug 2019, 13:33

gogo hat geschrieben:
Sa 3. Aug 2019, 14:21
Einfach mal probieren - am Anfang:

Code: Alles auswählen

...
oDoc.getCurrentController.getFrame.getContainerWindow().setVisible(false)
...
und irgendwo am Ende dann ... .setVisible(true)
Das Programm funktioniert zwar weiterhin auch unsichtbar, jedoch läuft das Ganze mit eingeschalteter Kantenglättung nicht wirklich schneller.
... ein Übertrag - was für ein Anachronismus! War früher mal etwas damit Mensch kontrollieren konnte ob Mensch einen Fehler gemacht hat - heute fügt Mensch (sehr kompliziert) einen Übertrag ein, damit ein Computergeneriertes Dokument einen hat :lol: . Um einen Computerfehler nachzuvollziehen braucht's eher eine laufende Summe. Aber schon lustig, dass ich täglich Überträge sehe und mir noch nie Gedanken gemacht habe wie man so einen erstellt ;)
Naja, ich finde es trotzdem nett wenn ein Übertrag da ist...
Der Empfänger des Dokumentes weiß ja nicht, dass das Dokument mit einem Computer-Programm generiert wurde.
Könnte ja auch von der netten Kollegin mit M$ Word geschrieben worden sein ;-)

Abgesehen davon, war das vor 15 Jahren ja noch nicht so und es war damals eine Herausforderung eine Lösung für den Übertrag zu entwickeln, die Spaß gemacht hat...

Gruß
Heiko

aladin
Beiträge: 37
Registriert: Di 30. Jul 2019, 15:49
Kontaktdaten:

Re: Kantenglättung per Basic deaktivieren / aktivieren

Beitrag von aladin » Mo 5. Aug 2019, 17:21

Der 1. Schritt ist schon mal gemacht.

Ich kann mit folgendem Code direkt in die Konfiguration schreiben.

Code: Alles auswählen

Sub Set_AntiAliasing(bAntiAliasing as boolean)

	Dim arrPropVal(0) as new com.sun.star.beans.PropertyValue
	Dim ConfProvider as Variant
	Dim ConfUpdateAccess as Variant
	
	ConfProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider")
	
	arrPropVal(0).Name = "nodepath"
	arrPropVal(0).Value = "org.openoffice.Office.Common/Drawinglayer"
	
	ConfUpdateAccess = ConfProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess", arrPropVal())
	
	'GlobalScope.BasicLibraries.LoadLibrary("Tools")
	'WriteDbgInfo(ConfProvider)
	
	print ConfUpdateAccess.AntiAliasing
	
	ConfUpdateAccess.AntiAliasing=bAntiAliasing
	
	ConfUpdateAccess.commitChanges()
	
	ConfProvider.refresh()
	
	print ConfUpdateAccess.AntiAliasing
	
	ConfUpdateAccess.dispose()

End Sub
Allerdings wirkt das erst nach einem Neustart von LO.

Hat jemand eine Idee, wie man LO per Basic überreden kann die geänderte Konfiguration direkt zu verwenden?

Wenn man den Haken für Kantenglättung setzt und übernimmt, dann funktioniert es ja auch ohne Neustart.

Gruß
Heiko

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten