Multiples CatchImage ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Multiples CatchImage ?

Message 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 ?
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Multiples CatchImage ?

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Mesa
Messages : 1098
Inscription : mer. 14/sept./2011 16:59

Re: Multiples CatchImage ?

Message 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.
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Multiples CatchImage ?

Message 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
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Multiples CatchImage ?

Message 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 :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Multiples CatchImage ?

Message 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 8) :?:
(je ne me sert jamais de la taille de l'image donc mis en commentaire)
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Multiples CatchImage ?

Message 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.
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Multiples CatchImage ?

Message 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, :o rapide et clair le code. Je mets ça de côté ça me servira peut-être un jour 8) Merci
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Multiples CatchImage ?

Message par Zorro »

donc , j'ai dis une connerie, une fois de plus ....
faut savoir reconnaitre ses propres faiblesses :lol:
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Multiples CatchImage ?

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Multiples CatchImage ?

Message par Ar-S »

Excellent trick Naheulf :P
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre