Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Druck-Vorschau mit Printer-Canvas

108 views
Skip to first unread message

Michael Dahm

unread,
Aug 14, 2000, 3:00:00 AM8/14/00
to
Hallo zusammen,

ich hab die QR-faxen dicke. Auch wenn so mancher Report damit prima läuft
:-)
Jetzt muß ich eine Ausdruck erstellen der extrem unterschiedlich lange
Datensätze (dank Textfeldern) beinhaltet. Ich möchte es jetzt mal mit der
direkten "Bemalung" des Printer-Canvas versuchen. Soweit eigentlich nur 'ne
Fleißarbeit.

Was mir im Vorfeld noch Kopfzerbrechen bereitet ist die Möglichkeit einer
schicken Vorschau. Wenigstens das war bei QR kein Problem.

Wie realisiere ich die Vorschau an einfachsten? Mir schwebt da sowas wie
kopieren und verkleinern des fertigen Printer-Canvas vor. Das geht aber
sicher auch eleganter -oder?

Wenn's doch sein muß stellt sich mir die Frage nach 'ner vernünftigen
Verkleinerungsroutine. Bei einer ganz linearen Verkleinerung befürchte ich,
daß einfache Linien völlig verschwinden. Hat hier vielleicht jemand
Erfahrung gemacht mit einer guten Verkleinerungsmethode gemacht (oder gibt's
das Problem nachher gar nicht?)

Oder gibt's irgendwo 'ne Komponente die mir da viel Fußarbeit abnimmt?

Dankschön
Michael Dahm


Ingo von Aspern

unread,
Aug 14, 2000, 3:00:00 AM8/14/00
to

Michael Dahm schrieb:

Vielleicht sollte man sich einfach nach einem besseren Berichtsgenerator
umsehen! Da muss man halt einmal investieren.
QR ist langsam nicht mehr up to date. Wenn man allerdings eine Druckmöglichkeit
sucht für Drucke ohne Datenbank ist QR wieder gut brauchbar.
M.f.G. Ingo

PS.: Ich möchte allen, die hier öfter Probleme einkippen einmal ans Herz legen,
sich vielleicht auch einmal ein Buch zu Delphi zu kaufen! Z.B. das Delphi-
Kochbuch (Hanser) oder Delphi x in Team von C&L

Michael Dahm

unread,
Aug 14, 2000, 3:00:00 AM8/14/00
to
> Vielleicht sollte man sich einfach nach einem besseren Berichtsgenerator
> umsehen! Da muss man halt einmal investieren.

Danke für deine ausgesprochen hilfreiche Antwort. Allerdings gilt auch hier:
wer lesen kann ist schwer im Vorteil!

Austeilen kannst Du - jetzt versuchs mal mit einstecken:

Erstens:
Ich habe explizit nach einer Komponente gefragt - oder? Das die kosten kann
weiß ich selber. Hab ich auch kein Problem mit. Allerdings gibt's auch
ziemlichen Schund. Also - wenn Du ne Komponentensammlung zu diesem
Themenkreis GUT kennst, dann könntest DU mir vielleicht eine empfehlen-
vielleicht sogar ein kurzes Feedback über die Stärken dieser Sammlung Deiner
Meinung nach geben.
Im übrigen komme ich gerade von einer Surftour zu Reporting-Tools zurück.
Meine Frage nach einer guten Sammlung bleibt bestehen.
Und bevor ich eine Ewigkeit mit rumprobieren mit div. Sammlungen verbringe
versuche ich das bischen was ich jetzt brauche lieber gleich selber zu
schreiben.

Aber ich gestehe Dir zu: rumzusülzen ist viel leichter als Antworten.

Zweitens:
Dein PS ist schon in bisser'l daneben. Wo unterscheidest Du zwischen Fragen
innerhalb der NG und "Probleme reinkippen". Bloß weil ich nicht an jedes
Posting das für meinen Begriff ausreichend geklärt ist noch meinen Kommentar
anhänge heißt das nicht das ich die NG nur als Platz zur Kompetenzausbeutung
betrachte.
Ach ja - wenn ich Zeit hab lern ich auch mal lesen, kauf mir mal ein Buch
und frag Dich nicht mehr ob Du mir was triviales erklärst.

So - vielleicht können wir jetzt in Zukunft zu einem vernünftigen Umgangston
zurückfinden. Wenn nicht, versenk mich in Deinem Killfile, auf Antworten
dieser Art kann ich gut verzichten.

mfg
Michael Dahm


Ralf Mimoun

unread,
Aug 14, 2000, 3:00:00 AM8/14/00
to
Moin!

"Michael Dahm" <technik...@myokay.net> schrieb im Newsbeitrag
news:8n9j3c$2ipr$1...@news.okay.net...


> > Vielleicht sollte man sich einfach nach einem besseren Berichtsgenerator
> > umsehen! Da muss man halt einmal investieren.
>
> Danke für deine ausgesprochen hilfreiche Antwort. Allerdings gilt auch
hier:
> wer lesen kann ist schwer im Vorteil!
>
> Austeilen kannst Du - jetzt versuchs mal mit einstecken:

Hier etwas Johanniskraut. In heißem Wasser ein paar Minuten ziehen lassen
und die Suppe dann trinken. Ingo hat nicht ausgeteilt, so einfach ist das.

> Erstens:
> Ich habe explizit nach einer Komponente gefragt - oder? Das die kosten
kann

90% Deines Postings gingen über das Selbermalen von Reports.

> weiß ich selber. Hab ich auch kein Problem mit. Allerdings gibt's auch
> ziemlichen Schund. Also - wenn Du ne Komponentensammlung zu diesem
> Themenkreis GUT kennst, dann könntest DU mir vielleicht eine empfehlen-
> vielleicht sogar ein kurzes Feedback über die Stärken dieser Sammlung
Deiner
> Meinung nach geben.

dejha ist Dein Freund, d.h. wenn Du Dich eine Minute hier umgesehen hättest,
könntest Du einige Meinungen mitbekommen haben. In Kurzform:

- alles ist besser als QR. Sogar Heuschnupfen
- FastReport in einer älteren und freien Version ist ganz brauchbar
- mit ReportPrinter Pro bist Du auf der absolut sicheren Seite

> Im übrigen komme ich gerade von einer Surftour zu Reporting-Tools zurück.
> Meine Frage nach einer guten Sammlung bleibt bestehen.
> Und bevor ich eine Ewigkeit mit rumprobieren mit div. Sammlungen verbringe
> versuche ich das bischen was ich jetzt brauche lieber gleich selber zu
> schreiben.

Ich mißbrauch gern Word für eiunfache Reports.

Zum Rest: beruhig Dich bitte, ist ja nicht zum Aushalten. Der Rat zum Buch
ist immer angebracht.

Bye, Ralf

Karl Jenz

unread,
Aug 14, 2000, 3:00:00 AM8/14/00
to
Michael Dahm schrieb:

> Ich habe explizit nach einer Komponente gefragt - oder?

Hallo Michael,
bei _torry_ habe ich sowas in der Art schon gesehen als Freeware.
Habe das vermutlich irgendwo auf meiner Maschine. Aber ehrlich
gesagt, man muss sich erst etwas zurechtfinden in der Logik
dieser Freeware und diese sehr wahrscheinlich an eigene
Bedürfnisse anpassen. Vielleicht solltest du mal bei torry
vorbeischauen.

--
Mfg Karl Jenz
http://members.aol.com/karljenz/welcome.html

Michael Dahm

unread,
Aug 14, 2000, 3:00:00 AM8/14/00
to
> Hier etwas Johanniskraut. In heißem Wasser ein paar Minuten ziehen lassen
> und die Suppe dann trinken. Ingo hat nicht ausgeteilt, so einfach ist das.

Okay - okay, ich weiß auch nicht warum mich Ingo so auf die Palme bringt,
aber ich habe den Namen die letzte Zeit einfach zu oft mit ziemlich miesen
Antworten gelesen. War wohl wirklich etwas heftig reagiert. Fairerweise muß
ich Ihm den Fäkalausrutscher in einem hiesigen Thread doch eher zu Gute
Halten. Der war nicht ganz unangebracht.

> dejha ist Dein Freund, d.h. wenn Du Dich eine Minute hier umgesehen
hättest,
> könntest Du einige Meinungen mitbekommen haben. In Kurzform:
>
> - alles ist besser als QR. Sogar Heuschnupfen
> - FastReport in einer älteren und freien Version ist ganz brauchbar
> - mit ReportPrinter Pro bist Du auf der absolut sicheren Seite

Prima, Heuschnupfen wollt ich schon immer mal.
Im Ernst, ich muß zu meiner Schande gestehen, daß ich mit deja nicht so
glücklich bin, in Folge dessen nutze ich Ihn nur extensiv.

> Ich mißbrauch gern Word für eiunfache Reports.

Gut, mach ich mit Pseudo-Serienbriefen auch, ist mir aber für diese Lösung
zu umständlich. Ich muß das Ding nachher auf Maschinen aufspielen die unter
Word zusammenbrechen (So was gibt's noch!!!).

> Zum Rest: beruhig Dich bitte, ist ja nicht zum Aushalten. Der Rat zum Buch
> ist immer angebracht.

Gut - da hast Du recht. In genau diesem Sinne erlaube ich mir Ingo zu gutem
Benehmen zu raten (nur so, so was ist schließlich auch nie verkehrt) ;-)

Aber Schwamm drüber - jeder hat so seine Aussetzer.
Dank Dir für den Tip zu Report-Printer-Pro. Ich geh jetzt mal auf die Such
nach dem Ding, vielleicht kannst Du mir aber auch die URL geben.

Ciao
Michel Dahm

P.S.: Ich finde Deine Reaktion ausgesprochen gelungen. Ich konnte gar nicht
anders als lachen. Schön, daß man auch mit Humor und ohne Zerriss parat
kommt. Danke dafür.

Volker Berninger

unread,
Aug 14, 2000, 3:00:00 AM8/14/00
to
>Wie realisiere ich die Vorschau an einfachsten? Mir schwebt da sowas wie
>kopieren und verkleinern des fertigen Printer-Canvas vor. Das geht aber
>sicher auch eleganter -oder?
>
>Wenn's doch sein muß stellt sich mir die Frage nach 'ner vernünftigen
>Verkleinerungsroutine. Bei einer ganz linearen Verkleinerung befürchte ich,
>daß einfache Linien völlig verschwinden. Hat hier vielleicht jemand
>Erfahrung gemacht mit einer guten Verkleinerungsmethode gemacht (oder gibt's
>das Problem nachher gar nicht?)

Also ich habe das Ganze nach folgender Methode "von Hand"
programmiert:

Den komplette Mal-/Druckvorgang lege ich in eine eigene Prozedur, der
ich einen Canvas als Parameter übergebe, nämlich Printer.Canvas oder
einen Paintbox.Canvas (Druckvorschau).

Die Paintbox erhält dasselbe Breiten/Höhenverhältnis wie
Printer.Canvas und wird auf Bildschirmgröße heruntergerechnet.
Die Druckausgaberoutinen werden ggf. auf die Relativgröße der Paintbox
(i.d.R. Verkleinerung) heruntergerechnet.

Steuerungsknöpfe erlauben es, die Paintbox zu vergrößern (200%, 400%
etc), die Ausgaben werden dementsprechend angepasst.

Die Paintbox der Druckvorschau lege ich in eine Scrollbox, wenn sie
deren Ausmasse überschreitet, kann man automatisch darin scrollen.

Das Malen innerhalb der Paintbox erledige ich über ein
OnPaint-Ereignis (das wiederum auf die Ursprungs-Zeichenroutine
zugreifen muss). Das macht natürlich nur Sinn, wenn das Malen ohne
zeitraubende Berechnungen erfolgt.

Du könntest zwar statt einer Paintbox auch ein Image (Bitmap) anlegen,
bei einer Vergrößerung hättest Du dann aber sofort ein
Resourcenproblem.

Ich gebe zu, dass diese Methode mit viel Fleissarbeit verbunden ist,
aber dafür hat man wenigstens die Kontrolle über das, was geschieht
und kann die Routine aussdem noch für anderen Zwecke missbrauchen
(z.B. Ausgabe in eine Bitmapdatei).

Hoffe geholfen zu haben
Volker

Michael Dahm

unread,
Aug 15, 2000, 2:16:05 AM8/15/00
to
Dank Dir Volker

Ich hab die ganze Zeit in die falsche Richtung gedacht. (Übernahme des
Druckerbildes vor der Ausgabe oder ähnliches)
Natürlich ist es naheliegend, einfach einen Canvas als Zeichenfläche zu
übergeben. Nein nicht naheliegend - das ist einfach genial.

Ich werd mal damit rumprobieren.

Nochmals Dankeschön.
Michael Dahm

Hans Lesmeister

unread,
Aug 15, 2000, 3:00:00 AM8/15/00
to
>Das Malen innerhalb der Paintbox erledige ich über ein
>OnPaint-Ereignis (das wiederum auf die Ursprungs-Zeichenroutine
>zugreifen muss). Das macht natürlich nur Sinn, wenn das Malen ohne
>zeitraubende Berechnungen erfolgt.

Ich bin auch gerade mit diesem Thema beschäftigt. Wie machst Du das
denn wenn Du sagen wir mal eine Liste druckst aus einer Datenbank:

with Query do begin
while not Eof do begin
.... ( Zeile malen )
Next
end;
end;

Wenn die Paintbox einen WM_Paint geschickt bekommt, weiß Du nicht wie
weit Du in der Query zurückrollen muß um das gleiche Resultat auf der
Seite zu bekommen und dann kommen noch eventuelle Gesamtsummen o.Ä.
dazu.

Gruß,
Hans

Volker Berninger

unread,
Aug 15, 2000, 3:00:00 AM8/15/00
to
>Ich bin auch gerade mit diesem Thema beschäftigt. Wie machst Du das
>denn wenn Du sagen wir mal eine Liste druckst aus einer Datenbank:
>
>with Query do begin
> while not Eof do begin
> .... ( Zeile malen )
> Next
> end;
>end;
>
>Wenn die Paintbox einen WM_Paint geschickt bekommt, weiß Du nicht wie
>weit Du in der Query zurückrollen muß um das gleiche Resultat auf der
>Seite zu bekommen und dann kommen noch eventuelle Gesamtsummen o.Ä.
>dazu.

Genau da liegt der Haken in der Sache! Ich selbst nutze die
Druckvorschau v.a. für Grafiken und speziell formatierte Stringgrids.
In einem Fall habe ich eine Vorschau in ein Datenbankprogramm
integriert, dort gebe ich allerdings genau aus diesem Grund nur die
erste Seite aus (nur zur optischen Kontrolle).

Entweder versuchst Du, die Startposition (Seitenanfang) zu sichern
(z.B. per Bookmark, falls das in deinem Fall möglich ist) oder du
nutzt - sofern die Resourcen das zulassen - statt einer Paintbox ein
TImage und schreibst in TImage.Picture.Bitmap.Canvas hinein.
Dann darfst Du dieses allerdings nicht zu sehr vergrößern, ausserdem
solltest Du versuchen, dessen Farbtiefe zu reduzieren: wenn nur Text
ausgegeben wird, kannst du sogar auf pixelformat:=pf1Bit
heruntergehen, was Resourcen sparen dürfte.

Da gibt es natürlich noch eine ganz andere Lösung, die anwenderbezogen
auch Sinn ergeben könnte. Ich nutze z.B. für Präsentationen das
Programm Fineprint (Shareware), das als Standarddrucker eingerichtet
werden kann und dann alle Druckausgaben in eine Seitenvorschau
umleitet - ist ein feines Programm.

Volker


Björn Schreiber

unread,
Aug 15, 2000, 3:00:00 AM8/15/00
to
"Michael Dahm" <technik...@myokay.net> schrieb im Newsbeitrag
news:8nan93$50f$1...@news.okay.net...

> Ich werd mal damit rumprobieren.

Einfachere Möglichkeit: Benutze Metadateien.

Die eigentlichen Zeichenroutinen werden nur einmal von der Metadatei
aufgezeichnet (Vorteil: Keine Umrechnung der Koordinaten nötig, man kann
über den Abbildungsmodus z.B. in 0,1 mm Einheiten drucken).
Für die Vorschau nutzt Du dann eine PaintBox, die die gleichen
Seitenverhältnisse wie der Drucker hat, allerding je nach eingestellter
Vergrößerungsstufe anders skaliert. Die Darstellung geschieht dann einfach
per PaintBox.Canvas.StretchDraw(MetaFile, ...).
Die Ausgabe auf dem Drucker geschieht ähnlich einfach per
Printer.Canvas.Draw(MetaFile).

Das ganze ist eigentlich recht simpel, Komponenten dazu findest Du auf
der DSP oder bei Torry.

Anmerkung: Meine Probleme mit farbigen Metadateien auf S/W-Druckern
unter NT 4.x ließen sich auf die Druckertreiber zurückführen. Nach einer
Installation neuer Treiber trat das Problem nicht mehr auf ...

MfG,
Björn

«
--
Björn Schreiber
Bjoern_S...@bigfoot.de

Ralf Mimoun

unread,
Aug 15, 2000, 3:00:00 AM8/15/00
to
Moin!

"Michael Dahm" <technik...@myokay.net> schrieb im Newsbeitrag

news:8n9mvp$2ldd$1...@news.okay.net...
...


> Dank Dir für den Tip zu Report-Printer-Pro. Ich geh jetzt mal auf die Such
> nach dem Ding, vielleicht kannst Du mir aber auch die URL geben.

No problemo: http://digital-metaphors.com/. Ach ja, schau Dir auch das
ultimative Grid von DevExpress an, da gibts auch eine Druckfunktion sehr
nett, wenn auch arg teuer.

Bye, Ralf

Volker Berninger

unread,
Aug 15, 2000, 3:00:00 AM8/15/00
to
> Einfachere Möglichkeit: Benutze Metadateien.
>
> Die eigentlichen Zeichenroutinen werden nur einmal von der Metadatei
>aufgezeichnet (Vorteil: Keine Umrechnung der Koordinaten nötig, man kann
>über den Abbildungsmodus z.B. in 0,1 mm Einheiten drucken).
> Für die Vorschau nutzt Du dann eine PaintBox, die die gleichen
>Seitenverhältnisse wie der Drucker hat, allerding je nach eingestellter
>Vergrößerungsstufe anders skaliert. Die Darstellung geschieht dann einfach
>per PaintBox.Canvas.StretchDraw(MetaFile, ...).
> Die Ausgabe auf dem Drucker geschieht ähnlich einfach per
>Printer.Canvas.Draw(MetaFile).

An diese Möglichkeit habe ich noch gar nicht gedacht!

Wie sieht es denn mit dem Speicherbedarf für eine solche Datei aus?
Könnte so ein Zwischenpuffer nicht zu Resourcenproblemen führen?

Volker


Hans Lesmeister

unread,
Aug 15, 2000, 3:00:00 AM8/15/00
to
>Entweder versuchst Du, die Startposition (Seitenanfang) zu sichern
>(z.B. per Bookmark, falls das in deinem Fall möglich ist) oder du
>nutzt - sofern die Resourcen das zulassen - statt einer Paintbox ein
>TImage und schreibst in TImage.Picture.Bitmap.Canvas hinein.
> usw...

Die Lösung liegt in der Metafile. War ich auch noch nicht drauf
gekommen. Habe inzwischen auch einen Preview-Modul gefunden mit
Source.

Gruß,
Hans

Björn Schreiber

unread,
Aug 15, 2000, 3:00:00 AM8/15/00
to
"Volker Berninger" <v...@wahlinfo.de> schrieb im Newsbeitrag
news:3999358a...@news.t-online.de...

> Wie sieht es denn mit dem Speicherbedarf für eine solche Datei aus?
> Könnte so ein Zwischenpuffer nicht zu Resourcenproblemen führen?

IMHO wird in einer Metadatei jede Aktion durch einen Code und ggf.
Parameter festgehalten, welche dann auf einem anderen Gerätekontext
abgespielt werden. Neben der Möglichkeit, Metadateien direkt auf der
Platte anzulegen bzw. zu speichern (mit Delphi IMHO recht einfach) mußt Du
ja nicht alle Seiten im Speicher halten.
Du kannst z.B. immer nur eine gewisse Anzahl von Seiten im Speicher
halten, wie eine Art Cache (vorteilhaft für die Bildschirmdarstellung).
Für die Druckausgabe werden dann die fehlenden Seiten kurzerhand erzeugt
und ggf. überflüssige (als bereits gedruckte) wieder entfernt. Natürlich
mußt Du dann ein bißchen mehr Aufwand in die eigentliche Zeichenroutine
stecken, die bestimmte einzelne Seiten aufbereiten können muß.

Sören Mühlbauer

unread,
Aug 15, 2000, 3:00:00 AM8/15/00
to

Hallo,

> Die Lösung liegt in der Metafile. War ich auch noch nicht drauf
> gekommen. Habe inzwischen auch einen Preview-Modul gefunden mit
> Source.

Kannst Du mal eine URL oder so mitteilen, da mich das auch sehr
interessiert.

Danke Sören

Michael Dahm

unread,
Aug 15, 2000, 3:00:00 AM8/15/00
to
> Einfachere Möglichkeit: Benutze Metadateien.

Noch besser, klingt absolut einleuchtend.

Dankeschön für diese schöne Anregung.

Ich hab heute mal zwischendurch was damit rumprobiert Allerdings bin ich
auch prompt auf ein Problem gestoßen:

Welche Einheit haben x,y bei einem Befehl der Art
Tmetafilecanvas.Moveto(x,y)? 0,01mm wie dokumentiert kann es irgendwie nicht
sein, denn wenn ich das Canvas (mit Draw) drucke kommen ganz andere Werte
raus.
Andererseits können es auch keine Pixel sein, denn mir liefert
TMetafile.width ganz 720 (ca) bei gesetztem mmwidth von 21000. Auch wenn ich
es mit der Druckerauflösung gegenrechne ist das nur schwachsinn.

Ich geh jetzt mal auf die Suche nach Unterlagen zu Metafile-Grafiken.... (um
mit Ingo zu sprechen: Falls ich im Regal irgendwo ein Buch finde).

Gruß
Michael Dahm


Björn Schreiber

unread,
Aug 16, 2000, 3:00:00 AM8/16/00
to
"Michael Dahm" <technik...@myokay.net> schrieb im Newsbeitrag
news:8nce4g$155l$1...@news.okay.net...

> Welche Einheit haben x,y bei einem Befehl der Art
> Tmetafilecanvas.Moveto(x,y)? 0,01mm wie dokumentiert kann es irgendwie
nicht

Schau Dir mal den API-Befehle SetMapMode an. Und gleich dazu noch
SetWindowsOrgEx. Passend dazu gab es letzte Woche auch noch einen Thread,
an dem ich rege mitgewirkt habe ... ;-).

MfG

Michael Dahm

unread,
Aug 16, 2000, 3:00:00 AM8/16/00
to
Dank Dir.
Michael

Hans Lesmeister

unread,
Aug 16, 2000, 3:00:00 AM8/16/00
to
>Kannst Du mal eine URL oder so mitteilen, da mich das auch sehr
>interessiert.

http://www.crosswinds.net/~khojasteh/


0 new messages