BUG IMPRESSION DELPHI

Résolu
exae Messages postés 6 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 29 juillet 2005 - 26 nov. 2003 à 10:08
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021 - 30 juil. 2005 à 14:21
J'ai un problème d'impression sous W98.

Pic := TPicture.Create;
Pic.LoadFromFile( 'c:\WINDOWS\monBmp.bmp' );
Printer.BeginDoc;
Printer.Canvas.StretchDraw( Rect( 100, 100, 200, 200), Pic.Graphic );
Printer.EndDoc;
Pic.Free;

Ce code fonctionne parfaitement sous XP mais image vide sous 98.

J'ai aussi essayé avec l'API stretchblt mais sous W98 la fonction me retourne le message d'erreur : Paramètre incorrect.

Que faire ?

EXAE

4 réponses

exae Messages postés 6 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 29 juillet 2005 1
29 juil. 2005 à 13:29
Oui j'ai effectivement trouvé la solution, il ne faut jamais utiliser StrechDraw avec le canvas d'une imprimante.



Alors voici la fonction qui marche à tous les coups :



Procedure PrintBitmap(Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap);

Var

BitmapHeader: pBitmapInfo;

BitmapImage : POINTER;

HeaderSize : DWORD; // Use DWORD for D3-D5 compatibility

ImageSize : DWORD;

BEGIN

GetDIBSizes(Bitmap.Handle, HeaderSize, ImageSize);

GetMem(BitmapHeader, HeaderSize);

GetMem(BitmapImage, ImageSize);

Try

GetDIB(Bitmap.Handle, Bitmap.Palette, BitmapHeader^, BitmapImage^);

StretchDIBits(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;

END;


Apparement personne n'imprime d'image avec DELPHI !
3
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
26 nov. 2003 à 10:55
var Bmp :Tbitmap;

Bmp := Tbitmap.Create;
Bmp.LoadFromFile( 'c:\WINDOWS\monBmp.bmp' );
Printer.BeginDoc;
Printer.Canvas.StretchDraw( Rect( 100, 100, 200, 200), Bmp );
Printer.EndDoc;
Bmp.Free;

la ca devrais fontionner ;o))

Bon Coding ....

ManChesTer.
0
exae Messages postés 6 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 29 juillet 2005 1
26 nov. 2003 à 14:18
Merci d'avoir répondu aussi rapidement, mais ça ne fonctionne pas à 100%, en effet si j'ajoute ce code dans une boucle toute simple, les images sont de temps en temps vides.

Le problème existe sous W98 mais pas sous XP.

Exemple :

var
Bmp :Tbitmap;
i : Integer;
Begin
Bmp := Tbitmap.Create;
Printer.BeginDoc;
For i := 1 To 20 Do Begin
// Pour simplifier je prend tjs la même image
Bmp.LoadFromFile( 'c:\MonBmp.bmp' );
Printer.Canvas.StretchDraw( Rect( i * 100, 100, i * 100 + 100, 200 ), bmp );
End;
Printer.EndDoc;
Bmp.Free;
End;
0
cs_ManChesTer Messages postés 374 Date d'inscription vendredi 20 octobre 2000 Statut Modérateur Dernière intervention 15 janvier 2021
30 juil. 2005 à 14:21
Arf désolé, je vins seulement de recevoir les mail me disant que se post avais bougé.
Je t'aurais proposé :

procedure PrinterStretchDraw(R:TRect;Bmp:TBitmap);
var
BmpInfo,
BmpData : Pointer;
BmpInfoSize,
BmpDataSize : Cardinal;
begin
GetDIBSizes(Bmp.Handle,BmpInfoSize,BmpDataSize);
GetMem(BmpInfo,BmpInfoSize);
GetMem(BmpData,BmpDataSize);
try
GetDIB(Bmp.Handle,Bmp.Palette,BmpInfo^,BmpData^);
StretchDIBits(Printer.Canvas.Handle,R.Left,R.Top,R.Right,R.Bottom,
0,0,Bmp.Width,Bmp.Height,BmpData,TBitmapInfo(BmpInfo^),
DIB_RGB_COLORS,SRCCOPY);
finally
FreeMem(BmpData);
FreeMem(BmpInfo);
end;
end;

Pour l'utilisé :

with printer do
begin
Orientation:=poLandscape;
BeginDoc;
Canvas.Lock;
PrinterStretchDraw(Rect(0,0,Printer.PageWidth,Printer.PageHeight),Tonbmp);
Canvas.Unlock;
EndDoc;
end;

Tu peux biensur modifier la taille du Rect...

Bon Coding ....

ManChesTer.
0
Rejoignez-nous