Memofeld drucken

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:

Memofeld drucken

Beitrag von Jan »

Ich hab ein Einstiegsproblem mit dem Ausdruck des Inhaltes eines Memofeldes. Unter Clipper hab ich das ganz damals gut hinbekommen, aber im Grafikmodus versteh ich überhaupt nicht, wo ich anfangen soll.

Ich brauch im Prinzip 2 Sachen: Erstmal muß ich feststellen, wie viele Zeilen der Ausdruck brauchen würde (um den Startpunkt auf der Seite von unten rechnen zu können), und dann muß ich das ganze Teil auch noch drucken.

Halt mal wieder ein typischen Newbie-Thema von mir 8)

Jan
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Jan,

um die Mengen der Zeilen zu erfahren, sollte MlCount() genügen. Das war doch der 1.Punkt, oder?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Beitrag von Jan »

Hallo Manfred,

leider passt das nicht. Denn das geht auf Zeichenzahl, was ich mit Proportionalschriften nicht gebrauchen kann. Ich muß das auf Zeilenlänge rechnen.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

in meiner Druckerklasse gibt es die Methode MemoPrint(), die macht genau das was du brauchst. Dort kannst du nachsehen wie man einen langen Text (Memofeld) in einen definierten Bereich drucke (Blocksatz etc. braucht dich ja erstmal nicht zu interessieren).

Es ist nicht trivial !

Grundsätzlich:

1. Wieviel Text passt in die jeweilige Zeile (Wörter wegnehmen bis es passt)
2. Wieviele solcher Zeilen wird es geben.
3. Vorschub je Zeile ... und dann mit GraStringAt()
Zuletzt geändert von brandelh am Di, 20. Nov 2007 17:25, insgesamt 2-mal geändert.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
schau Dir mal meinen Beitrag in der Wissensbasis zum Thema Blocksatz an.
Darauf kannst Du aufsetzen.
Alle Zeilen in dem Memofeld aneinanderhängen in einem String und den dann parsen und aufsplitten - immer nach einem Leerzeichen suchen; solange die Textmenge dann mittels GraQueryTextBox in eine Zeile passt, suchst Du nach dem nächsten Leerzeichen.
Sobald sie nicht mehr passt, nimmst Du den linken Teil des Textes bis zum vorherigen Leerzeichen und druckst ihn und machst mit dem Rest des Textes wie gehabt weiter...

In etwa so:

Code: Alles auswählen

text := alltrim( hvar[ ascan( hcode, coden ) ] ) + " "
textteil1 := textteil2 := textteil3 := ""
laenge := ( 100 * xboburk->varieende ) - links
aTextBox    := GraQueryTextBox( pPS, text )
nFontWidth  := aTextBox[ 3, 1 ] - aTextBox[ 2, 1 ]
if nFontWidth > laenge
	a := 0
	do while .t.
		b := at( " ", text, a + 1 )
		if b > 0
			textteil1 := left( text, b - 1 )
			aTextBox    := GraQueryTextBox( pPS, textteil1 )
			nFontWidth  := aTextBox[ 3, 1 ] - aTextBox[ 2, 1 ]
			if nFontWidth > laenge
				if a <> 0
					textteil1 := left( text, a - 1 )
					text := substr( text, a + 1 )
					exit
				endif
			else
				a := b
			endif
		elseif a <> 0
			textteil1 := left( text, a - 1 )
			text := substr( text, a + 1 )
			exit
		endif
	enddo
	if ( xboburk->variezeile > 2 ) .and. .not. empty( text )
		aTextBox    := GraQueryTextBox( pPS, text )
		nFontWidth  := aTextBox[ 3, 1 ] - aTextBox[ 2, 1 ]
		if nFontWidth <= laenge
			textteil2 := text
		else
			a := 0
			do while .t.
				b := at( " ", text, a + 1 )
				if b > 0
					textteil2 := left( text, b - 1 )
					aTextBox    := GraQueryTextBox( pPS, textteil2 )
					nFontWidth  := aTextBox[ 3, 1 ] - aTextBox[ 2, 1 ]
					if nFontWidth > laenge
						if a <> 0
							textteil2 := left( text, a - 1 )
							textteil3 := substr( text, a + 1 )
							exit
						endif
					else
						a := b
					endif
				elseif a <> 0
					textteil2 := left( text, a - 1 )
					textteil3 := substr( text, a + 1 )
					exit
				endif
			enddo
		endif
	else
		textteil2 := text
	endif
else
	textteil1 := text
endif
if .not. empty( textteil3 )
	GraStringAt( pPS, { links, unten + ( xboburk->varieschg * 11 ) }, textteil1 )
	GraStringAt( pPS, { links, unten + ( xboburk->varieschg * 5.5 ) }, textteil2 )
	GraStringAt( pPS, { links, unten }, textteil3 )
elseif .not. empty( textteil2 )
	GraStringAt( pPS, { links, unten + ( xboburk->varieschg * 5.5 ) }, textteil1 )
	GraStringAt( pPS, { links, unten }, textteil2 )
else
	GraStringAt( pPS, { links, unten }, textteil1 )
endif
Da bei mir nicht mehr als drei Zeilen möglich waren, habe ich das am Ende des Sources halt so gelöst (mit drei Variablen).
In Deinem Fall nimmst Du halt eine für die jeweilige Zeile, druckst sie dann und leerst sie wieder.

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

jaja,

ich hatte 3x gelesen, dann geschrieben, dann wieder gelöscht, dann nochmals gelesen, dann geschrieben. Dann Deine Antwort. Nochmals gelesen und dann kapiert, wie das genau war. Ich habe den Satz mit den Zeilenmenge überhaupt nicht kapiert zu Anfang, was da so schwer dran sein soll. Alles klar. :roll:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Beitrag von Jan »

Hallo Martin,

danke für die ausführliche Antwort. Hübsch aufwändig 8) Ich werd mich da gleich mal durchkämfen.

Da die Zeilenzahl bei mir grundsätzlich nicht feststeht, und da auch noch Zeilenumbrüche vorkommen, denke ich, ich werd das Zeilenweise in ein Array schreiben.

Das mit den Zeilenvorschüben ist kein Problem, da ich die Schrifthöhe kenne.

Jan
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
das mit dem Array kannst Du Dir eigentlich schenken - wie heißt es so "schön": Fire and forget!
Ermittele eine Zeile, drucke sie aus und mache mit der nächsten weiter - nach dem Drucken brauchst Du sie doch nicht mehr...

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:

Beitrag von Jan »

Hallo Martin,

da bin ich mir nicht so sicher. Wie gesagt: Ich muß erst feststellen, wie viel Platz der Ausdruck überhaupt in Anspruch nehmen würde. Um den Anfangspunkt auf der Seite zu haben, damit der Block wirklich am unteren Seitenrand endet. Deswegen muß ich erstmal rechnen, wie viele Zeilen ich brauche. Und wenn ich die dann schon mal extrahiert habe: Warum nicht in einem Array speichern, damit ich das Zeilen rechnen nicht beim wirklichen Druck noch einmal machen muß.

Außerdem lagere ich Deine Funktion aus, um die in anderen Ausdrucken auch nutzen zu können (noch brauch ich das nicht, aber wer weiß, was noch so alles kommt).

Jan
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
dann ist das natürlich was anderes!

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:

Beitrag von Jan »

Hallo Martin,

einen ganz entscheidenen Grund für das Speichern hab ich vergessen: Das ist ein Serienbrief an alle Schauteilnehmer. Und ich will das ja nicht für jedes Anschrieben neu rechnen 8)

Jan
Antworten