Ausgewählte Artikel zur Programmierung mit Delphi

Werner Voigt

 für 


TXPrint und TChart doch perfekt

Autor: Dipl.-Math. Werner Voigt

veröffentlicht in Toolbox 5/2002, Seite98
Copyright 2002 © Werner Voigt und Toolbox
Bitte beachten Sie auch die Hinweise zur kommerziellen Nutzung

Problem:

In der Beschreibung der Erweiterungen von TXPrint 1.5 wird in der Toolbox 4/2002 auf Seite 101 eine Schwäche in der Zusammenarbeit mit TChart beschrieben. Danach ist TXPrint nach dem Aufruf von TChart.PrintPartial etwas desorientiert.

Lösung:

Allerdings hat Herr Reusch mit seiner Anmerkung, daß nach NewPage wieder alle Dinge im Lot sind, selbst den entscheidenden Hinweis zur Problembehebung gegeben. In TXPrint.NewPage steckt ein Aufruf von TXPrint.PrinterSetup. Offensichtlich setzt TChart eigene Viewport-Einstellungen. Das muß wieder rückgängig gemacht werden.

Daraufhin habe ich in TXPrint die Methode PrinterSetup als public deklariert und nicht als private. Dadurch kann man sie nach jedem problematischen Teildruck im Anwendungsprogramm aufrufen. Danach arbeitet TXPrint wieder völlig korrekt. Auf diesem Weg ist es nun kein Problem mehr, auch mehrere Charts im Verein mit anderen Informationen in beliebiger Reihenfolge in ein Dokument zu drucken.

Eine genauere Analyse zeigte, daß innerhalb von PrinterSetup die folgenden Zeilen die von TChart veränderten Einstellungen von TPrinter wieder regenerieren:

SetMapMode(Handle,MM_Isotropic);   { Breite und Höhe im gleichen Verhältnis }
ox:=(longint(MarginLeft)*pLogPixelsX div k)-pPhysicalOffsetX;
oy:=(longint(MarginTop)*pLogPixelsY div k)-pPhysicalOffsetY;
{$IFDEF VER80}
SetWindowExt(Handle,kx1,ky1);
SetViewPortExt(Handle,kx2,ky2);
SetViewPortOrg(Handle,ox,oy);
{$ELSE}
SetWindowExtEx(Handle,kx1,ky1,nil);
SetViewPortExtEx(Handle,kx2,ky2,nil);
SetViewPortOrgEx(Handle,ox,oy,nil);
{$ENDIF}
    

TChart verfälscht die ViewPorteinstellungen. Da ein erneutes Setzen dieser Werte kein Löschvorgang auslöst, kann PrinterSetup gefahrlos während des Drucks benutzt werden.
Im Beispielprogramm wird das Chart in unterschiedlicher Größe zweimal gedruckt. Wie im Beispiel von Herrn Reusch wird die Skalierung mit Unscale.URect für Tchart.PrintPartial in Pixel umgerechnet. Neu ist nur der Aufruf von TXPrint.PrinterSetup unmittelbar danach. Vor, zwischen und nach den Charts wird mit der eingestellten Skalierung in gewohnter Weise mit TextOut, RoundRect, Ellipse,... perfekt gearbeitet.

Zur Fehlerbehebung genügt es also, TXPrint.PrinterSetup für den Komponentenanwender zugänglich zu machen.

Das Beispielprogramm entstand mit Delphi 5.0 und wurde unter Windows Me und Windows 2000 getestet.

zurückzurück
Copyright © 2003 by  EDVoigt  (Werner Voigt).