Page 1 sur 1

question a propos de #pb_any

Publié : sam. 07/févr./2009 12:40
par Backup
voila j'utilise ce genre de code

Code : Tout sélectionner

im_extrait=GrabImage(#Image_theme_bouton_defaut, #PB_Any, gbouton_x, gbouton_y, wbouton, hbouton) ; recupere un bout d'image correspondant a l'
comme vous voyez, une image est creé, et a comme index "im_extrait"

ensuite je peux attribuer mon image "im_extrait" comme je le veux :

Code : Tout sélectionner

SetGadgetAttribute(onglet()\bouton[tt], #PB_Button_Image,ImageID(im_extrait)); on met notre image theme	




jusque là pas de problemes , mais voila ....

imaginez que j'ai a utiliser cette meme fonction plusieurs fois
mais entre temps bien sur #Image_theme_bouton_defaut ne pointe plus la meme image ...


que deviennent les images prededement crees ??? 8O


ben je crois bien qu'elle reste en RAM !!!


il faudrai pouvoir faire un freeimage(im_extrait)
apres un


Code : Tout sélectionner

SetGadgetAttribute(onglet()\bouton[tt], #PB_Button_Image,ImageID(im_extrait))

sans que ce freeimage special n'efface l'image du bouton
mais qu'il nettoie la Ram , un peu comme un garbage collection
qui se chargerai de virer les images crees par #pb_any
et qui ne sont plus utilisé par le programme


je sais pas si je suis tres clair :lol:



mais pour résumer (pour Chris :lol: )

#pb_any , cree des choses en Ram a la demande , mais il n'y a rien
pour effacer ces choses crees !!

je trouve donc que #pb_any est dangereux a utiliser !!

la prog a l'ancienne , on faisait un tableau d'éléments fini
qu'on réutilisaient a loisir , toujours les même index !!

lorsque ceux ci ne servaient plus on mettais un 0
et basta,

avec #pb_any , on creer facilement , mais pour gerer ce qu'il deviens apres ???

alors bien sur si c'est pour creer un system de gestion des "objets" crees par #pb_any , autant gerer des index fini et connu a l'avance
(Dim() ) non ?

8O 8O 8O 8O

Publié : sam. 07/févr./2009 12:52
par Le Soldat Inconnu
l'astuce est la suivante

il faut tester si l'image existe ou non

En gros ca donne ça

Code : Tout sélectionner

If IsImage(Image)
  GrabImage(ImageSource, Image, ....)
Else
  Image = GrabImage(ImageSource, #PB_Any, ....)
EndIf
SetGadgetState(#GadgetImage, ImageID(Image))
c'est le plus propre

après on peut faire plus sauvage dans ce genre

Code : Tout sélectionner

If IsImage(Image)
  FreeImage(Image)
EndIf
Image = GrabImage(ImageSource, #PB_Any, ....)
SetGadgetState(#GadgetImage, ImageID(Image))
Cette solution est plus simple mais plus barbare dans le sens ou ton gadget n'a plus d'image pendant un petit laps de temps.

Publié : sam. 07/févr./2009 12:55
par Backup
ha !!! 8O

bon faut que je regarde ça 20 fois pour assimiler :lol:

Merci :)

Publié : sam. 07/févr./2009 20:35
par Le Soldat Inconnu
ben si j'ai bien compris, l'image de ton bouton change souvent, et a chaque fois, tu en refais une sans effacé la précédente.

Donc quand tu as besoin d'une image avec #PB_Any, et que cette image doit être recréée, il faut :

- soit détruire l'ancienne et en refaire une avec #Pb_any (ma solution barbare)

- Soit tester si l'image existe, si tel est le cas, on redessine par dessus, sinon, on l'a crée avec #pb_any

Publié : sam. 07/févr./2009 20:35
par Ollivier
#PB_Any n'empêche pas de faire un tableau, une liste ou autre... Au contraire, il faut toujours gérer comme avec les constantes. Seulement #PB_Any t'évite de gérer les «objets» par un numéro particulier mais par une variable. Donc, tu as une petite économie de temps à la création d'un objet puisque tu ne dois pas gérer une éventuelle insertion (dans ce cas, sans #PB_Any, tu te retrouves à décaler le numéro de x objets avant de pouvoir insérer le nouveau venu).

Aussi #PB_Any, c'est la compatibilité de plusieurs codes gérant une même sorte d'objets. Si tu dois piocher trois codes créant une fenêtre n°0 de trois manière différentes, c'est la galère. Tu dois remplacer les numéros sur deux des trois codes avant que ça marche. Alors que si les 3 codes ont des handles dynamiques avec #PB_Any, aucun problème pour piocher divers codes sans avoir à les corriger.