Moin, moin,
in meinen Programmen haben die Anwender die Möglichkeit, Bilder in die Druckausgabe einzubinden. Meistens wird das in den Fusszeilen der Seiten verwendet. Dabei benutze ich die folgenden Funktionen, wobei PrintIt() die Funktion ist, die ich aufrufe:
Delphi-Quellcode:
procedure PrintBild(DestRect:TRect; Image:TImage);
var BitmapHeader:pBitmapInfo; BitmapImage:POINTER; Bitmap:TBitmap;
HeaderSize,ImageSize:DWORD;
begin
Bitmap := TBitmap.Create;
try
Bitmap.Width:=Image.Picture.Width;
Bitmap.Height:=Image.Picture.Height;
Bitmap.PixelFormat:=pf24bit;
// Convert GIF (JPEG, or whatever) to BMP
Bitmap.Canvas.Draw(0,0, Image.Picture.Graphic);
GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);
GetMem(BitmapHeader, HeaderSize);
GetMem(BitmapImage, ImageSize);
try
GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);
StretchDIBits(Printer.Canvas.Handle,
DestRect.Left, DestRect.Top, // Destination Origin
DestRect.Right - DestRect.Left, // Destination Width
DestRect.Bottom - DestRect.Top, // Destination Height
0, 0, // Source Origin
Bitmap.Width, Bitmap.Height, // Source Width & Height
BitmapImage,
TBitmapInfo(BitmapHeader^),
DIB_RGB_COLORS,
SRCCOPY)
finally
FreeMem(BitmapHeader);
FreeMem(BitmapImage)
end
finally;
Bitmap.Free;
end;
end;
procedure PrintIt(Filename:String; BildHoeheMillimeter,BildBreiteMillimeter:Integer);
var Img:TImage; Rect:TRect; cnt,bb,bh:INTEGER;
begin
Img:=TImage.Create(NIL);
Img.Picture.LoadFromFile(Inhalt.Inhalt);
bh:=Trunc(BildHoeheMillimeter*PixelsPerInch.X/25.4);
bb:=Trunc(BildBreiteMillimeter*PixelsPerInch.X/25.4);
if bb=0 then // ggfs. Seitenverhältnisse beibehalten
bb:=Round(bh*(Img.Picture.Width/Img.Picture.Height));
if bh=0 then // ggfs. Seitenverhältnisse beibehalten
bh:=Round(bb*(Img.Picture.Height/Img.Picture.Width));
// x,y = aktuelle Position auf dem Papier
Rect.Top:=y;
Rect.Bottom:=y+bh;
Rect.Left:=x;
Rect.Right:=x+bb;
PrintBild(Rect,Img);
Img.Free;
end;
Nun zu meinem Problem:
die Anwender berichten mir, dass es immer wieder vorkommt, dass das Bild nicht gedruckt wird. Anstelle des Bildes wird ein schwarzer Kasten gedruckt, der genau der Bildgröße entspricht. Das Ganze ist nicht reproduzierbar. Sehr oft tritt es gar nicht auf, manchmal ab Seite 10, manchmal auch erst ab Seite 100. Wenn es auftritt, kann es nur "repariert" werden, in dem das Programm beendet wird. Ich selber habe das Problem noch nie gehabt, kann es also auch nicht debuggen. Der Fall wurde auch bei unterschiedlichen Druckern und sogar bei PDF-Erzeugern berichtet.
Kann jemand anhand des Codes was "böses" sehen oder hat eine Idee, wo das Verhaltern herkommt? Bin für jede Idee dankbar
cu
easy