Problème d'affichage d'une Image1.Canvas.Pen.Mode

Résolu
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 - 11 sept. 2007 à 18:40
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 - 12 sept. 2007 à 12:21
Bonsoir à toutes et à tous,

Je dispose de deux fiche, sur la 1ère (formvisu) je charge une photo dans un Timage et j'ai un Tprintersetupdialog, sur la seconde je réalise un aperçu avant d'imprimer avec un TprintDialog, un Timage et un Tscrollbox.

Je vérifie en affichant ma fiche 2 en showmodal, j'ai bien mon image placée sur un fond blanc en mode portrait.
 
Je ferme ma fiche 2 et j'ouvre Tprintersetupdialog pour mettre le mode paysage, j'ouvre à nouveau ma fiche 2, mon image se trouve en mode paysage ainsi que le fond blanc mais ce fond est emputé d'une partie, comme si il avait gardé la largeur du fond en mode portrait.

Voici ma procédure :

 private
     zoomh , zooml : integer;
    procedure Apercu;
 
procedure TMain.Apercu;
var
  Rect: TRect;
begin
Rect.Top := 10;
Rect.Left := 10;
begin
Rect.Right := 10 +trunc(Formvisu.Imagevisu.Picture.Graphic.Width *zooml) div 10;
Rect.Bottom := 10 +trunc(Formvisu.Imagevisu.Picture.Graphic.Height *zoomh) div 10;
end;
Imageprint.Canvas.Pen.Mode := pmWhite;
Imageprint.Canvas.Rectangle (0, 0, Imageprint.Width, Imageprint.Height);
Imageprint.Canvas.StretchDraw (Rect,Formvisu.Imagevisu.Picture.Graphic);
end;

procedure TMain.FormActivate(Sender: TObject);
Var
Tp,Lft:Word;
begin



//dimensionne l'image  pour être au milieu de l'écran.
Imageprint.Width := Printer.PageWidth div 10;
Imageprint.Height := Printer.PageHeight div 10;
tp:=Round((Sbox1.Height-Imageprint.Height)/2);
Imageprint.Top:=tp;
Lft:=Round((Sbox1.Width-Imageprint.Width)/2);
Imageprint.Left:=Lft;
zooml:=4;
zoomh:=4;




 //Appelle la procedure Apercu
Apercu;

end;




Si quelqu'un a une idée, cela me ferait plaisir.

@+,

Cincap




[url]mailto:/url

5 réponses

cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
12 sept. 2007 à 12:21
@ Foxi, voila, cela fonctionne parfaitement je crée la fiche 2 depuis la fiche 1, 

par le "Main := TMain.Create(Application);"

puis "Main.showmodal;" en n'oubliant pas de désactiver dans le projet  :

"//Application.CreateForm(TMain, Main);"

Je considère ce topic comme clos.

Merci encore d'avoir répondu à mon appel.

@+,

Cincap

[url]mailto:/url
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
11 sept. 2007 à 22:20
procedure TMain.Apercu;
var
  Rct: TRect;
begin
  Rct := Rect( 10,
               10,
               10 +round(Formvisu.Imagevisu.Picture.Graphic.Width *zooml) div 10,
               10 +round(Formvisu.Imagevisu.Picture.Graphic.Height *zoomh) div 10
             );
  with ImagePrint.Canvas do
  begin 
    Pen.Mode := pmWhite;
    Rectangle(0, 0, Imageprint.Width, Imageprint.Height);
    StretchDraw(Rct, Formvisu.Imagevisu.Picture.Graphic);
  end;
  ImagePrint.Refresh;
end;

procedure TMain.FormActivate(Sender: TObject);
begin
  //dimensionne l'image  pour être au milieu de l'écran.
  with ImagePrint do
  begin
    Width  := Printer.PageWidth div 10;
    Height := Printer.PageHeight div 10;
    Top    := (Sbox1.Height-Height) shr 1;
    Left   := (Sbox1.Width-Width) shr 1;
  end;
  zooml := 4;
  zoomh := 4;
  //Appelle la procedure Apercu
  Apercu;
end;
0
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
11 sept. 2007 à 22:59
@ Foxi, merci de m'avoir répondu, j'ai essayé ta solution et malheureusement j'arrive au même résultat.

En fait à la première éxécution de l'application, si je choisis le mode paysage avant d'afficher la fiche 2, j'obtiens bien ce mode et le canevas est complet avec ma photo, par contre si je ferme la fiche 2 et que je régle le mode portrait, le canevas n'est pas complet.

Si à la première éxécution de l'application, je choisis le mode portrait avant d'afficher la fiche2, j'obtiens bien ce mode et le canevas est complet avec ma photo, par contre si je ferme la fiche 2 et que je régle le mode paysage, le canevas n'est pas complet.

Je continue aussi a chercher de mon côté, car apparemment c'est l'image ou le scrollbox qui n'est pas raffraîchit.

@+,

Cincap

[url]mailto:/url
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
12 sept. 2007 à 08:39
ok alors c'est un probleme de conception.

sincerement, les evenements OnShow et OnActivate, je trouve qu'on finit par s'y perdre (un peu comme la droite et la gauche, l'est et l'ouest ... selon le sens qu'on est tourné ça change tout)...

a part les OnPaint, OnClick et OnCreate/OnDestroy ...

quand j'ai une fiche enfant, me servant d'aperçus, ou about, ou autre, je crée toujours une fonction pour l'appeler :

TForm2 = ...
public
  function Execute(arguments) : boolean; // showmodal ou
  procedure Execute; // show pas modal
end;

et la, dans cette methode d'appel, je gere tout ce qui attrait au bon fonctionnement de cette fiche.
sans attendre le declenchement d'un evenement quelconque, qu'on sais pas si il vas bien etre declanché tout le temps.

ici, le mieux serait de ne pas travaillé sur le canvas de TImage mais sur un bitmap qu'on fournirait a TImage (reglé en center/stretchdraw et pas autosize).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
12 sept. 2007 à 09:08
Bonjour à toutes et à tous,

@ Foxi, tu peux pas savoir le nombre d'essais de tous genre pour ce problème qui se produit que si on change le mode de l'impression après celui par défaut tout compte fait.

Aurais tu une piste, un bout de code pour réaliser une fiche d'aperçu ?

Sans quoi grand merci quand même de tes réponses.

@+,

Cincap

[url]mailto:/url
0
Rejoignez-nous