Memofeld drucken
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Memofeld drucken
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
Jan
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
Jan
- Manfred
- Foren-Administrator
- Beiträge: 21214
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Jan,
um die Mengen der Zeilen zu erfahren, sollte MlCount() genügen. Das war doch der 1.Punkt, oder?
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!!
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!!
- brandelh
- Foren-Moderator
- Beiträge: 15699
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 69 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
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()
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
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16542
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 114 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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:
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
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
In Deinem Fall nimmst Du halt eine für die jeweilige Zeile, druckst sie dann und leerst sie wieder.
Viele Grüße,
Martin
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.
- Manfred
- Foren-Administrator
- Beiträge: 21214
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
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.
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.
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!!
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!!
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Hallo Martin,
danke für die ausführliche Antwort. Hübsch aufwändig 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
danke für die ausführliche Antwort. Hübsch aufwändig 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
- Martin Altmann
- Foren-Administrator
- Beiträge: 16542
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 114 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
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
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
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.
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
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
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
- Martin Altmann
- Foren-Administrator
- Beiträge: 16542
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 114 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Jan,
dann ist das natürlich was anderes!
Viele Grüße,
Martin
dann ist das natürlich was anderes!
Viele Grüße,
Martin
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.