[Gelöst] Repaint eines Formulars

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

[Gelöst] Repaint eines Formulars

Beitrag von gogo »

Hallo!

Ich habe ein paar Kontrollelemente von (Base)-Formularen über die Drawpage neu positioniert bzw deren Größe verändert. (viewtopic.php?f=18&t=46567#p188390)

Nun entsteht das Problem, dass bei einigen Computern (einige WinXP, einige Unix) das neue Layout zwar richtig angezeigt wird, aber Reste der alten Einstellungen (z.B. die Background-Farbe eines Textfeldes) noch am Bildschirm verbleiben - die sind sofort weg, wenn man einen Klick auf den "Seitenhintergrund" macht, allerdings ist das trotzdem etwas störend.

Meine Frage daher: gibt es die Möglichkeit den Inhalt eines Frames oder einzelne Kontrollelemente neu zeichnen zu lassen, im Sinne eines "Repaint"-Befehls (also ohne sich um die Daten zu kümmern)?

ein ...

Code: Alles auswählen

ThisComponent.CurrentController.Frame.LayoutManager.doLayout()
... hilft leider gar nicht.

g
Zuletzt geändert von gogo am Fr, 04.11.2011 11:52, insgesamt 1-mal geändert.
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Repaint eines Formulars

Beitrag von balu »

Hallo gogo,

eins vorweg, ich weiß nicht ob meine gemachten Feststellungen und Beobachtungen mit Textfeldern in einem Dialog auch bei dir zutreffen könnten. Wenn nicht, hab ich halt Pech gehabt und Du musst auf eine andere Antwort warten.
einige WinXP, einige Unix
z.B. die Background-Farbe eines Textfeldes
Nun, meine Textfelder im Dialog hatte ich Farblich und mit Rahmen ausgestattet. Unter WinXP mit OOo 3.2.1 keine Probleme. Aber unter Fedora 11 mit OOo 3.1.0 waren die Textfelder nicht wirklich zu gebrauchen (der eingegebene Text war nicht zu lesen). Erst als ich bei den Textfeldern den Rahmen :shock: ausgeschaltet hatte, war alles in Ordnung. Ich weiß das es sich sehr merkwürdig anhört, aber die Feststellung hatte ich halt gemacht.

Vielleicht hilft es ja, wenn Du bei deinen Textfeldern auch den Rahmen ausschaltest. Es sei denn, es geht nicht nur um Textfelder sondern noch um andere Objekte.

Es wäre aber zu dem wirklich sehr hilfreich zu wissen unter welchem System welche Symptome genau auftreten, und wo mit was das Layout erstellt wurde, Win mit OOo oder Linux mit LO oder ....?


Gruß
balui
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
gogo
*****
Beiträge: 207
Registriert: Mi, 10.11.2010 13:11

Re: Repaint eines Formulars

Beitrag von gogo »

Danke für den Hinweis mit den Rahmen - die waren's nicht ;)

The dirty way:

Also zunächst mal: das Ganze ist mit Sicherheit ein Hardwareproblem, das bei einigen Software/Hardware-Kombinationen auftaucht. Betroffen sind vor allem Linux-Systeme (Ubuntu (3 von 7), Lubuntu (1 von 3)) sowie zumindest 1 von 16 WinXP-Pro Rechnern - Alle unsere Rechner haben die Grafik on Board.

Der Anzeigefehler tritt bei LO 3.3.2 und OOo 3.3.0 (nur ein betroffener Rechner getestet) gleichermaßen auf und wird durch ein "fehlerhaftes Repaint" des verbleibenden Hintergrundes beim Verschieben oder bei der Gößenänderung eines Kontrollelements (getestet bei Textfeldern) ausgelöst. Interessanterweise werden nich einfach Teile des Kontrollelements "vergessen", sondern die Überbleibsel befinden sich an einer Stelle an der das KE weder war noch ist, in der Regel direkt an die Position vor der Veränderung oben, unten, rechts oder links angehängt...
da unten gehört es nicht hin
da unten gehört es nicht hin
Bildschirmfoto.png (18.26 KiB) 579 mal betrachtet
Da oben ebensoweinig (derzeit wäre es ausgeblendet)
Da oben ebensoweinig (derzeit wäre es ausgeblendet)
Bildschirmfoto-1.png (29.61 KiB) 579 mal betrachtet

Die Größen/Positionsänderung erfolgt durch die Zuweisung eines "com.sun.star.awt.Point" bzw. "com.sun.star.awt.Size"-Objektes an die ".position" bzw ".size" Property eines Drawpageobjektes, das mit "thiscomponent.drawpage.createEnumeration" erzeugt wurde.

Unten habe ich 2 Workarounds beschrieben, die beide funktionieren
1. Workaraound (benutze ich derzeit)
Das Kontrollelement wird während der Veränderung ausgeblendet, und nachher wieder eingeblendet

2. Workaraound
Diesen WA habe ich zu Testzwecken gemacht, um zu eruieren ob die Werte der Veränderung einen Einfluss haben.
Der Workaround macht nichts anderes, als dass er vor der Zuweisung der neuen Property-Werte (.Size und .Position) diese im Drawpageobjekt zunächst auf "0" setzt, und dann erst die gewünschten Werte setzt.



Code: Alles auswählen

oshapesenum=thiscomponent.drawpage.createEnumeration

while oshapesenum.hasmoreelements

oshape = oshapesenum.nextelement

if oshape.supportsService("com.sun.star.drawing.ControlShape") then
	if oshape.control.ServiceName = "stardiv.one.form.component.Edit"
		if oshape.control.Name = <Name des Kontrollelements as String> then

REM    Der mit Hochkommas auskommentierte Bereich ist der nicht verwendete Workaround 2
'		dim opositionNull as new com.sun.star.awt.Point
'			opositionNull.X  = 0
'			opositionNull.Y  = 0
'		dim osizeNull as new com.sun.star.awt.Size
'			osizeNull.Height = 0
'			osizeNull.Width  = 0

		dim oposition as new com.sun.star.awt.Point
			oposition.X=oshape.Position.X          'Position unveraendert
			oposition.Y=5000
		dim osize as new com.sun.star.awt.Size
			osize.Height = 5000
			osize.Width = oshape.Size.Width        'Breite unveraendert

REM    Der mit Hochkommas auskommentierte Bereich ist der nicht verwendete Workaround 2
'		oshape.size     = osizeNull               'Muss nicht unbedingt sein, verhindert aber "Flackern" der Anzeige
'		oshape.position = opositionNull

		oshape.visible  = false                   '<=== verhindert den Anzeigefehler
		oshape.size     = osize                   '<=== Jede dieser Zeilen loest den Anzeigefehler aus
		oshape.position = oposition               '<=== Jede dieser Zeilen loest den Anzeigefehler aus
		oshape.visible  = true                    '<=== verhindert den Anzeigefehler

		end if
	end if
end if
wend
g
g
LucidLynx/WinXP LibreOffice v3.3.2 ab 03/12 v3.3.2 & v3.4.5
Antworten