AutoSize und Height eines Labels

22/10/2008 - 01:55 von Matthias Kahlert | Report spam
Hallo zusammen,

ich bin mal wieder ein wenig am rumbasteln. Eine (wie ich eigentlich
dachte simple) Anforderung:

- Ein Form, da drauf ein Label, das per Parameter mit Text gefüllt wird.
- WordWrap aktiviert
- Wenn das Label mit Text gefüllt wird, soll die Größe des Labels dank
AutoSize=.T. automatisch angepasst werden.
- Wenn dabei die Breite korrekt gesetzt wird, funktioniert das ganz gut,
die Höhe des Labels passt sich entsprechend an
- Nun soll als Ergebnis des Ganzen die Höhe des Forms an die Höhe des
Labels angepasst werden

ABER:
Die Eigenschaft "Height" kann nur dann korrekt ausgelesen werden, wenn
das Form sichtbar auf dem Screen ist!

Wenn das Form unsichtbar ist, liefert die Height-Eigenschaft immer den
Wert zurück, der laut Entwicklungsumgebung gesetzt drin ist.
Wenn ich dann das Form sichtbar mache, liefert die Height-Eigenschaft
den korrekten Wert zurück.

Ich hab alles mögliche versucht, aber scheinbar klappts wirklich nicht
anders. ThisForm.Draw() hilft nicht, ThisForm.Refresh() hilft nicht,
DOEVENTS reingeworfen hilft auch nicht.

Selbst wenn ich das Form zwar "sichtbar" mache, aber außerhalb des
Screens verschiebe (_SCREEN.Left = -1000) geht es nicht.

Gibts ne Möglichkeit, die Höhe des AutoSize Labels auch offscreen
korrekt zurückzukriegen? Ich will einfach nur ein hàssliches Flackern
aufm Bildschirm vermeiden...

Kleiner Testcode:

frmTest = CREATEOBJECT("TestForm")
frmTest.Show()
READ EVENTS
DEFINE CLASS TestForm AS Form
Width = 420
ADD OBJECT lblTest AS Label
PROCEDURE init
DODEFAULT()
ThisForm.lblTest.Caption = REPLICATE("Test ",50)
ThisForm.lblTest.WordWrap = .T.
ThisForm.lblTest.AutoSize = .T.
ThisForm.lblTest.Width = 400
ThisForm.lblTest.Left = 10
ThisForm.lblTest.Top = 10
MESSAGEBOX(ThisForm.lblTest.Height)
SHOW WINDOW TestForm
ThisForm.Height = ThisForm.lblTest.Height + 20
MESSAGEBOX(ThisForm.lblTest.Height)
ENDPROC
ENDDEFINE

Matthias Kahlert
[MaxPro] Software
http://www.max-pro.de
 

Lesen sie die antworten

#1 Olaf Doschke
22/10/2008 - 12:07 | Warnen spam
Hallo Matthias,

ehrlich gesagt seh ich null flackern mit Deiner
Notlösung des SHOW WINDOW im Init.

Ich kann zwar die Problematik nachvollziehen,
daß die Label Höhe sich wirklich nur àndert,
wnn die Form sichtbar und im Desktopbereich
ist, also auch Left = -420 nicht hilft.

Wenn Du's dennoch exakt haben willst, hilft
Dir evtl. Form.Textheight. Allerdings hat das
den Nachteil, daß es von der Formbreite
abhàngt und nach einem Test auch erst wieder
visuell hilft.

Eine ganz andere Variante wàre, aus der Not
eine Tugend zu machen und die Formhöhe in
einer Art Animation per Timer langsam zu
vergrößern auf die benötigte Höhe.

Oder Du nutzt GDIplus, um die nötige Höhe
zu ermitteln, dort sollte es Funktionen geben,
die solche Maße vorab berechnen können.

Sieht stark nach einem Messagebox-Ersatz aus,
was Du da vor hast. Je nachdem, ob es Dir dabei
darum geht, dieBox individuell anzupassen (dann ja)
oder darum, den modalen Charakter der Form zu
vermeiden (dann nicht), hilft folgendes:

http://www.sweetpotatosoftware.com/...3edb7.aspx
Messagebox-Example.

Tschüß, Olaf.

Ähnliche fragen