Seite 1 von 1

Diagramm -> Hintergrund

Verfasst: Di, 15.03.2011 01:12
von balu
Ein freundliches Hallo an alle. :D

Hab noch ein Problem mit meinem Diagramm. Und zwar möchte ich es in den Hintergrund stellen. Habe aber Null Ahnug wie. :oops:

Xray ist wohl installiert, aber funktioniert nicht so wie erhofft (Aufruf macht mir probleme). Und wenn ich Xray denn mal am laufen habe, finde ich z.B. bei *Drawpage* nix was mit Hintergrundanordnung, z.B. Arrange, zu tun hat. Kann aber auch sein das ich es übersehe.
Ach ja, SDK hab ich auch installiert. Kann aber sein das mir da auch ein Fehler unterlaufen ist.

Dann hatte ich hier, user.services.openoffice.org/en, einen Code gefunden der ein Polygon zeichnet und es zum Schluß in den Hintergrund setzt.
Code-Auszug

Code: Alles auswählen

       oShape = oSheet.createInstance( "com.sun.star.drawing.PolyPolygonShape" )
...
       oShape.LayerID = 1   'to background
Also dachte ich, das ich auch nach dem Begriff *LayerID* suche, nachdem ich mit *Arrange* nicht weiter kam. Mein Versuch, das Diagramm mit LayerID in den Hintergrund zu setzen, scheiterte von vorn herein.

Meine weitere Suche bei http://www.oooforum.org/ bringt mich auch nicht weiter. Da auch dies in Englisch ist, und meine angewendeten Suchbegriffe zu viele Treffer liefern die durchzuarbeiten ich nicht imstande bin.

Eine Beispieldatei mit Diagramm-Makro findet ihr hier.

Würde mich wirklich sehr freuen, wenn ihr mir behilflich sein könntet.

Für eure Bemühungen bedanke ich mich schon mal.


Gruß
balu

Re: Diagramm -> Hintergrund

Verfasst: Di, 15.03.2011 08:48
von clag
Hallo Balu,

möglicherweise kann ich dir hier helfen wenn ich auch selbst nicht so der Basic Kenner bin,
aber es scheint so, dass das verschieben in den Hintergrund nur mit Dispatcher Hilfe machbar ist
(soweit ich das erforschen konnte)
hier habe ich etwas damit experimentiert und ich hoffe du kannst das für dich gebrauchen :)
Diagramm_in_Hintergrund_47431.ods
(61.71 KiB) 135-mal heruntergeladen

Re: Diagramm -> Hintergrund

Verfasst: Di, 15.03.2011 16:45
von balu
Hallo clag,

Danke dir, es hilft mir schon mal sehr weiter :D.
"Please insert cheezburger ..." :lol:


ABER!!!
Es ergibt sich nun ein anderes Problem.

Wenn ich den Code nehme

Code: Alles auswählen

		myDoc = thisComponent
		myDocCtrl = myDoc.getCurrentController()
		oDrawPage = myDoc.getSheets().getByIndex(1).getDrawPage()
		myDocFrame = myDocCtrl.getFrame()
		oShape = oDrawPage( "LineChart" )		
		myDocCtrl.select( oShape )
		oDispatchHelper = createUnoService( "com.sun.star.frame.DispatchHelper" )
		oDispatchHelper.executeDispatch( myDocFrame, ".uno:SetObjectToBackground", "", 0, Array()
dann wird immer das Blatt in den Vordergrund geholt, wo grad das Diagramm in den Hintergrund gesetzt wird. Und in meinem Fall, wo so ca. 30 Blätter mit 30 Diagrammen erstellt werden, ist das nicht nur nervig, sondern auch Zeitaufreibend, so ca 52 sec.

Hab hier im Forum mal gesucht und etwas gefunden was dies Problem umgeht.
Bildschirmaktualisierung in Calc abschalten
Jedoch gefällt mir dies Verfahren persönlich nicht besonders, da OOo komplett beim ausführen des Makros ausgeblendet wird, und nach Beendigung wieder angezeigt wird.

Okay, es sind dadurch *nur noch* ca. 17 sec bis der "Spuk" wieder vorbei ist, aber unschön ist es dennoch.

Ich weiß das man z.B. ein leeres Writer Dokument während dessen anzeigen lassen kann, aber vielleicht weiß ja mittlerweile einer von den anwesenden Spezialisten einen Ausweg. Und deshalb würde ich mich über weitere Hilfe doch sehr freuen. :D


Gruß
balu

Re: Diagramm -> Hintergrund

Verfasst: Di, 15.03.2011 18:41
von clag
Hallo Balu,

mir ist nicht ganz klar wie das sonst in deinem Makro abläuft, ich habe jetzt mein Beispiel auf 9 Tabellen mit Diagrammen erweitert und setzte die in einer Schleife in den Hintergrund.
Bei normalen Ablauf flackert es ungefähr 1 Sek auf dem Schirm, wenn ich eine der Methoden zum lahmlegen der Bildschirmaktualisierung aktiviere ist es nur noch ein ganz kurzes Zwinkern 0,2 Sek und das Makro ist durch.

Es scheint doch, dass eher das generieren der Diagramme so viel Zeit kostet, vielleicht kannst du das Zeichnen und Ausblenden trennen :?:
Diagramm_in_Hintergrund_47431a.ods
(63.05 KiB) 146-mal heruntergeladen

Re: Diagramm -> Hintergrund

Verfasst: Di, 15.03.2011 20:10
von balu
Hallo clag,

nun, ich muss gestehen das ich nicht deutlich genug war. Also noch mal.

Es existiert 1 *leeres* Blatt, welches als Kopiervorlage dient.
Im Blatt "Settings".
Nach klick auf einen Button, und anschließender Sicherheitsabfrage, wird das Makro gestartet.

1.
Das leere Blatt wird kopiert.

2.
Jetzt wird ein Diagramm "aus der Luft gezaubert", besser gesagt, vom Makro erstellt.

3.
Nun wird das Diagramm per Makro in den Hintergrund gestellt.

4.
Je nach Auswahl im Blatt "Settings" werden die Schritte 1 - 3 insgesammt 28, 29, 30 oder 31 mal wiederholt.

In meinen reduzierten Beispieldateien, ohne besondere Daten, ist das nun besser zu sehen.
In der Datei MIT Hintergrund setzen ist die Dauer des ausgeblendeten OOo-Fenster bei mir nur ca. 8 sec. Mit den richtigen Daten wirds dann natürlich schon etwas länger dauern, so wie schon vorher erwähnt.
In der Datei OHNE Hintergrund setzen ist der ganze Prozess bei mir hier um ca. 2 sec schneller.

Wie Du siehst ist es ein extremer Unterschied ob schon existierende Diagramme anders angeodnet werden, oder wenn sie erst noch erstellt werden müssen.
vielleicht kannst du das Zeichnen und Ausblenden trennen
Darum gehts ja nicht. Es geht mir darum das KEIN Ausblenden vom aktivem Fenster stattfindet.

Und folglich ist das Problem noch nicht beseitigt. Freue mich also weiterhin auf hilfreiche Unterstützung :D.


Gruß
balu

Re: Diagramm -> Hintergrund

Verfasst: Di, 15.03.2011 23:36
von clag
nabend Balu,

versuch doch mal diese Variante ist schon erträglich find ich ......
Diagramme-per-makro_OHNE Hintergrund setzen_ok.ods
(17.27 KiB) 149-mal heruntergeladen

Re: Diagramm -> Hintergrund

Verfasst: Mi, 16.03.2011 13:46
von balu
Hallo clag.

Yep, es sieht schon ganz anders aus.
Aber!
Mit gefüllten Datenblättern wird es dann schon wieder unschön.

Ich freue mich wirklich darüber das Du mir selbst als Anfänger geholfen hast. Zumal Du mir auch gute Denkanstöße geliefert hast. Danke dafür :D.

Jedoch habe ich mich für einen anderen Weg entschieden. Denn die Datei, so wie ich sie zu letzt angehängt hatte, soll später ohne dieses Settingsblatt auskommen, da es im täglichem Einsatz einfach störend und irreführend ist. Deshalb habe ich mich jetzt für eine 2-Dateien Version entschieden.

Die 1. Datei beinhaltet nur das Settingsblatt und das Makro.
Die 2. Datei hat nur ein Anleitungsblatt und das Blatt "01", welches schon mit Daten vorgefüttert ist.
Die 1. Datei wird geöffnet und dann führt man das Makro aus. Dieses öffnet die 2. Datei "HIDDEN" und führt dort all das aus was zuvor nur in der Einzelversion stattfand. Also Blätter kopieren, Diagramme erstellen und diese anschließend in den Hintergrund stellen. Und zu guter letzt wird dann die 2. Datei auch noch gespeichert.
Fertig.
Alles läuft schön automatisch ab, ohne irgendwelche störende Einflüsse. In der ausführenden Datei, Nr.1, erscheint ein Hinweistext das gearbeitet wird, und wenn fertig gibts eine Rückmeldung.

Und damit bin ich zufrieden :D.


Gruß
balu

Re: Diagramm -> Hintergrund

Verfasst: Mi, 16.03.2011 15:43
von clag
Hallo Balu,

habe hier jetzt noch eine Variante die ohne jegliches ausblenden auskommt
und auch ohne merkliche Verzögerung oder Beeinflussung ...
Diagramm_in_Hintergrund_47431b.ods
(63.48 KiB) 153-mal heruntergeladen

Re: Diagramm -> Hintergrund

Verfasst: Mi, 16.03.2011 20:04
von Karolus
Hallo
Clag, gibts einen bestimmten Grund dazu rückwärts über die Tabellenblätter zu iterieren?

Gruß Karo

Re: Diagramm -> Hintergrund

Verfasst: Do, 17.03.2011 08:09
von clag
Hallo Karolus,

der "Rückwärtsgang" war noch eingelegt, weil ich vorher eine Methode angewendet hatte die die angesprochenen Tabellen jeweils eingeblendet hat, aber nach dem Durchlauf sollte wieder Tabelle1 sichtbar sein .. .

Jetzt ist das logischerweise nicht mehr nötig, weil das Makro die Diagramme nun ohne sichtbaren Aufruf der Tabellenblätter in den Hintergrund setzt.

Noch etwas geputzt, sieht der Code dann vielleicht so doch besser aus ;)

Code: Alles auswählen

Sub totheBackground

 oDoc = ThisComponent
 oDocCtrl = oDoc.getCurrentController()     
 for dx=0 to 8
  oDrawPage = oDoc.getSheets().getByIndex(dx).getDrawPage() 
  oDocFrame = oDocCtrl.getFrame()
  nNumShapes = oDrawPage.getCount()
    for nShape = 0 To nNumShapes - 1
    oShape = oDrawPage.getByIndex( nShape )
    if oShape.name = "Diagramm"&dx+1 Then
     if oShape.layerName = "vorne" then
      oShape.layerName = "hinten" 
      else
      oShape.layerName = "vorne" 
     endif
   endIf
  next
next
End Sub
was mir aber gerade noch auffällt,
der Code dürfte wohl wegen der Verwendung "vorne" und "hinten" nur in deutsch eingestellten OOo laufen, oder :?:

Re: Diagramm -> Hintergrund

Verfasst: Do, 17.03.2011 09:03
von balu
Moin clag.

Recht Herzlichen Dank für dein letztes Beispiel. Das ist PERFEKT :lol:.
Ich bleibe aber trotzdem bei der 2 Dateientechnik, da dies für den weiteren Projektverlauf nur von Vorteil ist. Aber die neue Hintergrundtechnik wird trotzdem dort eingesetzt, weil einfach schöner ist :wink:.
Noch mal Danke für deine Hilfe :).
was mir aber gerade noch auffällt,
der Code dürfte wohl wegen der Verwendung "vorne" und "hinten" nur in deutsch eingestellten OOo laufen, oder :?:
NÖÖÖÖ!!
Das ist ein Seltenheitsschmankerl. Ein deutsches Wort was in der englischen programmiersprache angewendet wird. Wusste ich bis vor kurzem auch noch nicht. Gucki mal dorti.
Image in BackGround
Need help regarding Image insertion in CALC
How to put a graphic to the background of spreadsheet

Gruß
balu

Re: Diagramm -> Hintergrund

Verfasst: Do, 17.03.2011 09:09
von Karolus
Hallo
der Code dürfte wohl wegen der Verwendung "vorne" und "hinten" nur in deutscher OOo laufen, oder
Komischerweise funktioniert das ( für das bereits erstellte ) Beispielsdokument auch nach Umstellung der Benutzeroberfläche und des Gebietsschemas. ( Hier getestet mit LO )

Mein Optimierungsvorschlag:

Code: Alles auswählen

Sub toggle_Diagrammlayer

	oDoc = ThisComponent

	for dx= 0 to oDoc.Sheets().count()-1
		oDrawPage = oDoc.Sheets(dx).getDrawPage() 
		For nShape = 0 To oDrawPage.getCount() -1
			oShape = oDrawPage.getByIndex( nShape )
			If left( oShape.name, 8) = "Diagramm" Then
				oShape.layerName = iif (oShape.layerName = "vorne","hinten","vorne")
			EndIf
		Next
	next

End Sub
edit:
@Balu
Allein die Tatsache das eine Ansichtsoption per Layername gesteuert wird ist bemerkenswert, daß die Schlüsselwörter fest in deutsch eincodiert sind ist schon witzig.

Gruß Karo

Re: Diagramm -> Hintergrund

Verfasst: Do, 17.03.2011 09:52
von balu
Hallo Karo.
Allein die Tatsache das eine Ansichtsoption per Layername gesteuert wird ist bemerkenswert
Hab es aktuell noch nicht selber getestet, aber in meinem hiesigen Eröffnungsbeitrag hatte ich ja einen Quell-Code verlinkt, in dem das ja mittels *LayerID* und einem Wert gemacht wird. Vielleicht geht sa ja auch damit.

daß die Schlüsselwörter fest in deutsch eincodiert sind ist schon witzig
Find ich auch. Zumal ja das so was von selten ist, dass man sich das glattweg ausdrucken und an die Wand hängen sollte :lol:


Gruß
balu

Re: Diagramm -> Hintergrund

Verfasst: Do, 17.03.2011 10:10
von balu
Update.

Statt

Code: Alles auswählen

LayerName
kann man auch

Code: Alles auswählen

LayerID 
nehmen. Und in diesem Falle anstatt

Code: Alles auswählen

"vorne","hinten"
dann einfach 1 für hinten, und 0 für vorne.

Gruß
balu