Thema: Delphi Druckjob Speichergröße

Einzelnen Beitrag anzeigen

Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
673 Beiträge
 
Delphi 10.4 Sydney
 
#1

Druckjob Speichergröße

  Alt 5. Okt 2021, 10:32
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;

Geändert von MyRealName ( 5. Okt 2021 um 11:03 Uhr)
  Mit Zitat antworten Zitat