Générer des #Gadget selon un fichier .ini (ou variable)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Générer des #Gadget selon un fichier .ini (ou variable)

Message par Shinao »

Bonjour,

Voila, je voudrais qu'une liste d'image se crée en fonction du nombre de ligne que j'ai dans un fichier .ini (pour faire simple).

Le problème que j'ai, c'est comment faire une boucle pour générer l’énumération ?
De même pour les evenements de ces ImagesGadget() ?

Par exemple je ne peux pas faire :

Code : Tout sélectionner

Enumeration
#ImageListe + "dsqdqsd"
EndEnumeration
Ni

Code : Tout sélectionner

ImageGadget(#MonImage+i, ....)
En bref, faire que le nom de mon gadget change en fonction d'une variable, seulement PureBasic n'aime pas.

Est-ce possible ou comment faire le même rendu mais avec une autre solution ?


Merci d'avance
Avatar de l’utilisateur
Ouaf-Ouaf
Messages : 212
Inscription : dim. 11/juil./2004 9:07

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Ouaf-Ouaf »

Shinao a écrit :Bonjour,

Voila, je voudrais qu'une liste d'image se crée en fonction du nombre de ligne que j'ai dans un fichier .ini (pour faire simple).

[...] Par exemple [...]

Code : Tout sélectionner

ImageGadget(#MonImage+i, ....)
Est-ce possible ou comment faire le même rendu mais avec une autre solution ?

Merci d'avance
Bonjour,

Si la première méthode me parait clairement inappropriée, la seconde ( celle citée ici ), me semble tout à fait valable.. Tant que la valeur de i est bien numérique et non textuelle ( comme ça semble être le cas pour la méthode 1 )

Si par "le nom du gadget" vous entendez obtenir par exemple comme résultat :

Code : Tout sélectionner

ImageGadget(#MonImage_Nomimage01, ....)
ImageGadget(#MonImage_Nomimage02, ....)
ImageGadget(#MonImage_Nomimage03, ....)
C'est que vous faites une méprise sur la nature des constantes !
Dans l'optique de fonctionner avec un index textuel (et dans le cas ou ce serait nécessaire), il faudrait utiliser un tableau de type "Map".

Mais il est également envisageable de créer une liste dynamique, avec ou sans structure, selon le nombre d'informations utiles.


Pouvez vous fournir une portion de code un peu plus complète ?
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Ar-S »

Je ne sais pas si c'est ce que tu cherches mais c'est l'impression que ça donne.
Imaginons qu'il y ai 5 lignes donc que ton interface doit créer 5 imagegadget.

Code : Tout sélectionner

UsePNGImageDecoder()
Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Image_Image_0
  #IMG_GADGET
EndEnumeration

If CreateImage(#Image_Image_0, 16, 16)
  
  StartDrawing(ImageOutput(#Image_Image_0))
    Box(0,0,16,16,$00CCFF)
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
  
EndIf

Global NbrLigne
NbrLigne = 5 ; => Ton Nombre de ligne
Position = 5

If OpenWindow(#Window_0, 560, 227, 443, 158, "Win", #PB_Window_SystemMenu|#PB_Window_TitleBar)
  
  For i=1 To NbrLigne
    ImageGadget(#IMG_GADGET+i, Position, 20, 16, 16, ImageID(#Image_Image_0))
    Position+25
    Debug "Image "+Str(i)+" : Gadget numéro "+Str(#IMG_GADGET+i)
  Next i
  
EndIf

Repeat
  Select WaitWindowEvent()
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Break
      EndSelect
  EndSelect
ForEver
~~~~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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Kwai chang caine »

Moi pour ce genre de travail, je fait un tableau de "PbId" (Identificateur PB), un peu comme dans VB avec ses groupes de contrôles :roll:
Comme ça tu as tout loisir d'appeler chacun des gadget en creant un tableau pour les images "ImageId()" , un pour les boutons "BoutonId()", etc...
Ou alors creer un tableau a deux dimensions, dans lequel tu fourres tous les ID :D

Code : Tout sélectionner

Enumeration
 #GadgetBoutons
 #GadgetImages
 #GadgetText
 etc ...
End Enumeration

TabloId(x, #GadgetBoutons) ; Contient tous les ID des boutons
TabloId(x,  #GadgetImages) ; Contient tous les ID des images
etc ...
En recuperant la jolie image de Ar-s, et avec un tableau une dimension, ça donne ça :

Code : Tout sélectionner

NbreElement = 10
Dim PbId(NbreElement)

If CreateImage(0, 16, 16)
 
  StartDrawing(ImageOutput(0))
    Box(0,0,16,16,$00CCFF)
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
 
EndIf
  
If OpenWindow(0, 560, 227, 300, 300, "Cette fenetre contient " + Str(NbreElement) + " éléments", #PB_Window_SystemMenu|#PB_Window_TitleBar)
 
 For i = 1 To NbreElement
  PbId(i) = ImageGadget(#PB_Any, x + (i*20), y+(i*20), 16, 16, ImageID(0))
  Debug "Le ''PbId'' de l'image n°" + Str(i) + " est " + Str(PbId(i))
 Next
 
EndIf

Repeat  
 Evenement = WaitWindowEvent() 
Until Evenement = #PB_Event_CloseWindow
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Shinao »

Yeah! Merci pour ces réponses

Je ne savais pas que l'on pouvait mettre une variable numérique à la suite des constantes, très utile, j'essayais de le bourrer avec mes strings.
Cependant, je ne comprend pas comment ce code est possible :

Code : Tout sélectionner

UsePNGImageDecoder()
Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Image_Image_0
  #IMG_GADGET
EndEnumeration

If CreateImage(#Image_Image_0, 16, 16)
 
  StartDrawing(ImageOutput(#Image_Image_0))
    Box(0,0,16,16,$00CCFF)
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
 
EndIf

Global NbrLigne
NbrLigne = 5 ; => Ton Nombre de ligne
Position = 5

If OpenWindow(#Window_0, 560, 227, 443, 158, "Win", #PB_Window_SystemMenu|#PB_Window_TitleBar)
 
  For i=1 To NbrLigne
    ImageGadget(#IMG_GADGET+i, Position, 20, 16, 16, ImageID(#Image_Image_0))
    Position+25
    Debug "Image "+Str(i)+" : Gadget numéro "+Str(#IMG_GADGET+i)
  Next i
 
EndIf

Repeat
  Select WaitWindowEvent()
     
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Window_0
          CloseWindow(#Window_0)
          Break
      EndSelect
  EndSelect
ForEver
Sans au préalable avoir mis tout les #IMG_GADGET+i dans l'Enumeration.... ?!
Car seul #IMG_GADGET tout court à une valeur, alors comment est-ce possible ? Wizard ?


De plus je ne connaissais pas le PbId(), je vais étudier ça sèrieusement demain... d'ailleurs le #PB_Any que j'avais tout simplement oublié (inutile dans ce cas la car je change son etat au cours du prog' mais toujours utile à savoir).

Bref, je vais essayer les diverses solutions cités et opté pour celle qui me paraît la plus simple à mettre en oeuvre, je vous tiens au courant si ça ne fonctionne pas (du moins, que je suis encore trop limité pour concrétisé vos idées chers collègues PureBiens) :D


Merci encore !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Backup »

deja t'es pas obligé d'utiliser une constante pour un gadget !

tu peut utiliser une variable toute simple

tu peux utiliser un tableau , ou bien une liste chainée, une structure , bref tout ce qui peut
servir de memoire pour retenir le numero que tu attribut a ton gadget !!

bref tout ceci est valable :

Code : Tout sélectionner

ImageGadget(#IMG_GADGET+i, Position, 20, 16, 16, ImageID(#Image_Image_0))
ou

Code : Tout sélectionner

ImageGadget(Toto, Position, 20, 16, 16, ImageID(image))
ou

Code : Tout sélectionner

ImageGadget(Toto(i), Position, 20, 16, 16, ImageID(image(i)))
etc ...

pour les constantes "enumeration" n'est pas une obligation !
c'est juste plus pratique

tu peut initialiser une constante comme une variable

#contante = 8
ou aussi
#constante$ ="toto"
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Shinao »

J'ai oublié mes bases, crazy.

Thanks
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Geo Trouvpatou »

Mais attention avec la méthode d'Ar-s, parce que du coup, si tu ajoutes comme je l'ai fait un bouton juste après #IMG_GADGET dans l'Enumeration, alors celui-ci est bouffé
Vu que : #SuperBouton vaut 3 et que le 1er ImageGadget vaut 3 aussi.
Cela peut être source d'erreur.

Code : Tout sélectionner

UsePNGImageDecoder()
Enumeration
      #Window_0
EndEnumeration

Enumeration
      #Image_Image_0
      #IMG_GADGET
      #SuperBouton ; Vaut 3
EndEnumeration

If CreateImage(#Image_Image_0, 16, 16)
      
      StartDrawing(ImageOutput(#Image_Image_0))
      Box(0,0,16,16,$00CCFF)
      StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
      
EndIf

Global NbrLigne
NbrLigne = 5 ; => Ton Nombre de ligne
Position = 5

If OpenWindow(#Window_0, 560, 227, 443, 158, "Win", #PB_Window_SystemMenu|#PB_Window_TitleBar)
      ButtonGadget(#SuperBouton, 10, 10, 200, 22, "Super Bouton") ; -----------------> Ce bouton est bouffé.
      For i=1 To NbrLigne
            ImageGadget(#IMG_GADGET+i, Position, 20, 16, 16, ImageID(#Image_Image_0))
            Position+25
            Debug "Image "+Str(i)+" : Gadget numéro "+Str(#IMG_GADGET+i)
      Next i
      
EndIf

Repeat
      Select WaitWindowEvent()
                  
            Case #PB_Event_CloseWindow
                  Select EventWindow()
                        Case #Window_0
                              CloseWindow(#Window_0)
                              Break
                  EndSelect
      EndSelect
ForEver
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Ar-S »

C'est vrai que pour ce genre de fonction, il suffit pour être tranquille de séparer les énumérations en gardant les gadgets "dynamiques" à la fin (à partir de 100 par exemple).

Code : Tout sélectionner

UsePNGImageDecoder() 
Enumeration 
	#Window_0 
	#Image_Image_0 
	#SuperBouton  
EndEnumeration 

Enumeration 100
  #IMG_GADGET 
EndEnumeration

If CreateImage(#Image_Image_0, 16, 16) 
  
	StartDrawing(ImageOutput(#Image_Image_0)) 
    Box(0,0,16,16,$00CCFF) 
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it ! 
  
EndIf 

Global NbrLigne 
NbrLigne = 5 ; => Ton Nombre de ligne 
Position = 5 

If OpenWindow(#Window_0, 560, 227, 443, 158, "Win", #PB_Window_SystemMenu|#PB_Window_TitleBar) 
	ButtonGadget(#SuperBouton, 10, 10, 200, 22, "Super Bouton") ; -----------------> Ce bouton est bouffé. 
	For i=1 To NbrLigne 
    ImageGadget(#IMG_GADGET+i, Position, 20, 16, 16, ImageID(#Image_Image_0)) 
    Position+25 
    Debug "Image "+Str(i)+" : Gadget numéro "+Str(#IMG_GADGET+i) 
  Next i 
  
EndIf 

Repeat 
	Select WaitWindowEvent() 
      
    Case #PB_Event_CloseWindow 
      Select EventWindow() 
        Case #Window_0 
          CloseWindow(#Window_0) 
          Break 
      EndSelect 
  EndSelect 
ForEver
Ainsi même si tu ajoutes des gadgets dans la partie enumeration des gadgets "statiques", les images seront toujours = 101, 102, 103 etc..
~~~~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
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Shinao »

Merci pour vos réponses !

J'en ai tout de même une dernière, comment je peux faire varier le nom d'une constante avec une variable ?

Du genre concaténé le #Imagebla avec le chaîne de caractère "bla".

Est-ce possible ?

Merci encore
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Backup »

...................
Dernière modification par Backup le sam. 01/oct./2011 9:46, modifié 1 fois.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par GallyHC »

Il faut inventer les constantes, variables et les variables, contantes lolll non je rigole. La bonne chose a faire est en fonction des informations que l'on a. Si une seule information, un tableau est bien si plus un tableau avec une struture est mieu.

Je vais voir ce que je peux te proposer demain car la pas mal de chose a faire :)

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Shinao »

Merci pour les réps !

Je lirais ça attentivement demain matin, car ma tête surchauffe.
Et ferais part de ce que j'ai fais pour savoir si il y a moyen d'opti' ou autre, bref, j'ai du boulot à faire avant de trouver le bon résultat...

Ty
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: Générer des #Gadget selon un fichier .ini (ou variable)

Message par Shinao »

Hello, donc voici ce que j'ai fais, pour adapater à mes besoins :

Code : Tout sélectionner

Global GID.i = 1000

Code : Tout sélectionner

Procedure.i GID()
  GID = GID + 1
  ProcedureReturn GID
EndProcedure
Et donc pour mes gadgets :

Code : Tout sélectionner

Frame3DGadget(GID(), 10, 12, 145, 150, Programmes(NbLogDisplay)\programme$)
C'est le GID() qui est important ici, pas la structure ^^

Bref, merci pour vos réponses, ça m'a beaucoup aidé !
Répondre