Pb Canvas.Draw

Résolu
MathU Zalem Messages postés 12 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 9 juin 2006 - 5 juin 2006 à 12:56
MathU Zalem Messages postés 12 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 9 juin 2006 - 6 juin 2006 à 18:37
Salut à tous,

J'ai un pb probablement simple, mais je ne trouve pas la réponse. Dans le cadre d'un petit projet (editeur d'icône), j'ai voulu afficher une image temporaire pour vérification. Fastoche, Canvas.Draw et en avant; mais au premier essai RIEN J'ai essayé plein de mauvaises solutions, si quelqu'un pouvait me donner la bonne, ça m'arrangerai.
Le problème précis est le suivant, le "Canvas.Draw" est dans un "Button1Click". Au premier appel rien, et ensuite tout fonctionne, l'image s'affiche comme prévu au bon endroit et tout et tout... 
J'ai fait un tout petit programme avec juste le bouton, même pb:

      procedure TForm1.Button1Click(Sender: TObject);
      var
        XOrMask : TBitmap;
      begin
       OpenDialog1.InitialDir:= ParamStr(0);
        if NOT OpenDialog1.Execute then Exit;
       XOrMask : = TBitmap.Create;
       XOrMask.LoadFromFile(OpenDialog1.FileName);
       Form1.Canvas.Draw( 140, 80, XOrMask);
       XOrMask.Free;
      end;


Merci d'avance.

MathUZalem

10 réponses

ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
6 juin 2006 à 17:48
Salut,

Le problème vient, à mon avis, que tu fais un Draw sur le Canvas de la Form. Ce canvas (ainsi que celui d'un PaintBox)  n'a pas de "mémoire", c.à.d. qu'au premier message Repaint envoyé par le système à ta form,  ton dessin sur le canvas est effacé. Pour éviter cela, on dessine dans l'événement OnPaint. Mais, dans ton cas, ceci ne me parait pas très pratique.
Le Canvas d'un TImage est lui mémorisé, donc pas de problèmes, il va se ressiner automatiquement. Tu peux aussi écrire :
     Image1.Picture.LoadFromFile(OpenDialog1.FileName)
L'avantage de ceci est que tu peux charger autre chose que des bmp : icon...
Je le répète, ton système devait marcher, sauf si ton code ou  je ne sais quoi d'autre provoque un Repaint intempestif de la Form.
Pour voir quand ta form se redessine, ajoute à  form1 un événement OnPaint dans lequel tu mets simplement l'instruction Beep.      

A +
Thierry
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
5 juin 2006 à 13:19
Salut,
je viens de tester ton code tel quel
et il fonctionne très bien et du premier coup ?

As-tu déjà essayé avec un autre fichier BMP ?

@+
Cirec
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
5 juin 2006 à 13:23
ps : tu dis au premier appel rien ...

Mais est-ce un appel par code ? ( Button1.Click)

Où par action sur le bouton ? (Clique Souris)

@+
Cirec
MathU Zalem Messages postés 12 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 9 juin 2006
5 juin 2006 à 14:45
Merci de repondre si vite, j'étais parti manger désolé , en réponse aux questions:
 - oui, j'ai essayé plusieurs BMP (en premier appel, en second, etc...), toujours pareil,
 la première fois rien et après tout va bien!
 - action sur le bouton, c'est ce qui est prévu si j'arrive à faire avancer la bourrique.
Est-ce qu'il y a quelque chose à débloquer avant d'accéder au canvas de la Form?
Je finis par me demander si j'aurais pas ramasser un virus, ça m'étonne un peu, mais je ne sais plus quoi penser.

encore merci de toute façon

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

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
5 juin 2006 à 14:56
Essaye comme ceci :

Procedure AfficheBmp(X,Y : Integer;Bmp : TBitmap; Canv : TCanvas);
Begin
  Canv.Draw(X, Y, BMP);
End;



procedure TForm1.Button1Click(Sender: TObject);
var
  XOrMask : TBitmap;
begin
  OpenDialog1.InitialDir:= ParamStr(0);
  if NOT OpenDialog1.Execute then Exit;
  XOrMask : = TBitmap.Create;
  XOrMask.LoadFromFile(OpenDialog1.FileName);
  //Form1.Canvas.Draw( 140, 80, XOrMask);
  AfficheBmp(140, 80, XorMask, Canvas);
  XOrMask.Free;
end;

Mais je ne vois pas pourquoi ça ne fonctionne pas de suite

@+
Cirec
MathU Zalem Messages postés 12 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 9 juin 2006
5 juin 2006 à 15:02
Arghh! De + en + fort
Le même programme (même pas recompilé), mais activé au travers d'une liaison réseau (local/µSoft) fonctionne parfaitement comme prévu (affichage au premier click et aux suivants, je laisse tomber en attendant de l'aide, ça me dépasse, je n'ai plus d'idées .

MathUZalem
MathU Zalem Messages postés 12 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 9 juin 2006
5 juin 2006 à 15:11
en réponse à Cirec (14:56), AfficheBmp(...) même résultat: premier click rien, ensuite tout roule!

MathUZalem
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
5 juin 2006 à 17:26
Salut,

il n'y a pas de raison pour que ça ne marche pas, mais essaie ceci en plaçant un TImage sur ta form :

procedure TForm1.Button1Click(Sender: TObject);
var
     XOrMask : TBitmap;
begin
         OpenDialog1.InitialDir:= ParamStr(0);
         if NOT OpenDialog1.Execute then Exit;
         XOrMask := TBitmap.Create;
         XOrMask.LoadFromFile(OpenDialog1.FileName);
         Image1.Picture.Bitmap.Assign(XOrMask);
        XOrMask.Free;
 end;

Note que dans ce cas, on n'est pas obligé de passer par un bitmap, mais c'est juste pour essayer...

Thierry
MathU Zalem Messages postés 12 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 9 juin 2006
6 juin 2006 à 15:53
re-Bonjour,

@ThWilliam:
 Comme prévu, ça marche impec... Mais, ça n'explique pas pourquoi l'autre version,
qu'   il n'y a pas de raison pour que ça ne marche pas   NE marche PAS!
 Si on ne peux plus se fier à la doc, si begin c'est plus au début et si 1+1 ça fait plus 2 mais n'importe quoi de préférence en tirant au hasard, moi je rends mes billes et je retourne encoder mes DivX...

merci quand même et à +   :o(

MathUZalem
MathU Zalem Messages postés 12 Date d'inscription samedi 4 décembre 2004 Statut Membre Dernière intervention 9 juin 2006
6 juin 2006 à 18:37
Oki! Oki! Oki! MERCI!!!

Quelle pomme, mais c'est bien sur  .J'ai toujours pas bien compris pourquoi il n'y a un repaint qu'au premier click, mais maintenant que, grace à toi, je tiens une piste, je ne vais pas la lâcher et je vais essayer de mettre ça dans un coin de ma petite tête pour ne plus tomber dedans...

encore mille mercis (et à tout ceux qui ne m'ont pas répondu cette fois, mais qui m'ont aidé des dizaines de fois en répondant à d'autres débutants, je ne vais pas les citer tous - je risquerai d'en oublier - may Delphi bless you !)

MathUZalem
Rejoignez-nous