Bildschirmaktualisierung in Calc abschalten

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Bildschirmaktualisierung in Calc abschalten

Re: Bildschirmaktualisierung in Calc abschalten

von Jeannot » So, 30.12.2007 10:48

Hab die erste Lösung von komma4 ausprobiert und diese funktioniert auch ähnlich unter OOo 2.0.
ACHTUNG: Du verwendest OOo 2.0 – da funktionieren die Routinen nicht, wenn ein Dokument HIDDEN erzeugt wird und dann angezeigt werden soll!
Falls jemand ähnliche Probleme haben sollte, hier also meine Lösung:
1. Prozedur schreiben (am besten Public dann kann sie auch von anderen Modulen des Projekts genutzt werden):

Code: Alles auswählen

Public Sub WindowVisible(blnVisible As Boolean)
	Dim oFrame As Object, oWindow As Object
	oFrame=ThisComponent.CurrentController.Frame
	oWindow=oFrame.getContainerWindow
	oWindow.Visible=blnVisible
End Sub
2. In der Prozedur an der Stelle wo das Flackern beginnt einfach Folgendes tun:

Code: Alles auswählen

	Call WindowVisible(False)
	'Weitere Anweisungen
	'Hier beginnt normalerweise das Flackern
	'....
	'....
	'Hier ist Schluss
	Call WindowVisible(True)
3. Achtung bei 'Exit Sub' innerhalb der Prozedur und in Fehler-Routinen muss immer ein <Call WindowVisible(True)> stehen. Sonst bleibt der Bildschirm in diesen Fällen verschwunden.
Bei Ausführung der Prozedur kommt die nächste, dahinterliegende Anwendung in den Vordergrund. Meldungen der Prozedur werden jedoch angezeigt. Falls keine andere Anwendung aktiv ist, kommt der Desktop in den Vordergrund. Wenn die Prozedur beendet ist erscheint die Anwendung wieder mit der aktiven Tabelle und der Cursorposition die von mir im Code definiert wurden.
Für mich ist dies die sauberste und professionellste Lösung. Ich hoffe dass noch jemand diese gebrauchen kann.

Gruß an Alle!

Jeannot

Re: Bildschirmaktualisierung in Calc abschalten

von Jeannot » Fr, 28.12.2007 22:59

Hallo an Alle,

Besten Dank komma4 für Deine Anregungen. Die Sache mit Writer hab ich ausprobiert, ist zwar bisschen abenteuerlich, aber für den Notfall absolut brauchbar. Mir ist jedoch als ob ich die Sache anders anpacken müsste, da ich heute gelesen hab dass die Programmierung per UNO-Dispatcher Modell zwar bequem, aber unsicher bezüglich zukünftiger Kompatibilität ist.
Das ganze soll folgendermaßen ablaufen: der User wählt in einem Dialog-Listenfeld einen Druckjob aus, welcher eine Anzahl von x Seiten hat (manchmal 2, manchmal bis zu 16). Diese werden dann am Stück (Duplex-Drucker) gedruckt oder in 2 Etappen (manueller Duplex-Druck).
Am liebsten würde ich drucken ohne die entsprechenden Seiten auswählen zu müssen. Folgenden Ansatz hab ich probiert:

Code: Alles auswählen

Sub Drucken
	Dim arg(0) as new com.sun.star.beans.PropertyValue
	arg(0).name="Pages"
	arg(0).value="8-12"
	ThisComponent.print(arg())
End Sub
Dies klappt zwar hat aber einen Haken: ich kann nicht sicher sein dass dies die Seiten sind, die ich definiert habe. Falls ein User einen Druckbereich in einer Tabelle hinzufügt (am besten in der allerersten!), verschieben sich alle Seitenzahlen und mein Programm druckt nichts mehr korrekt. :shock:
Also will ich von mir definierte benannte Bereiche drucken. Ich muss also den Bereich irgendwie auswählen und die Auswahl drucken. Da dies nicht mit obiger Prozedur möglich ist hab ich mir Folgendes ausgedacht, was auch so funktioniert, bis auf das Geflacker:

Code: Alles auswählen

	oDoc=ThisComponent
	'Activate the sheet containing the named range
	oSheet = oDoc.Sheets.getByName(strSheetName)
	oDoc.getCurrentController().setActiveSheet(oSheet)
	'Select the named range ...
	oRange=oSheet.getCellRangeByName(strRangeName)
	oDoc.getCurrentController().Select(oRange)
	'...and print it
	args2(0).Name = "Copies"
	args2(0).Value = bytNumberOfCopies
	args2(1).Name = "Selection"
	args2(1).Value = true
	args2(2).Name = "Collate"
	args2(2).Value = false
	oDocument   = ThisComponent.CurrentController.Frame
	oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	oDispatcher.executeDispatch(oDocument, ".uno:Print", "", 0, args2())
	'Undo selection
	oRange=oSheet.getCellRangeByName(strDefaultSelect)
	oDoc.getCurrentController().Select(oRange)
	oSheet = oDoc.Sheets.getByIndex(0)
Wäre es nicht möglich mich auf Seite 1 zu positionieren, die benannten Bereiche anzusprechen, ohne diese physisch auszuwählen und diese 'virtuelle Auswahl' dann zu drucken?
Kann ich eine Auswahl drucken ohne auf das UNO-Dispatcher Modell zurückzugreifen?

Vielen Dank für Eure Mühe!

Jeannot

Re: Bildschirmaktualisierung in Calc abschalten

von komma4 » Fr, 28.12.2007 00:22

Es kommt darauf an, wie viele Markierungen, Berechnungen und Formatierungen vorgenommen werden....
Die Anweisungen verhindern nicht alle, sondern nur einige "update!"-Anweisungen der Bildschirmdarstellung.
2.3_sdk/docs...lockControllers hat geschrieben:some notifications for display updates are not broadcasted
Willst Du keine Änderungen am Schirm sehen kannst Du den gesamten frame verbergen

Code: Alles auswählen

' 20071101
' Dokument ausblenden, dann anzeigen – geht seit 2.2.x
 oDesktop = StarDesktop
 
 oDokAnsicht = _
  oDesktop.CurrentComponent.CurrentController.Frame.ContainerWindow
 oDokAnsicht.Visible = FALSE
 
 msgbox "ausgeblendet - VORSICHT"
 
 REM ..... weitere Anweisungen

 oDokAnsicht.Visible = TRUE
ACHTUNG: Du verwendest OOo 2.0 – da funktionieren die Routinen nicht, wenn ein Dokument HIDDEN erzeugt wird und dann angezeigt werden soll!

Oder -wenn Du magst- im Vordergrund (Vollbild) ein Dokument anzeigen, welches auch noch Statusmeldungen anzeigen kann.

Code: Alles auswählen

' 20060517 
' http://www.oooforum.org/forum/viewtopic.phtml?t=36652
' JohnV PostPosted: Wed May 17, 2006 4:27 pm
Blank =  _
 StarDesktop.loadComponentFromURL("private:factory/swriter","_blank",0,Array())
Blank.Text.String = "Working."
 
 REM ..... weitere Anweisungen
 
Blank.dispose
Hilft das?

Bildschirmaktualisierung in Calc abschalten

von Jeannot » Do, 27.12.2007 21:30

OS = Linux Kubuntu EdgyEft / OOo = version 2.0

Hallo an Alle!

Ich suche verzweifelt nach einer Möglichkeit die Bildschirmaktualisierung während der Makroausführung in Calc abzuschalten. Mein Makro druckt je nachdem was der User in einem Listenfeld auswählt zwischen 2 und 16 Seiten. Dies geschieht per UNO DispatchHelper Service, weil ich pro Seite einen benannten Bereich zuerst selektiere und dann ausdrucke. Dies klappt hervorragend, nur das Geflacker sieht nicht gerade professionell aus. :shock:
Folgender Code, den ich in einer NG gefunden habe bewirkt leider bei mir überhaupt nichts: :cry:

Code: Alles auswählen

	'Avoid screen-updating
	With ThisComponent
		.addActionLock
		.LockControllers()
	End With
Vielen Dank im Voraus für Eure Mühe!

Jeannot

Nach oben