XbpStatic und GraQueryTextBox

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

XbpStatic und GraQueryTextBox

Beitrag von Wonderer »

Hallo,

ich versuche gerade ein Klasse für ein PopUp-Fenster zu erstellen. Dabei verwende ich folgenden Code (ausgelagert):

Code: Alles auswählen

#include "gra.ch"
#include "font.ch"
#include "appevent.ch"

procedure Main

local oWin, oPart, oFnt, oFont, cLines, nCnt, aSize, aPos, fontHeight, ;
	  winWidth, winHeight, winPadVert, winPadHoriz, winPS

	winWidth    := 50
	winHeight   := 50
	winPadVert  := 20
	winPadHoriz := 30

	msgText := "some text to show"
	title   := "any title"

	oFnt := NIL
	backColor := NIL
	fontColor := NIL

	oWin := XbpDialog():new( AppDesktop() , , { 1,1 }, { winWidth, winHeight } )
	oWin:title := title
	oWin:create()

    drawingArea:= oWin:drawingArea

    if backColor==NIL
     drawingArea:setColorBG( GRA_CLR_WHITE   )
    else
     drawingArea:SetColorBG ( backColor )
    endif

    if fontColor==NIL
     drawingArea:setColorFG ( GRA_CLR_BLACK )
    else
     drawingArea:setColorFG ( fontColor )
    endif

    SetAppWindow(oWin)

	winPS := XbpPresSpace():new()
	winPS:create( oWin:winDevice() , {850,850}, GRA_PU_PIXEL )

	if oFnt==NIL
        cFntName := oWin:setFontCompoundName()
        oFnt := GraSetFont( winPS )
    else
    	GraSetFont( winPS, oFnt )
	endif

	// Nachricht der Pop-Notiz bearbeiten bzgl.Laenge
	cLines := {}
	maxLineWidth := 0
	if valtype( msgText ) == "A"
        for nCnt:=1 to len( msgText )
         AAdd( cLines, msgText[nCnt] )
         aSize := GraQueryTextBox( winPS, msgText[nCnt] )
         if aSize[3][1] > (maxLineWidth)
            maxLineWidth := aSize[3][1]
         endif
        next
        fontHeight := aSize[1][2]
	else
		nCnt := AScan( msgText, chr(13) )
		if nCnt==0
            AAdd( cLines, msgText )
            aSize := GraQueryTextBox( winPS, msgText )
            maxLineWidth := aSize[3][1]
		else
            do while nCnt>0
                cDum := substr( msgText, 1, nCnt-1 )
                AAdd( cLines, cDum )
                aSize := GraQueryTextBox( winPS, cDum )
                if aSize[3][1] > maxLineWidth
                   maxLineWidth := aSize[3][1]
                endif
                msgText := substr( msgText, nCnt+1 )
                nCnt := AScan( msgText, chr(13) )
            enddo
        endif
        fontHeight := aSize[1][2]
	endif

    winWidth := maxLineWidth+2*winPadHoriz

	oWin:unlockPS()

	winHeight := (len( cLines )+1) * fontHeight*1.3 + 2*winPadVert

	oWin:setSize( { winWidth, winHeight } )

	oPart := oWin:setParent()

	if oPart==NIL
		oPart := AppDesktop()
	endif

	aSize := oPart:currentSize()

	oWin:setPos( { aSize[1]/2 - winWidth/2, aSize[2]/2 - winHeight/2 } )

	aPos  := oWin:currentPos()
	aSize := oWin:currentSize()

	// Nachrichten als XbpStatics in XbpDialog erstellen
	for nCnt:=1 to len( cLines )

		msgText := cLines[ len(cLines)-(nCnt-1) ]

		oPart := XbpStatic():new( drawingArea, , { winPadHoriz, winPadVert+(nCnt-1)*fontHeight }, ;
												 { maxLineWidth, fontHeight } )
		oPart:setFont( oFnt )
		oPart:caption := msgText
		oPart:create()

	next

	winPS := oWin:lockPS()

	GraSetColor( winPS, GRA_CLR_BLACK, GRA_CLR_WHITE )

	GraLine( winPS, { winPadHoriz, 1 }, { winPadHoriz, winHeight } )
	GraLine( winPS, { winPadHoriz+maxLineWidth, 1 }, { winPadHoriz+maxLineWidth, winHeight } )

	oWin:unlockPS()

	oWin:show()

	nEvent := xbe_None

	do while nEvent<>xbeP_Close

		nEvent := AppEvent( @mp1, @mp2, @oPart )

		oPart:handleEvent( nEvent, mp1,mp2 )

	enddo

return
Das Problem: die berechnete Länge/Höhe von GraQueryTextBox ist jeweils zu niedrig für die Verwendung als Angabe im Init-Aufruf vom XbpStatic.
Zur Überprüfung wollte ich zwei Linien zeichnen, aber die werden nicht im Fenster dargestellt!?

Kann jmd.bitte helfen und mir sagen was ich hier falsch mache?
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: XbpStatic und GraQueryTextBox

Beitrag von AUGE_OHR »

hi.

eine Menge Code der quer durcheinander gewürfelt wurde ;)

wenn du "nur" einen mehrzeiligen Text anzeigen willst reicht ein XbpStatic mit

Code: Alles auswählen

   oStatic:type := XBPSTATIC_TYPE_TEXT
   oStatic:options := XBPSTATIC_TEXT_WORDBREAK
   oStatic:Caption := cMulitiline
dessen Grösse du mit GraQueryTextBox() ermittetlst welches dir 4 Koordinaten Paare liefert ... die solltest du verwenden

Code: Alles auswählen

   aTxTSize := GraQueryTextBox( winPS, msgText[nCnt] )
   aSize[1] := aTxtSize[3][1]-aTxtSize[1][1]
   aSize[2] := aTxtSize[1][2]-aTxtSize[2][2]
die Font Höhe lässt sich IMHO "so" nicht setzen

Code: Alles auswählen

   fontHeight := aSize[2][2] - aSize[1][2]
damit erreichst du höchstens dass das OS() versucht einen "passenden" Font zu wählen

mit oWin := XbpDialog():new( ...) willst du wohl damit

Code: Alles auswählen

   winHeight := (len( cLines )+1) * fontHeight*1.3 + 2*winPadVert
   oWin:setSize( { winWidth, winHeight } )
erreichen das sich das Dialog Fenster anpasst ...

nun besteht das Dialog Fenster auch aus der Titlebar (OS() abhängig) , wo du mit *1.3 versucht zu korrigieren.
du meinst aber sicherlich die Fläche innerhalb -> DrawingArea

Code: Alles auswählen

   winHeight := (len( cLines )+1) * fontHeight ) + 2*winPadVert
   oWin:ClientSize( { winWidth, winHeight } )
   oWin:Configure()
Es gibt den Befehlt CenterControl() mit dem du das

Code: Alles auswählen

   oWin:setPos( { aSize[1]/2 - winWidth/2, aSize[2]/2 - winHeight/2 } )
ersetzten kannst.

zuerst dachte ich du willst ein "scrollbares" XbpStatic machen ...

Code: Alles auswählen

// Nachrichten als XbpStatics in XbpDialog erstellen
for nCnt:=1 to len( cLines )
was du da machst ist nun ein XbpStatic für jede Zeile ... warum ?


die GRA Function sind zum "malen" und benötigen einen Presspace.
wenn du also mit den GRA Functionen was "malen" willst wäre hier GraStringAt() angesagt.

du kannst den MicroPS, welche jedes XbPart ( XbpWindow():lockPS() ) hat, benutzen oder XbpPresspace()
den XbpPresspace() kannst du mit o:Windevice dazu nutzen um z.b. zwischen Bildschirm und Drucker umzuschalten.

nun hat das "malen" im Presspace gegenüber o:Caption einen Nachteil : er reagiert nicht auf einen WM_PAINT Event

wenn das Fenster überlagert wird würde es "abgeschnitten" angezeigt. Es ist deshalb notwendig der o:Paint Callback Slot
zum "malen" zu nutzen"

Code: Alles auswählen

   oStatic:paint := {| aRect, uNIL, oSelf | RePaint(oSelf,oFont,aText,aSize) }
---


Zuammenfassung :

Code: Alles auswählen

   oStatic := XbpStatic():new( oWin:drawingArea,, {0,0}, {100,100},aPP )
   oStatic:type    := XBPSTATIC_TYPE_TEXT
   IF nDemo = 1
      oStatic:options := XBPSTATIC_TEXT_WORDBREAK
      oStatic:Caption := msgText
   ELSEIF nDemo = 2
      // wenn es nicht als o:Caption gesetzt ist erfolgt kein automatisches Repaint !
      // deshalb den o:Paint Callback Slot überschreiben mit eigener Methode/Function
      //
      oStatic:paint := {| aRect, uNIL, oSelf | RePaint(oSelf,oFont,aText,aSize) }
   ENDIF
   oStatic:create()
Caption_vs_Paint.jpg
Caption_vs_Paint.jpg (40.82 KiB) 6588 mal betrachtet
GRAQ2.ZIP
Source
(2.74 KiB) 250-mal heruntergeladen
p.s. bei langen Texten würde ich ein XbpMLE() nehmen und oMLE:Editable := .F.
mit oMLE:Format := 3 kannst du auch einen "formatierten" RTF String nehmen und anzeigen lassen ;)
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpStatic und GraQueryTextBox

Beitrag von brandelh »

Die Font Höhe wird in Points angegeben (1/72 Zoll), GraQueryTextBox() hingegen ermittelt den benötigten Platz in Pixel (dpi).
Gruß
Hubert
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: XbpStatic und GraQueryTextBox

Beitrag von Wonderer »

Danke für die Erläuterungen. Ich habe die Berechnung für den String jetzt angepasst und sicherheitshalber auch mal mit für die Breite.
Wer kommt schon auf die Idee, dass es nicht bei 0,0 los geht wenn man keine Position angibt im FunktionsAufruf :)

Mein abgeändertes Programm malt mir aber immer noch keine Linien am Start und Endpunkt des Strings.
Bitte bei Gelegenheit nochmal drüber schauen, weil soweit ich das Handbuch bzgl. GraLine richtig verstanden habe müsste das so funktionieren!?

Man darf doch in einem XbpDialog automatisches Zeichnen von XbpStatic(s) gleichzeitig verwenden mit eigenen Mal-Operationen?

Code: Alles auswählen

winPS := oWin:lockPS()

	GraSetColor( winPS, GRA_CLR_BLACK, GRA_CLR_WHITE )

	GraLine( winPS, { winPadHoriz, 1 }, { winPadHoriz, winHeight } )
	GraLine( winPS, { winPadHoriz+maxLineWidth+1, 1 }, { winPadHoriz+maxLineWidth+1, winHeight } )

oWin:unlockPS()
Achja, +1 hilft bei mir hier mit der Längen-Angabe des XbpStatics damit '...' nicht dargestellt wird.

Ich sende die PRG einfach mal mit damit es keine Verwirrung gibt...

@Hubert

fontHeight enthält als Variable die Pixel-Höhe für die Berechnung der Position(en) - nicht nominalPointSize...

EDIT:

fontHeight*1.2 -> anpassen der XbpDialog-Höhe entsprechend der Anzahl der Zeilen + Zwischenräume (10% der Font-Höhe nach oben und unten)
Dateianhänge
winStatPos.prg
keine vertikalen Linien an Start/Endposition
(2.3 KiB) 208-mal heruntergeladen
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: XbpStatic und GraQueryTextBox

Beitrag von Wonderer »

Achso, warum Array und mehrere XbpStatics:

In dem Fenster sollen auch verschiedene Font-Farben möglich sein. Geplant ist in der Klasse, dass man ein mehrdimensionales Array übergibt bzw.übergeben kann.
Index 1 ist der String und danach folgen PP-Werte, oder erst einmal lediglich eine Farbe :)
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: XbpStatic und GraQueryTextBox

Beitrag von Tom »

Dass keine Linien gezeichnet werden, kann auch schlicht daran liegen, dass keine Linienattribute gesetzt wurden. oPs:SetColor() und ähnliche wirken sich da nämlich nicht aus. :wink:
Herzlich,
Tom
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: XbpStatic und GraQueryTextBox

Beitrag von Wonderer »

ich habe jetzt folgende Zeilen geändert am Ende der Main-Methode - was aber auch keine Linien zeichnet:

Code: Alles auswählen

winPS := oWin:lockPS()

aAttr := GraSetAttrLine( winPS )
aAttr[ GRA_AL_TYPE ] := GRA_LINETYPE_SOLID
aAttr[ GRA_AL_COLOR ] := GRA_CLR_BLACK
aAttr[ GRA_AL_WIDTH ] := GRA_LINEWIDTH_NORMAL
aAttr[ GRA_AL_MIXMODE ] := GRA_FGMIX_OVERPAINT

GraSetAttrLIne( winPS, aAttr )

GraLine( winPS, { winPadHoriz, 1 }, { winPadHoriz, winHeight } )
GraLine( winPS, { winPadHoriz+maxLineWidth+1, 1 }, { winPadHoriz+maxLineWidth+1, winHeight } )

oWin:unlockPS()
Jetzt sind alle Werte gesetzt mit GraSetAttrLine, aber die erwarteten schwarzen Linien bleiben aus!?
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: XbpStatic und GraQueryTextBox

Beitrag von Wonderer »

Also irgendwie bekomme ich immer noch nicht die richtigen Längen berechnet für einen gegebenen Text.

folgendes Programm habe ich zum Testen mit einer ausgelagerten Funktion:

Code: Alles auswählen

#include "font.ch"
#include "appevent.ch"

procedure Main
	// Ziel ist Zentrierung der laengsten Zeile im XbpDialog
	showWindow( 1, { "Das ist Text zum anzeigen in einem", "Fenster..." } )
        showWindow( 2, { "Das ist Text zum anzeigen in einem", "Fenster..." } )
return

procedure AppSys()
return

procedure showWindow( method, text, schrift )

local oDlg, drawingArea, winPS, oFnt, nEvent, mp1, mp2, ;
      posX, posY, randX, randY, nZaehl, oXbp, aSize, textBreite

randX := 10
randY := 20

oDlg := XbpDialog():new( nil, nil, {100, 100}, {650, 400}, , .F.)

oDlg:taskList := .F.
oDlg:close           :={|| nEvent := xbeP_Close }
oDlg:create()

drawingArea:=oDlg:drawingArea

if schrift#NIL
 drawingArea:setFontCompoundName( schrift )
else
 drawingArea:setFontCompoundName (FONT_HELV_SMALL+ FONT_STYLE_BOLD)
endif


// Presentation-Space des Fensters anfordern und Schrift setzen
winPS := oDlg:lockPS()
/* Methode 1 - kein GraSetFont in Erwartung Schrift ist schon mit Presentation-Space verknuepft
// -> Berechnung der Laenge des Textes nicht korrekt
// ( selbst mit +1Pixel XbpStatic zu kurz zum Darstellen )
*/

// ELSE Methode 2 - Font ermitteln fuer 'GraSetFont'
// -> Berechnung der Laenge des Textes nicht korrekt
// ( selbst mit -10Pixel fuer Size-X ist Text noch sichtbar im XbpStatic )
if method==2
  oFnt  := XbpFont():new( winPS )
  oFnt:compoundName := drawingArea:setFontCompoundName()
  oFnt:create()
  GraSetFont( winPS, oFnt )
endif

fontHoehe := 0

posX := randX
posY := randY
aSize := { 0, 0 }
textBreite := 0

for nZaehl:=1 to len(text)
  // Groesse des Textes ermitteln
  textRahmen := GraQueryTextBox( winPS, text[len(text)-(nZaehl-1)] )
  aSize[1] := textRahmen[3][1]- textRahmen[1][1]       // X rechte obere Ecke minus X linke obere Ecke
  aSize[2] := textRahmen[1][2] - textRahmen[2][2]      // Y linke obere Ecke minus Y linke untere Ecke
  fontHoehe:= aSize[2]
  // Text-Objekt erstellen
  oXbp := XbpStatic():new( drawingArea, , { posX, posY }, { aSize[1]+1, aSize[2] } )
  oXbp:caption := text[len(text)-(nZaehl-1)]

 // laengste Textzeile merken
 if aSize[1]>textBreite
 	textBreite := aSize[1]
 endif
 oXbp:create()
 // naechste Y-Position setzen
 posY += fontHoehe*1.15			// 15Prozent der FontHoehe als Zwischenraum zwischen Zeilen

next

aSize[1] := textBreite + randX*2
aSize[2] := randY*2 + len(text)*fontHoehe*1.15 + 13

oDlg:setSize( aSize )

oDlg:show()

SetAppWindow( oDlg )
SetAppFocus( oDlg )

nEvent := xbe_None

do while nEvent <> xbeP_Close

 nEvent := AppEvent( @mp1, @mp2, @oXbp )

 if nEvent==xbeP_Keyboard
  if mp1=xbeK_ESC
   PostAppEvent( xbeP_Close, nil, nil, oDlg )
   loop
  endif
 endif

 oXbp:handleEvent( nEvent, mp1, mp2 )

enddo

return
wenn ich 'GraSetFont' nicht verwende und darauf vertraue, dass der Presentation-Space der zurueckgegeben wird bereits den gesetzten Font enthält (über drawingArea:setFontCompoundName) dann ist die zurückgelieferte Länge von 'GraQueryTextBox' zu kurz zum Verwenden als Size-X im XbpStatic.

Wenn ich das Font-Objekt erstelle und 'compoundName' festlege und 'GraSetFont' damit aufrufe - dann ist der berechnete Wert zum Verwenden im XbpStatic():new zu lang - das Setzen der Breite des Fensters zum Zentrieren des Textes funktioniert so nicht.

XBPSTATIC_TEXT_CENTER möchte ich diesem Fall nicht verwenden als Workaround weil es sein kann, dass es einen Offset links gibt wenn ein Icon davorgesetzt wird.

Wie bekomme ich nun die richtigen Längen ermittelt mit 'GraQueryTextBox' ?

Vielleicht hat jmd.ein paar Minuten Zeit und kann das Programm mal testen und mir sagen wie ich das ohne die XbpStaticOptionCenter anstelle :?:
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: XbpStatic und GraQueryTextBox

Beitrag von AUGE_OHR »

Wonderer hat geschrieben:Also irgendwie bekomme ich immer noch nicht die richtigen Längen berechnet für einen gegebenen Text.

folgendes Programm habe ich zum Testen mit einer ausgelagerten Funktion:

Code: Alles auswählen

// Presentation-Space des Fensters anfordern und Schrift setzen
winPS := oDlg:lockPS()
falscher Presspace (und :unLock() fehlt) was ich schon zu deinem ersten Beispiel sagte.
siehe dir doch mal mein "buntes" Beispiel an wie du in den "richtigen" Presspace malst.
gruss by OHR
Jimmy
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: XbpStatic und GraQueryTextBox

Beitrag von Wonderer »

Danke, habe jetzt die Rückgabe des PS über das jeweilige XbpPart umgesetzt und die Längen passen soweit..

aber verstanden habe ich es noch nicht..

wieso sollten die berechneten Maße bei einem XbpDialog anders sein als bei einem XbpStatic wenn ich mit mit GraSetFont bei den jeweiligen PS die gleiche Schrift einsetze?

Auch verstehe ich nicht den Unterschied zwischen folgenden beiden :arrow:

Code: Alles auswählen

// Methode 1 fuer PS 
winPS := XbpPresSpace():new()
winPS:create( oDlg:winDevice(), { breite, hoehe }, GRA_PU_PIXEL )

// Methode 2 fuer PS
winPS := oDlg:lockPS()
ist bei Methode 2 als Standard-Rückgabe vom XbpDialog ein anderes Setting eingestellt als 'GRA_PU_PIXEL' und deswegen scheinen die Längen falsch :?:

Verstehe ich nicht, da ich es jetzt so mache und es funktioniert:

Code: Alles auswählen

oPart := XbpStatic():new( ... )
...
oPart:create()

winPS := oPart:lockPS()
GraSetFont( winPS, oFnt )
Für das Static-Textfeld habe ich keinen Font gesetzt. Das heißt es holt sich den CompoundName von einem Parent was dann die DrawingArea von XbpDialog wäre.
Dann müsste so wie ich das verstehe ja auch ein 'XbpDialog:lockPS' einen PS zurückliefern der die gleichen Längen berechnet?!? :confused1:

ich spendier mal ne Runde... :coffee:
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: XbpStatic und GraQueryTextBox

Beitrag von AUGE_OHR »

Wonderer hat geschrieben:Danke, habe jetzt die Rückgabe des PS über das jeweilige XbpPart umgesetzt und die Längen passen soweit..

aber verstanden habe ich es noch nicht..

Code: Alles auswählen

// Methode 1 fuer PS 
winPS := XbpPresSpace():new()
winPS:create( oDlg:winDevice(), { breite, hoehe }, GRA_PU_PIXEL )

// Methode 2 fuer PS
winPS := oDlg:lockPS()
...
Dann müsste so wie ich das verstehe ja auch ein 'XbpDialog:lockPS' einen PS zurückliefern der die gleichen Längen berechnet?!? :confused1:
ich versuche es mit diesem Beispiel :
stell dir ein "Pin"-Board vor wo einzelne kleine Zettel hängen

ein XbpDialog() wäre der "Rahmen" und die DrawingArea ( = XbpIWindow() ) das "Pin"-Board.
auf dem "Pin"-Board hast du nun deine kleinen Zettel = XbParts auf den du malen/schreiben kannst.

jedes XbPart hat XbpWindow() als SuperClass -> LockPS -> "MircoPS" ... das ist der Bereich des Control wo du malen/schreiben kannst.

---

einen "vollen" Presspace, zusammen mit o:winDevice(), wird gewöhnlich beim drucken mit GRA Befehlen verwendet.
bezogen auf das "Pin"-Board wäre es eben ein DIN A4 Zettel "mit viel Platz" zum malen/schreiben

---

wenn ich deinen Code so sehe frage ich mich was passiert wenn das Fenster durch ein anderes verdeckt wird ... :-"
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XbpStatic und GraQueryTextBox

Beitrag von georg »

Noch ein paar Gedanken - nicht alle Xbase-Parts "erben" immer zwangsläufig. Ich habe mit Deinem Beispiel (weiter oben) mal gespielt, und mir fiel auf, dass die Text-Ausgabe in FETT war. GraQueryTextBox() operiert aber nur mit einem reinen String, ohne Attribute.

WENN (wohlgemerkt, wenn) das Xbase-Part, von dem Du den PresentationSpace verwendest, zu diesem Zeitpunkt "nur" den Standardfont drauf hat, hast Du hier schon einen möglichen Grund für eine Abweichung: ein nicht-fetter String braucht weniger Breite als ein fetter String.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten