BUG IMPRESSION DELPHI [Résolu]

Messages postés
6
Date d'inscription
jeudi 7 août 2003
Dernière intervention
29 juillet 2005
- - Dernière réponse : cs_ManChesTer
Messages postés
378
Date d'inscription
vendredi 20 octobre 2000
Dernière intervention
11 décembre 2013
- 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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
6
Date d'inscription
jeudi 7 août 2003
Dernière intervention
29 juillet 2005
3
Merci
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 !

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de exae
Messages postés
378
Date d'inscription
vendredi 20 octobre 2000
Dernière intervention
11 décembre 2013
0
Merci
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.
Commenter la réponse de cs_ManChesTer
Messages postés
6
Date d'inscription
jeudi 7 août 2003
Dernière intervention
29 juillet 2005
0
Merci
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;
Commenter la réponse de exae
Messages postés
17
Date d'inscription
jeudi 9 octobre 2003
Dernière intervention
7 septembre 2006
0
Merci
J'ai le meme problème que toi :

http://www.delphifr.com/forum.v2.aspx?ID=521892&post=ok

As-tu trouvé une solution depuis ?

respect robustesse
Commenter la réponse de goloa
Messages postés
378
Date d'inscription
vendredi 20 octobre 2000
Dernière intervention
11 décembre 2013
0
Merci
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.
Commenter la réponse de cs_ManChesTer

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.