Seite 1 von 1
Kantenglättung per Basic deaktivieren / aktivieren
Verfasst: Fr 2. Aug 2019, 14:46
von aladin
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
Re: Kantenglättung per Basic deaktivieren / aktivieren
Verfasst: Sa 3. Aug 2019, 00:53
von gogo
Du kannst ein Dokument auch generieren ohne es anzuzeigen. Kannst Du kurz erklären wie das Dokument erstellt wird?
Re: Kantenglättung per Basic deaktivieren / aktivieren
Verfasst: Sa 3. Aug 2019, 08:16
von aladin
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
Re: Kantenglättung per Basic deaktivieren / aktivieren
Verfasst: Sa 3. Aug 2019, 14:21
von gogo
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

. 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

Re: Kantenglättung per Basic deaktivieren / aktivieren
Verfasst: Mo 5. Aug 2019, 13:33
von aladin
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

. 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
Re: Kantenglättung per Basic deaktivieren / aktivieren
Verfasst: Mo 5. Aug 2019, 17:21
von aladin
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