BUG IMPRESSION DELPHI [Résolu]

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

exae 6 Messages postés jeudi 7 août 2003Date d'inscription 29 juillet 2005 Dernière intervention - 29 juil. 2005 à 13:29
+3
Utile
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 !
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de exae
cs_ManChesTer 378 Messages postés vendredi 20 octobre 2000Date d'inscription 11 décembre 2013 Dernière intervention - 26 nov. 2003 à 10:55
0
Utile
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
exae 6 Messages postés jeudi 7 août 2003Date d'inscription 29 juillet 2005 Dernière intervention - 26 nov. 2003 à 14:18
0
Utile
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
goloa 17 Messages postés jeudi 9 octobre 2003Date d'inscription 7 septembre 2006 Dernière intervention - 29 juil. 2005 à 08:56
0
Utile
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
cs_ManChesTer 378 Messages postés vendredi 20 octobre 2000Date d'inscription 11 décembre 2013 Dernière intervention - 30 juil. 2005 à 14:21
0
Utile
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.