Problème d'impression d'image [Résolu]

goloa 17 Messages postés jeudi 9 octobre 2003Date d'inscription 7 septembre 2006 Dernière intervention - 28 juil. 2005 à 15:43 - Dernière réponse : goloa 17 Messages postés jeudi 9 octobre 2003Date d'inscription 7 septembre 2006 Dernière intervention
- 29 juil. 2005 à 14:53
Bonjours a tous,

Je poste ce message parce que j'ai un programme qui fonctionne mais pas à tous les coups. je m'explique :

je désire imprimer plusieurs pages contenant des graphiques que je transforme en bitmap puis je colle ces bitmaps sur le canvas de l'imprimante

Tmp_Fic := ExtractFileDir(Tab_Param[i,2])+'\tmp_fic.bmp';
graph := TMonGraph(pagedac_f.FindComponent('graph'+ IntToStr(i)));
graph.SaveToBitmapFile(Tmp_Fic);
Img_Graph := Timage.Create(pagedac_f);
Img_Graph.Picture.LoadFromFile(Tmp_Fic);
StretchDraw(PosGraph,Img_Graph.Picture.Graphic);
Img_Graph.Free;
Deletefile(Tmp_Fic);


Alors ce que je peux dire c'est que ça fonctionne mais par exemple sur une feuille avec 10 graph un coup il va m'en manquer 2 un autre coup 2 autres différent, un coup 3 et un autre coup aucun. J'ai fais des test sur Win98, 2000, XP et sur plusieurs imprimantes en A3 et A4 et avec Win2PDF. C'est la meme partout . Et qu'en je passe tout le code en débogage tout semble normal

Mes questions : Pourquoi ça merde aléatoirement ? Avez vous déja rencontrer ce problème ? pouvez vous m'indiquer comment le résoudre ou le contourner ?

respect robustesse
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
cptpingu 3803 Messages postés dimanche 12 décembre 2004Date d'inscription 18 septembre 2018 Dernière intervention - 28 juil. 2005 à 16:02
1
Merci
Essaie cette fonction:



Procedure ImprimeBitmap(Bitmap :TBitmap; Orientation :TPrinterOrientation; IndexDeLimprimante, NombreDeCopie :integer);

begin {Les orientations sont : poPortrait, poLandScape}

if NombreDeCopie < 0 then NombreDeCopie := 1;

Printer.Copies := NombreDeCopie;

Printer.PrinterIndex := IndexDeLimprimante; // la premiere imprimante est l'index 0

Printer.Orientation := Orientation;

Printer.BeginDoc();

Printer.Canvas.Draw(0,0, Bitmap); // on dessine le canevas du Bitmap dans celui de Printer

Printer.EndDoc();

end;

Merci cptpingu 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cptpingu
Meilleure réponse
exae 6 Messages postés jeudi 7 août 2003Date d'inscription 29 juillet 2005 Dernière intervention - 29 juil. 2005 à 13:30
1
Merci
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 !

Merci exae 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de exae
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 28 juil. 2005 à 16:11
0
Merci
Vive CptPingu !! Il écrit "essaie cette fonction" et après il nous présente une procedure !!!



Bon ,trève de plaisanteries.

Goloa, on a du mal à s'y repérer dnas ton code, on ne sait pas ce qu'est TMonGraph.

Je ne connais, de plus, pas de procedures se nommant StretchDraw qui s'utilisent comme ce que tu nous montre.



Peux-tu commenter ton code et nous donner un code qui est compilable (ceui que tu as dans ton éditeur)?

Après cela, on pourra peut-être t'aider mieux.

<hr size="2" width="100%">Mais c'est vrai que la méthode de CptPingu me parrait plus claire.

Tu dis que tu imprime mais on ne voit de "Printer" pas plus que dans mon oeil.



@ ++

Florent


Si tu ne te plantes pas ......
tu ne poussera jamais
Commenter la réponse de florenth
goloa 17 Messages postés jeudi 9 octobre 2003Date d'inscription 7 septembre 2006 Dernière intervention - 28 juil. 2005 à 17:36
0
Merci
"TMonGraph" correspond a un Tchart que j'ai paramétré.

StretchDraw est une méthode de Tcanvas :
procedure StretchDraw(const Rect: TRect; Graphic: TGraphic );

L'utilisateur de mon programme veut afficher 'n' mesures qui sont représentées dans les n TeeChart (1courbe par TeeChart). Quand il veut imprimer, il va passer dans ma boucle :

WITH Printer.Canvas DO

For i := 0 to n do
Tmp_Fic := ExtractFileDir(Tab_Param[i,2])+'\tmp_fic.bmp';

//Recherche de mon TeeChart n° "n"
graph := TMonGraph(pagedac_f.FindComponent('graph'+ IntToStr(i)));

//Sauvegarde de mon teechart dans un fichier
graph.SaveToBitmapFile(Tmp_Fic);

//Chargement de mon fichier image contenant l'image du teechart dans une variable
Img_Graph := Timage.Create(pagedac_f);
Img_Graph.Picture.LoadFromFile(Tmp_Fic);

//Positionnement du graphique sur le canvas de l'imprimante
//coeff_width = largeur du canvas de l'imprimante / largeur du canvas où j'affiche mon graphique
//coeff_height est la meme chose pour la hauteur

PosGraph.Left := round(152 * coeff_width);
PosGraph.Right := pagewidth;
PosGraph.Top := round(PageHeight * 0.07335) + round(StrToInt(Tab_param[i,10])*coeff_Height);
PosGraph.Bottom := round(PageHeight * 0.07335) + round((StrToInt(Tab_param[i,10])+ StrToInt(Tab_param[i,11]))*coeff_Height);

StretchDraw(PosGraph,Img_Graph.Picture.Graphic);

//Je libère a chaque fois les variables si je repasse encre dans la boucle elle seront recréées
Img_Graph.Free;
Deletefile(Tmp_Fic);
End;
End;

mon EndDoc viens apres le traçage de l'entetes et du pied de page

Ce que je ne comprend pas c'est que je passe "n" fois dans cette boucle et que sur ces "n" fois les graphiques vont bien être enregistrer dans le fichiers 'tmp_fic.bmp' j'ai fais les test et meme si ils ne passent passe pas à l'impression ils sont dans les fichiers donc pas de problème avec la fonction 'SaveToBitmapFile' Maintenant il faut que je test si le 'LoadFromFile' fonctionne correctement et surtout à tous les coups.

A mon avis il ne faut pas aller chercher d'erreur dans mon code puisqu'il fonctionne (Ok pas a tout les coups) mais je me pose des questions sur le buffer des imprimantes ou des chose du style.

la boucle est traversée a chaque fois c'est sur ! et en débogage ça passe aussi sur le stretchDraw...

Je pense que CptPingu parle de la fonction "Draw" je fais le test et je reviens à la charge


respect robustesse
Commenter la réponse de goloa
goloa 17 Messages postés jeudi 9 octobre 2003Date d'inscription 7 septembre 2006 Dernière intervention - 29 juil. 2005 à 08:53
0
Merci
Aparement je ne suis pas le seul a avoir ce problème :

http://www.delphifr.com/forum.v2.aspx?id=161644


respect robustesse
Commenter la réponse de goloa
goloa 17 Messages postés jeudi 9 octobre 2003Date d'inscription 7 septembre 2006 Dernière intervention - 29 juil. 2005 à 14:53
0
Merci
Merki


respect robustesse
Commenter la réponse de goloa

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.