PB pour dessiner sur un Canvas je séche...

ffert
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009
- 29 août 2006 à 14:41
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
- 31 août 2006 à 16:17
Bonjour


Voilà un des Bug les plus incompréhensible que j'ai rencontré.... :


J'ai un Panel contenant un TImage.

Le Panel est en "Visible := False" à l'ouverture de l'application.

- quand je clicke sur un bouton :

     je redimensionne et affiche le Tpanel ,

     puis je redimensionne et dessine dans le Timage.


J'obtiens alors au moment d'accéder au Canvas de l'image un message me disant :
EOutOfRessource "Paramètre Incorrect"... !!!!


Alors que j'accède bien à mon Timage pour le redimensionner par exemple.

Si j'essaie d'accéder à une image en dehors du panel : aucune erreur.

Si je rajoute un nouveau composant Timage dans mon panel : de nouveau l'erreur lorsque j'exécute une commande sur le Canvas.


Je n'y comprends plus rien. Ou alors j'ai pas assez dormis ces derniers jours et j'ai l'esprit embrumé !!!


Please... help !!!!!...

Fabien FERT [:)]
www.sigmadia.fr.fm

8 réponses

ffert
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009

29 août 2006 à 15:09
Bon j'ai continué les tests... et apparement ça vient de la taille de l'image... qui est trop importante.


Mais ce qui me surprends c'est que sur un autre PC... cela marche trés bien... pour cette grande  taille.....

Fabien FERT [:)]
www.sigmadia.fr.fm
0
Matt 261
Messages postés
1173
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
10 septembre 2011
3
29 août 2006 à 15:34
Salut,

peut-être que je me trompe mais le pc sur lequel tu a essayé n'a-til pas plus de mémoire vive que le tient car on a déjà eu cette question me semble - til et il n'y avait pas assez de Ram.

@+
 Matt

<hr size="2" width="100%" />La paresse est la mère du génie...
http://www.delphilab.com
0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
29 août 2006 à 17:48
sans le code on peu pas t'aider.

mais si tu redimensionne le TImage il faut :
1) redimensionner le bitmap
2) dessiner dans le canvas du bitmap

Panel1.width  := 640;
Panel1.Height := 480;
Image1.Align  := AlClient;
with Image1.Picture.Bitmap do begin
     width  := Image1.width;
     height := image1.height;
     pixelFormat := pf24bit;
     with Canvas do begin
          Brush.Color := clBlack;
          FillRect(Image1.ClientRect);
     end;
end;

et quand on a juste besoin d'un canvas pour dessiner on utiliser PaintBox et non TImage.

<hr size="2" width="100%" />Croc (click me)
0
ffert
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009

29 août 2006 à 20:31
Merci pour vos réponses...


J'ai essayé la PaintBox qui effectivement me donne satisfaction pour la rapidité.


Mais si je met la paintbox dans une scrollbox.....

et que je déplace les ascenseurs.... le contenu de la paintbox
s'efface, il n'y a aucun refresh... (chose qui était géré en
automatique par le Timage)... et comme je ne sais pas comment
intercepter l'évènement de déplacement des ascenseur... je ne vois pas
comment forcer un refresh........


vue que je n'ai jamais utilisé de PaintBox, ai-je omis un élément, une
propriétés, ou quelque chose qui permette de conserver cette
fonctionnalité.

Merci...

Fabien FERT [:)]
www.sigmadia.fr.fm
0

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

Posez votre question
cs_Forman
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
30 août 2006 à 00:38
Il faut repeindre l'image sur le Canvas de la PaintBox à chaque fois que son événement OnPaint est appelé, pas seulement afficher le bitmap une seule fois au début. Et il peut être utile d'utiliser les propriétés Tracking=True et Smooth=True de la HorzScrollBar et VertScrollBar de la ScrollBox (de façon à ce que le réaffichage se fasse aussi pendant le tracking, pas seulement quand l'utilisateur relâche la souris).
0
ffert
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009

30 août 2006 à 15:42
désolé [auteurdetail.aspx?ID=10455 Forman]...  ceci
ne fonctionne pas... car si tu redessine l'image sur un OnPaint.. tu
crées un comportement récursif dans lequel il redessine en permanence...


et comme on ne peux pas capturer l'évènement de mouvement des ascenseur dans une scrollBox...

Je me suis dit, il ne reste qu'a enlever la scrollbox et mettre un
TscrollBar et gérer le rafraichissement sur l'évenement OnScroll (ou On
change)....


L'image est bien redessinée mais elle disparait tout de suite... en
fait elle n'apparait plus dés qu'on arrête de déplacer le scroll !!!

est-ce que ça vient du Panel ?? qui contient la PaintBox ?

La structure est :

TFrom

     -> TPanel

          -> TPageControl

               -> TTabSheet

                    -> TPanel

                        
-> TPaintBox


Est-ce que c'est ça qui m'efface le contenu de la PaintBox ???


Merci d'avance.. car la je calle...

Fabien FERT [:)]
www.sigmadia.fr.fm
0
ffert
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009

30 août 2006 à 17:18
oui j'ai supprimé la scroll box car ça ne me permettait pas d'intercepté les déplacement des ascenseurs... donc...

j'ai juste mis un TScrollBar dessous ma PaintBox. et je redessine les
éléments de ma PaintBox sur l'evenement onScroll... en plus il semble
que ce soit plus fluide que de mettre le PaintBox dans une ScrollBox.


Par contre, fait étrange : l'ensemble des éléments de mon TPanel (celui
qui est juste sur le Form), clignotent lors du déplacement de ma
scrollbar (les autres panel en dessous, les boutons, etc.... enfin tout
ce qui est en dessous de ce panel)... alors que les panel à coté
restent fixe eux !!!!


ça aussi c'est étrange....

Fabien FERT [:)]
www.sigmadia.fr.fm
0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
31 août 2006 à 16:17
si les panel clignotent :

Form1.DoubleBuffered := true;
PanelX.DoubleBuffered := true;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ScrollBox1.HorzScrollBar.Tracking := true;
  ScrollBox1.VertScrollBar.Tracking := true;
  ScrollBox1.DoubleBuffered         := true;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
var i,X,Y : integer;
begin
  with PaintBox1.Canvas do begin
     Brush.Color := clWhite;
     FillRect(PaintBox1.ClientRect);
     for i := 0 to 999 do begin
         Pen.Color := Random($FFFFFF);
         x := random(PaintBox1.Width);
         y := random(PaintBox1.Height);
         MoveTo(X,Y);
         x := random(PaintBox1.Width);
         y := random(PaintBox1.Height);
         LineTo(X,Y);
     end;
  end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  PaintBox1.Refresh;
end;

<hr size="2" width="100%" />Croc (click me)
0