Fehler - Auslesen von Textbreite eines Strings mit GraQueryTextBox()

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
unicorn
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Di, 25. Apr 2017 17:23
Wohnort: Umgebung Stuttgart

Fehler - Auslesen von Textbreite eines Strings mit GraQueryTextBox()

Beitrag von unicorn »

Hi Leute, ich brauche eure Hilfe bevor ich durchdrehe -.-

Ich habe Daten in meiner Datenbank, die in einer Tabelle gedruckt werden sollen. Zur Überprüfung der Textbreite (ob der String in die Zelle passt),
nehme ich GraQueryTextBox. Hab die Funktion Gott sei Dank im Forum gefunden, sowas taucht in der Help-File natürlich wieder nicht auf...

Die Abprüfung in der Tabelle funktioniert auch, Breitenwert des Strings GraQueryTextBox(oPS, cText)[5][1].

Ziel ist es jetzt, über die Tabellenspalten Überschriften setzen zu lassen, und zwar mittig (automatisch) ohne Rumgefuchtel mit Pixelwerten. Das funktioniert auch fast.

Bild: http://imgur.com/a/WCIHs

Die erste Spalte wird nicht mittig betitelt, Grund scheint ein falsches, bzw. unverhältnismäßig großer Rückgabewert von GraQueryTextBox() (514px) für "Artikel / Leistung" zu sein. Im Vergleich: "Max.Preis" ist lediglich 160px breit. Die Pixelangaben beziehen sich natürlich auf Breite der Buchstaben, aber trotzdem scheint was nicht zu passen, denn die Spalte selbst ist 630 Pixel breit.

Nachfolgend mein Code, vllt fällt euch ja was ein, ich weiß nicht weiter...
Danke schonmal!

Code: Alles auswählen

PROCEDURE druckeZKtarif(oPS, aSize, oPrinter)   /////Zusatzkosten drucken
LOCAL titelabstand, sDocName, ersteseite, seite, cnt_titel, cnt_proSeite, cnt_rec, pos_rec, beschr, maxpreis, minpreis, flat, kgvon, kgbis, fixpreis, knr, width_titel
holefonts()

DECLARE Ueberschriften[8]
Ueberschriften[1] 	:= "Artikel / Leistung"
Ueberschriften[2] 	:= "Max.Preis"
Ueberschriften[3] 	:= "Min.Preis"
Ueberschriften[4] 	:= "Flat"
Ueberschriften[5] 	:= "KG-von"
Ueberschriften[6] 	:= "KG-bis"
Ueberschriften[7] 	:= "Fixpreis"
Ueberschriften[8]	    := "Knr."

DECLARE Breiten[8]
Breiten[1] := 630
Breiten[2] := 205
Breiten[3] := 205
Breiten[4] := 205
Breiten[5] := 205
Breiten[6] := 205
Breiten[7] := 205
Breiten[8] := 155


sFoot		:= "- Seite 1 -"
mLR_Rand 	:= 50
cnt_titel := 1
titelabstand := 0
cnt_proSeite := 1
cnt_rec := 1
pos_rec := mLR_Rand
ersteseite := .T.
seite := 1


mZeile := 500


IF temp_scope == 0
        info := "Allgemeine Tarifpositionen"
        sDocName := info
ELSEIF temp_scope == 1
        info	:= "Tarifpositionen " + temp_kunname
        sDocName := info
ENDIF

sDocName	:= info
oPrinter:startDoc(sDocName)




DO WHILE ! Eof()

    IF ersteseite == .T.
    
        PRINT_NUR_LOGO(oPS, aSize, oPrinter)
    
        PrintTextOnPage(oPS, mLR_Rand +150, 350, info, "" , mFontTitel3, aSize)
        
        minstart := 0
        
        Do While cnt_titel <= 8
        
            titel := ftrim(Ueberschriften[cnt_titel])
            Msgbox("Titel: '" + titel + "'")
            width_titel := GraQueryTextBox(oPS, titel)[5][1]
            ? GraQueryTextBox(oPS, titel)
            Msgbox("Breite Titel: " + Str(width_titel))
            
            textstart := (Breiten[cnt_titel] / 2) - (width_titel / 2)
            
            PrintTextOnPage(oPS, mLR_Rand + minstart + textstart, mZeile - 10, titel ,"", mFontNormalText, aSize, 45)
            
            minstart += Breiten[cnt_titel]
                
          
            cnt_titel += 1
             
        EndDo
    
    ENDIF
PS: Die Funktion ist natürlich nicht beendet, sondern nur der Teil bis zum Fehlverhalten der Funktion. Die Funktion "ftrim" ist von mir und fasst rtrim ltrim zusammen, holefonts() lädt die Fonts.
Gruß,
Jannik (das verträumte Einhorn, by Jan)
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: Fehler - Auslesen von Textbreite eines Strings mit GraQueryTextBox()

Beitrag von AUGE_OHR »

unicorn hat geschrieben: Mi, 19. Jul 2017 16:32Die Abprüfung in der Tabelle funktioniert auch, Breitenwert des Strings GraQueryTextBox(oPS, cText)[5][1].
hm ... da hast du ja nur einen Wert stehen. ist das nun der "Anfang" oder das "Ende" ...
mein Code sieht da so aus :

Code: Alles auswählen

         oPS      := ::LockPS()
         GraSetFont( oPS, oSelf:oFont )
         aBox     := GraQueryTextBox( oPS, cText )
         ::UnlockPS()
         oPS      := NIL

         // wide of Item (Text)
         //
         IF NIL <> aBox
            nTextwidth := (aBox[3][1] - aBox[1][1])
            nTextheigh := (aBox[4][1] - aBox[2][1])
         ENDIF
überprüfe doch mal ob du damit bessere Resultate bekommst.
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: Fehler - Auslesen von Textbreite eines Strings mit GraQueryTextBox()

Beitrag von brandelh »

unicorn hat geschrieben: Mi, 19. Jul 2017 16:32 Ich habe Daten in meiner Datenbank, die in einer Tabelle gedruckt werden sollen. Zur Überprüfung der Textbreite (ob der String in die Zelle passt),
nehme ich GraQueryTextBox. Hab die Funktion Gott sei Dank im Forum gefunden, sowas taucht in der Help-File natürlich wieder nicht auf...
das kann ich nicht nachvollziehen, denn wenn du in der Hilfe danach suchst wirst du die Beschreibung finden, und das schon sehr lange.

Ein Wert alleine reicht aber nicht aus, man muss wie Jimmy schrieb, 2 von einander abziehen.

Weiterhin ist die Funktion vom Presantationspace und dem eingestellten font abhängig. Ich nutze diese seit vielen Jahren in meiner HBPrinter Klasse für die Berechnung und Positionierung von Blockschriften.

Für eine zentrierte oder rechtsbündige Textausgabe ist das aber gar nicht nötig !

Man kann einfach ein Attribut festlegen und den Text (ohne oder mit gleicher Anzahl Blanks vorne und hinten) so ausgeben (Beispiel aus Hilfe von GraStringAt() ):

Code: Alles auswählen

      aAttr := ARRAY( GRA_AS_COUNT )   // Verschiedene Attribute setzen
      ...
      aAttr [ GRA_AS_HORIZALIGN ] := GRA_HALIGN_CENTER  // horizontal zentrieren !
      GraSetAttrString( oPS, aAttr ) 
       GraStringAt( oPS, {100, 100}, "GRA_HALIGN_CENTER" )
Wenn man das so macht, ist die Länge des Strings im Prinzip egal (sie könnte breiter als die Spalte sein), die Pixel muss man einfach nach der Spalte berechnen.
Gruß
Hubert
unicorn
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Di, 25. Apr 2017 17:23
Wohnort: Umgebung Stuttgart

Re: Fehler - Auslesen von Textbreite eines Strings mit GraQueryTextBox()

Beitrag von unicorn »

AUGE_OHR hat geschrieben: hm ... da hast du ja nur einen Wert stehen. ist das nun der "Anfang" oder das "Ende" ...
Im fünften Array steht, wie weit der Pen sich auf dem Presentation Space bewegt. Es entspricht also der Information die ich brauche: wie lang der String in Pixeln ist, um ihn dynamisch auf meinem PS zu bewegen.
BTW, dein Beispiel funktioniert bei mir nicht, er meldet das "SELF" nicht bekannt ist.
brandelh hat geschrieben: das kann ich nicht nachvollziehen, denn wenn du in der Hilfe danach suchst wirst du die Beschreibung finden, und das schon sehr lange.
Doch, selbst in der Hilfe der Workbench (welche ich noch immer ungern benutze), finde ich keinen Eintrag darüber...
brandelh hat geschrieben: Wenn man das so macht, ist die Länge des Strings im Prinzip egal (sie könnte breiter als die Spalte sein), die Pixel muss man einfach nach der Spalte berechnen.
Die Aussage verstehe ich nicht. Ich möchte doch das der String über die Spalte passt? Wenn ich dann so berechne das er zwingend drüber passt, ist es doch total gestaucht...
brandelh hat geschrieben: Ein Wert alleine reicht aber nicht aus, man muss wie Jimmy schrieb, 2 von einander abziehen.
Auch hier: als Ergebnis (die Abzugs-"Formel") von Jimmy benutzend: ich rechne dann 514 - 0, was exakt dem Wert im fünften Array entspricht.

Das die Funktion von PS und Font abhängt, ist mir bekannt. Dennoch bringt die Funktion erst nach dem ersten Schleifendurchlauf den richtigen Wert..

________________________________________________________________________________________________________________________________


Update: Drauf gebracht habt ihr mich mit "GraSetFont" und "GraStringAt". Die Funktion "PrintTextOnPage" beinhaltet beides um automatisch zu schreiben. Ein Parameter ist der Font, deswegen passt auch alles beim zweiten Durchlauf: PrintTextOnPage setzt den Font erst am Ende der ersten Schleife, in der zweiten ist er gesetzt und dann bringt GraQueryTextBox auch den richtigen Pixelwert. Ergo: tut jetzt *-*
Gruß,
Jannik (das verträumte Einhorn, by Jan)
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: Fehler - Auslesen von Textbreite eines Strings mit GraQueryTextBox()

Beitrag von brandelh »

unicorn hat geschrieben: Do, 20. Jul 2017 10:06
brandelh hat geschrieben: das kann ich nicht nachvollziehen, denn wenn du in der Hilfe danach suchst wirst du die Beschreibung finden, und das schon sehr lange.
Doch, selbst in der Hilfe der Workbench (welche ich noch immer ungern benutze), finde ich keinen Eintrag darüber...
OK, ich zeige es mal :-)
:arrow:
XbaseHilfe.png
XbaseHilfe.png (119.03 KiB) 4902 mal betrachtet
In der Workbench einfach F1 drücken, dann unter Funktionen ... oder Index oder direkte Suche ... war bei der 1.90 im alten Format auch schon so.
Im neuen Format musste man dort wissen wo man anfängt, insoweit ist die Hilfe aus der Workbench einfacher zu bedienen.
Gruß
Hubert
unicorn
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Di, 25. Apr 2017 17:23
Wohnort: Umgebung Stuttgart

Re: Fehler - Auslesen von Textbreite eines Strings mit GraQueryTextBox()

Beitrag von unicorn »

@brandelh

Du hast recht, geht man über den Index, findet man es. Jedoch nicht über die Suche #-o
Gruß,
Jannik (das verträumte Einhorn, by Jan)
Antworten