question a propos de #pb_any

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

question a propos de #pb_any

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ha !!! 8O

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

Merci :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message 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.
Répondre