Hallo,
ich schlage mich gerade mit dem Support von DevExpress rum, die diesmal so hilfreich sind wie ein 6. Zeh.
Es geht um das Drucken von vielen Bildern in einem Druckjob, also zwischen Printer.BeginDoc und Printer.EndDoc.
Bei DevExpress läuft mit der Speicher voll mit dem TdxComponentPrinter. Ich habe beim Reportbauen schon optimiert, das verbraucht jetzt nur noch minimal Speicher, aber wenn ich es dann zum Drucker sende, schießt der Speicherverbrauch nach oben.
Mein Chef meint, dann müssen wir es eben selbst drucken. Was ok ist... aber..
Ich will (bevor ich den Umbau anfange) eine Sache klären :
So ein Druckjob läuft ja so, dass ich BeginDoc mache, dann drauf male, dann NewPage, dann wieder drauf male, dann wieder NewPage etc etc. und dann irgendwann EndDoc.
Alles was da an Seiten so anfällt füllt meinen Speicher oder geht an den Druckmanager von Windows ? weil bei 400 Seiten kann das schon ein bissl was sein...
Danke schonmal
Edit: hab mal was gebaut, sieht aus als würde da kein extra Speicher benutzt werden. DevExpress scheint da irgendwie der Meinung zu sein, alles buffern zu müssen.
Ich habe es mit folgendem Code getestet :
Zitat:
procedure TForm1.Button3Click(Sender: TObject);
var
R: TRect;
scale: Double;
Bitmap1: TBitmap;
Pic: TdxSmartImage;
begin
Printer.BeginDoc;
for var j := 0 to 9 do
begin
if j > 0 then
Printer.NewPage;
dxImageSlider1.MultiFrameImage.LoadFromFile(gLocal Path + 'example.tif');
for var i := 0 to dxImageSlider1.MultiFrameImage.AnimationFrameCount - 1 do
begin
dxImageSlider1.MultiFrameImage.ActiveFrame := i;
Bitmap1 := dxImageSlider1.MultiFrameImage.GetAsBitmap;
scale := Printer.PageWidth / Bitmap1.Width;
R.Left := 0;
R.Top := 0;
R.Right := trunc(Bitmap1.Width * scale);
R.Bottom := trunc(Bitmap1.Height * scale);
printer.canvas.stretchdraw(R, Bitmap1);
FreeAndNil(Bitmap1);
if i < dxImageSlider1.MultiFrameImage.AnimationFrameCount - 1 then
Printer.NewPage;
end;
end;
Printer.EndDoc;
end;