BUG IMPRESSION DELPHI [Résolu]

Signaler
Messages postés
6
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
29 juillet 2005
-
Messages postés
374
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
15 janvier 2021
-
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

Messages postés
6
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
29 juillet 2005
1
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 !
Messages postés
374
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
15 janvier 2021

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.
Messages postés
6
Date d'inscription
jeudi 7 août 2003
Statut
Membre
Dernière intervention
29 juillet 2005
1
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;
Messages postés
374
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
15 janvier 2021

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.