Page 1 sur 1
Multiples CatchImage ?
Publié : mer. 29/janv./2020 8:02
par PhM
Bonjour,
J'ai une question concernant le chargement en data de plusieurs images (environ 30) à la suite.
Lorsque je fais cela, tout va bien :
Code : Tout sélectionner
;If CatchImage(1, ?Img_Start1, ?Img_End1 - ?Img_Start1) : EndIf
;If CatchImage(2, ?Img_Start2, ?Img_End2 - ?Img_Start2) : EndIf
;If CatchImage(3, ?Img_Start3, ?Img_End3 - ?Img_Start3) : EndIf
;If CatchImage(4, ?Img_Start4, ?Img_End4 - ?Img_Start4) : EndIf
;If CatchImage(5, ?Img_Start5, ?Img_End5 - ?Img_Start5) : EndIf
;If CatchImage(6, ?Img_Start6, ?Img_End6 - ?Img_Start6) : EndIf
;If CatchImage(7, ?Img_Start7, ?Img_End7 - ?Img_Start7) : EndIf
;If CatchImage(8, ?Img_Start8, ?Img_End8 - ?Img_Start8) : EndIf
MAIS, lorsque je tente de réduire la procédure avec cela, rien ne va plus ?
Code : Tout sélectionner
For i = 1 To 8
If CatchImage(i, ?Img_Start+i, ?Img_End+i - ?Img_Start+i) : EndIf
Next
Quelle serait la bonne solution d'après vous ?
Re: Multiples CatchImage ?
Publié : mer. 29/janv./2020 9:48
par Micoute
Bonjour phM, seule la première est valable, à moins de connaître l'adresse de chaque image, et dans ce cas on pourrait faire une procédure de chargement.
Re: Multiples CatchImage ?
Publié : mer. 29/janv./2020 11:47
par Mesa
Il faut faire attention à la doc:
Resultat = CatchImage(#Image, *AdresseMemoire [, Taille])
Quand un argument commence par #, comme #Image, alors cela indique une constante et jamais une variable. Tu ne peux donc pas utiliser un for i=... car i est une variable.
A moins d'utiliser #PB_Any.
A mon avis il faut que t'utilises des macro ou des procedures pour faire ce que tu veux faire.
M.
Re: Multiples CatchImage ?
Publié : mer. 29/janv./2020 14:49
par Marc56
Mesa a écrit :Il faut faire attention à la doc:
Resultat = CatchImage(#Image, *AdresseMemoire [, Taille])
Quand un argument commence par #, comme #Image, alors cela indique une constante et jamais une variable. Tu ne peux donc pas utiliser un for i=... car i est une variable.
Euh ? On peut remplacer #Image par une valeur numérique. D'ailleurs la doc dit « #Image : Le numéro d'identification de l'image. » "A number to identify the loaded image"
Preuve en modifiant l'exemple de la doc
Code : Tout sélectionner
OpenWindow(0, 0, 0, 500, 500, "CatchImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
i = 3
CatchImage(i, ?Image_Start, ?Image_End - ?Image_Start)
ImageGadget(0, 0, 0, 50, 50, ImageID(i))
j = 10
CatchImage(j, ?Image_Start2, ?Image_End2 - ?Image_Start2)
ImageGadget(1, 250, 250, 50, 50, ImageID(j))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
DataSection
Image_Start:
IncludeBinary #PB_Compiler_Home+"Examples\Sources\Data\Background.bmp"
Image_End:
Image_Start2:
IncludeBinary #PB_Compiler_Home+"Examples\Sources\Data\Geebee2.bmp"
Image_End2:
EndDataSection
Ce qu'on ne peut pas modifier, c'est le nom de l'adresse mémoire (impossible de faire une concaténation, style ?Img_Start"+i ou ?Img_Start" + Str(i)) ce qui empêche de faire une boucle.
Reste la possibilité de dupliquer la ligne
Re: Multiples CatchImage ?
Publié : mer. 29/janv./2020 14:49
par Zorro
je crois que Catchimage est en realité une directive de compilation
pas une fonction ....
avec Purebasic nous avons un compilateur 1 seule passe....
ce que tu proposes pourrai se faire si le compilo commençais par lire le code dans son entier avant de commencer a compiler
il prendrai en compte par "interpretation" les variables ....
mais pour ça il faudrai deja que la compilation se fasse en plusieurs Passes ....
ce n'est pas le cas en Purebasic .... (du moins a ce que j'en sais .. )
du coup , le compilo prend les lignes de code les une a la suite des autres ...
c'est pourquoi il ne tiens pas compte de ta boucle !
il applique le Catch***** au moment ou il le trouve ....
et comme l'adresse de ton image dans ta variable n'est pas connue..(puisque dependant de ta boucle ) il ne peut pas le faire
en esperant avoir été clair

Re: Multiples CatchImage ?
Publié : mer. 29/janv./2020 15:08
par Marc56
J'ai essayé quelques variantes, mais sans succès
Code : Tout sélectionner
OpenWindow(0, 0, 0, 500, 500, "CatchImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
For i = 1 To 3
CatchImage(i, Val("?Image_Start" + Str(i))) ; , ?Image_End - ?Image_Start)
ImageGadget(i, 0, 0, 50, 50, ImageID(i))
Next
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
DataSection
Image_Start1:
IncludeBinary #PB_Compiler_Home+"Examples\Sources\Data\Background.bmp"
Image_End1:
Image_Start2:
IncludeBinary #PB_Compiler_Home+"Examples\Sources\Data\Geebee2.bmp"
Image_End2:
Image_Start3:
IncludeBinary #PB_Compiler_Home+"Examples\Sources\Data\AlphaChannel.bmp"
Image_End3:
EndDataSection
Code : Tout sélectionner
[ERROR] CatchImageMulti_2.pb (Line: 4)
[ERROR] CatchImage(): The specified pointer is null.
J'ai l'impression qu'il peut y avoir une possibilité avec bidouille

(je ne me sert jamais de la taille de l'image donc mis en commentaire)
Re: Multiples CatchImage ?
Publié : jeu. 30/janv./2020 0:24
par Naheulf
Bonsoir,
Il peut être moyen de faire un truc avec les macros mais c'est pas sûr.
Autrement tu peut enregistrer en dur les position de début et de fin de chaque image :
Code : Tout sélectionner
OpenWindow(0, 0, 0, 500, 500, "CatchImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
*curseur = ?Image_Meta1
For i = 1 To 3
*debut = PeekI(*curseur) : *curseur + SizeOf(Integer)
*fin = PeekI(*curseur) : *curseur + SizeOf(Integer)
taille = fin - debut
CatchImage(i, *debut, *fin - *debut)
ImageGadget(i, 0, 0, 50, 50, ImageID(i))
*curseur = *fin
Next
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
DataSection
Image_Meta1:
Data.i ?Image_Start1, ?Image_End1
Image_Start1:
IncludeBinary #PB_Compiler_Home+"Examples\Sources\Data\Background.bmp"
Image_End1:
Image_Meta2:
Data.i ?Image_Start2, ?Image_End2
Image_Start2:
IncludeBinary #PB_Compiler_Home+"Examples\Sources\Data\Geebee2.bmp"
Image_End2:
Image_Meta3:
Data.i ?Image_Start3, ?Image_End3
Image_Start3:
IncludeBinary #PB_Compiler_Home+"Examples\Sources\Data\AlphaChannel.bmp"
Image_End3:
EndDataSection
Il vaut mieux transmettre la taille de l'image à CatchImage. ça peut éviter des mauvaises surprises quasiment sans surcoût.
Re: Multiples CatchImage ?
Publié : jeu. 30/janv./2020 8:58
par Marc56
Naheulf a écrit :Autrement tu peut enregistrer en dur les position de début et de fin de chaque image :
...
Whao, pas mal,

rapide et clair le code. Je mets ça de côté ça me servira peut-être un jour

Merci
Re: Multiples CatchImage ?
Publié : jeu. 30/janv./2020 10:56
par Zorro
donc , j'ai dis une connerie, une fois de plus ....
faut savoir reconnaitre ses propres faiblesses

Re: Multiples CatchImage ?
Publié : ven. 31/janv./2020 9:43
par Micoute
Non, ce n'est pas des conneries, mais un manque de pratique et c'est paradoxal avec le nombre de postes que tu as laissés sous différents avatars.
Re: Multiples CatchImage ?
Publié : ven. 31/janv./2020 13:42
par Ar-S
Excellent trick Naheulf
