Zeilenumbrüche

Von Ausgaben mit der Gra-Engine über Generatoren bis zum Export in diversen Formaten

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Zeilenumbrüche

Beitrag von Jan »

Wenn ich einen Text drucken möchte der länger ist als der zur Verfügung stehende Platz in einer Zeile, dann kann ich den ja umbrechen. Aber leider nur gerechnet nach Buchstaben.

Geht das auch nach gemessener Länge des Textes? Hat einer von Euch sowas schon mal gemacht? Immerhin arbeiten wir unter Windows ja meist mit Roportionalschriften, da ist das unter Clipper mit den Memo-Funktionen eingeführte Zählen der Buchstaben bei Nichtproportionalschriften nicht mehr ganz Stand der Technik. Denke ich mal.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Zeilenumbrüche

Beitrag von Martin Altmann »

Hallo Jan,
noa kloar:
Alle Buchstaben abschneiden, die den Text zu lang machen:

Code: Alles auswählen

cTxt := alltrim( hundenamen )
aTextBox    := GraQueryTextBox( oPS, cTxt )
nFontWidth  := aTextBox[ 3, 1 ] - aTextBox[ 2, 1 ]
do while nFontWidth > 680
	cTxt := left( cTxt, len( cTxt ) - 1 )
	aTextBox    := GraQueryTextBox( oPS, cTxt )
	nFontWidth  := aTextBox[ 3, 1 ] - aTextBox[ 2, 1 ]
enddo
GraStringAt( oPS, { 250, nY }, cTxt )
Text ordentlich an einer maximalen Koordinate umbrechen in mehrere Zeilen:

Code: Alles auswählen

aTextBox    := GraQueryTextBox( oPS, cTxt )
nFontWidth  := aTextBox[ 3, 1 ] - aTextBox[ 2, 1 ]
do while nFontWidth > 1750
	t1 := 0
	do while .t.
		t2 := at( " ", cTxt, t1 + 1 )
		if t2 > 1
			cTxt1 := left( cTxt, t2 - 1 )
			aTextBox    := GraQueryTextBox( oPS, cTxt1 )
			nFontWidth  := aTextBox[ 3, 1 ] - aTextBox[ 2, 1 ]
			if nFontWidth > 1750
				if t1 <> 0
					GraStringAt( oPS, { 200, nY }, left( cTxt, t1 - 1 ) )
					cTxt := substr( cTxt, t1 + 1 )
				else
					GraStringAt( oPS, { 200, nY }, left( cTxt, t2 - 1 ) )
					cTxt := substr( cTxt, t2 + 1 )
				endif
				t1 := 0
				nY -= ( nFontHeight + 2 )
				zeile ++
				aTextBox    := GraQueryTextBox( oPS, cTxt )
				nFontWidth  := aTextBox[ 3, 1 ] - aTextBox[ 2, 1 ]
				exit
			else
				t1 := t2
			endif
		else
			aTextBox    := GraQueryTextBox( oPS, cTxt )
			nFontWidth  := aTextBox[ 3, 1 ] - aTextBox[ 2, 1 ]
			if ( nFontWidth > 1750 ) .and. ( t1 <> 0 )
				GraStringAt( oPS, { 200, nY }, left( cTxt, t1 - 1 ) )
				cTxt := substr( cTxt, t1 + 1 )
				nY -= ( nFontHeight + 2 )
				zeile ++
			endif
			GraStringAt( oPS, { 200, nY }, cTxt )
			nY -= ( nFontHeight + 2 )
			zeile ++
			cTxt := ""
			aTextBox    := GraQueryTextBox( oPS, cTxt )
			nFontWidth  := aTextBox[ 3, 1 ] - aTextBox[ 2, 1 ]
			exit
		endif
	enddo
enddo
if .not. empty( cTxt )
	GraStringAt( oPS, { 200, nY }, cTxt )
	nY -= ( nFontHeight + 2 )
	zeile ++
	cTxt := ""
endif
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Zeilenumbrüche

Beitrag von Jan »

Moin Martin,

joh hey. Danke für den ganzen Code, das macht es natürlich noch wesentlich einfacher für mich. Wer mich da mal nachher reingraben.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Zeilenumbrüche

Beitrag von brandelh »

Hi,

in meiner Druckerklasse gibt es die Methode PrintMemo(), die bricht nicht nur um, sondern kann z.B. auch Blocksatz drucken.
Da der Quellcode offen ist, kannst du dir das da ja ansehen ;-)
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Zeilenumbrüche

Beitrag von Martin Altmann »

Yup - zum Thema Blocksatz habe ich was in der Wissensbasis veröffentlicht - das kann man natürlich mit dem kombinieren, was ich oben gepostet habe :D

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
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: Zeilenumbrüche

Beitrag von brandelh »

Hallo Martin,

wenn ich das recht sehe schreibst du diese Routine bei jeder Ausgabe neu ?

Das wäre mir zu mühsam. Ich habe das daher in meine Druckerklasse gepackt - und vergessen ...
an deiner Stelle würde ich dies zumindest in eine Funktion auslagern.
Die kann man dann immer aufrufen und kümmert sich intern um alles.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Zeilenumbrüche

Beitrag von Martin Altmann »

Hallo Hubert,
könnte man machen - ist richtig!
Aber Blocksatz brauche ich bei mir eh' nur an einer Stelle.
Und das mit dem Abschneiden an sehr wenigen - ist mit der Zeit gewachsen, da lohnt sich das nachträgliche ummodeln (noch) nicht - ausserdem bin ich grundsätzlich faul 8)

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Antworten