Page 1 sur 1

Comportement de #PB_Any

Publié : mar. 25/août/2009 11:48
par poshu
J'ai constaté que #PB_any sortait des ID assez élevé (comprendre loin de 0), mais c'est assez flou comme comportement; aussi, j'ai quelques questions:

Est-ce que les ID de #PB_any sont TOUJOURS élevé (dur de vérifier ça dans des tests)?
Est-ce que je peux définir que #PB_Any pour les gadget (par exemple) donne une ID strictement supérieure à un chiffre?
Avez vous déjà eu des problèmes en utilisant conjointement #PB_Any et des ID définies manuellement?

Merci d'avance ^^.

Publié : mar. 25/août/2009 11:51
par Anonyme
C'est vrai que j'avais eu des soucis avec cette "constante"
c'était avec l'utilisation des sprites , l'id était trop haut...
impossible de reproduire la chose par contre
:cry:

Re: Comportement de #PB_Any

Publié : mar. 25/août/2009 13:56
par gnozal
poshu a écrit :J'ai constaté que #PB_any sortait des ID assez élevé (comprendre loin de 0)...
A mon avis, c'est pour éviter une collision avec des ID non générées par #PB_Any (= choisies manuellement).
D'ailleurs le débogueur affiche un avertissement si une ID choisie est > 10000.
Donc pas d'ennuis si on utilise les 2 (#PB_Any et ID prédéfini) : je le fais couramment.

Publié : mer. 26/août/2009 4:10
par poshu
Merci gnozal ^^

#PB_any et pas si "any"..

Publié : dim. 30/août/2009 1:19
par GeBonet
Bonsoir,
Au sujet des ID, (et donc de #PB_Any) je viens d'écrire un petit code qui peut-être utile...

Aussi pour comprendre les affectations des ID...
Que l'on peut rendre Dynamique !
Voici, voilà... :lol:

Code : Tout sélectionner

; ============================================================================== 
;  -       Saisie  dans  "InputRequester MultiLigne"        -                                       PureBasic Version 4.31 & 4.40
;         -----------------------------------------------------                                                                                29-08-2009
;           OU Fenetre à champs variable...                                                                                                GeBonet                        
; ============================================================================== 
;   Le BUT ici est de disposer d'un moyen d'appeler une fenêtre qui se dimensionne SEULE en fonction du
;    nombre d'éléments demandé... Et évidement qui renvois les réponses correspondantes aux points envoyés. 
; 
;   Soit un espèce de "InputRequester" multiple...  ===> OU FENETRE qui se forme seule   :-))
;
;                                 Pour lequel on donne : Un titre, une position d'affichage (x,y) la table de question, la tabe
;                                                                      pour les réponses et le nombre de point à montrer et à remplir.... 
; 
;  SOIT comme ci-après => PointFenetre(NomEntete$ ,IniX ,IniY , Array Quest.s(1), Array Rep.s(1), A_Remplir)  
;   
;  On pourrait y ajouter des exigeances comme demander la couleur de fond, des caractères, la police ou encore 
;  le type à saisir (Alpha ou Numérique, voir réponse visible ou non (mots de passe) longueur maxi etc.  
; 
; ============================================================================== 
;  Mais l'intérêt PRINCIPAL ICI est de montrer l'aspect dynamique des affectations de Gadget !!! 
;  --------- 
;  AUSSI avec l'utilisation exclusive d'instructions PureBasic... 
; ============================================================================== 
Enumeration 
    #Fenetre_Champ       ; Constante de la fenêtre qui sera utilisé...
    #DebutChamps          ; Constante de Base pour le 1er Gadget d'affichage de la table des questions. 
    ;                                     CETTE CONSTANTE SERVIRA de BASE d'incrémentation pour fournir 
    ;                                     le n° unique des questions suivantes s'il y a lieu.
    ; 
    #AutrePoint=50          ; Constante de départ d'un AUTRE POINT de constante dynamique !!!
    ;  ********************************************************************************************************************
    ;#bouton_valide          ; Ne serons pas utilisé comme tels car comme les gadgets suivants seront affectés 
    ;#bouton_annule        ; dynamiquement ils risquent alors de prendre une valeur de constante existante et 
                                       ; donc de ne pas être affiché... d'ou !!! 
                           ;
                           ; LA REGLE :       Lorsque l'on attribue des ID de gadget dynamiquement ils doivent   
                           ;     commencer à un point connu (ici "#DebutChamps") puis rester sous contrôle du 
                           ;     programme jusqu'a l'autre Constante identifié qui servirait de départ d'un autre point.
                           ;     Comme par exemple ICI : "#AutrePoint"
                           ;  -----------------------------------------------------------------------------------------------------------------
    #bouton_valide =70   ;  Ou alors une Affectation qui dans ce cas ci ne risque pas d'entrer en contact d'autres...
    #bouton_annule=71   ;  Idem ...
                                       ;
EndEnumeration          ;           Les problèmes sont souvent issus de détails...  Ou de manque d'info claire !!!                 
;-------------------------------------------------------------------------------------------------------------------------------------------------------
Define Nombre.i, IniX.i, IniY.i

Nombre=6                      ; Nombre d'éléments MAXIMUM du tableau des données pouvant-être saisie...

Dim Quest.s(Nombre)      ; Table des Questions 
Dim Rep.s(Nombre)      ; Table des Réponses correspondante 
;-------------------------------------------------------------------------------------------------------------------------------------------------------

Declare PointFenetre(NomEntete$, IniX , IniY , Array Quest.s(1) , Array Rep.s(1) ,Nombre)  
;-------------------------------------------------------------------------------------------------------------------------------------------------------
    
    ;  ------------ Question ? --------------<  On pourrait aussi avec une deuxième dimension et le point 0    >-----------------
    ; Le tableau des questions ou libellé...  
    Quest(0) = "Nom prenom"              ;        Quest(0,0) =   Type  parmis ceux ci ou plus limité... 
    Quest(1) = "Adresse +N°"              ;         Type =0  => Alphanumérique
    Quest(2) = "Code Postal"               ;         Type =1  => Numérique ENTIER Long
    Quest(3) = "Localité"                      ;         Type =2  => Numérique Quad 
    Quest(4) = "Pays"                          ;         Type =3  => Numérique Double/Flottant
    Quest(5) = "Adresse Email"           ;         Type =4  => Mots de Passe (Invisible (*******))
    ;  -----------------------------------------         ---------------------------------------------------------------
    For i=0 To Nombre:Rep(i) = "":Next i   ; Mise à zéro de la table des réponses..
    ;  -----------------------------------------         ----------------------------------------------------------------
    NomEntete$="Identification"                   ; Titre de la fenetre     
    IniX=400:IniY=200                                   ; Position sur l'écran  
    Appel=3                                                   ; Nombre d'élément du tableau à utiliser...   C'EST ICI QU'ON DIT COMBIEN
    ;
    If Appel>Nombre:Appel=Nombre:EndIf ; Je m'auto-contrôle :-))
    ;  ---------------------------------------------------------------------------------------------------------------
    ;    Appel de la procedure   <<===============
    Resultat=PointFenetre(NomEntete$, IniX ,IniY, Quest.s() , Rep.s() , Appel)  ; Appel de la procédure....  
    ;   Retour des réponses...  <<===============
     Debug "Retour Procedure : "+Str(Resultat):Debug "--------------------------------"
    ;  ---------------------------------------------------------------------------------------------------------------
    ; Affichage des réponses saises en fonction de "Appel"                                                 
    For i=0 To Nombre:Debug Rep(i):Next i                                                                      
    ;                                                                                                                                           
End
; *************************************** FIN *************************************************
                                                                                                                                           
;                                                                                 
                                                                                                                                              
; *********************************************************************************************
; >>>>>>>>>>                      Fenêtre Commune de question                      <<<<<<<<<<
; 
; *********************************************************************************************
Procedure PointFenetre(Titre$, IniX , IniY , Array Quest.s(1) , Array Rep.s(1) ,Nombre)     
                                                                                                                                               
    For i=0 To Nombre           ; Determination du champs le plus long                               
        If Lmax<Len(Quest(i)):Lmax=Len(Quest(i)):EndIf                                                             
    Next i                                                                                                                                
    ;-----------------------------  Calcul des dimensions -------------------------------------                
    HauteurBouton    = 20                                                                                                       
    Largeur_fenetre  = (100+Lmax)*2+20                      ; Largeur de la fenêtre                     
    Hauteur_Fenetre= Nombre*30+HauteurBouton+50 ; Hauteur de la fenêtre (50 = 30 titre + 20 interligne avant boutons ! )
    PosYBouton       =Hauteur_Fenetre-30                     ; Position Y des boutons                 
    ;---------------------------------------------------------------------------------------------------              
    ;                                                                                                                                          
    WindWid=Largeur_fenetre : WindHigh=Hauteur_Fenetre :  Cas=0                                 
    ;  ; Fenetre d'interrogation multibox ...                                                                                
    If OpenWindow(#Fenetre_Champ,IniX,IniY,WindWid,WindHigh,"",#PB_Window_BorderLess)
        SetWindowColor(#Fenetre_Champ,$0AFAF5)    ; Colorier la fenêtre                           
        StickyWindow(#Fenetre_Champ, 1)                                                                              
        ;                                                                                                                                       
        Milieu=WindWid/2                                            ; Milieu de la Largeur_fenetre                
        PosYDep=35                                                    ; Position départ                                    
        PosY=PosYDep                                               ; Position Y                                            
        ; -------------------------------------   Titres ------------------------------------------------               
        TextGadget(#DebutChamps,40, 5, Milieu+50,25,Titre$)                                              
        SetGadgetFont(#DebutChamps+j,LoadFont(#DebutChamps+j, "Arial", 18))              
        SetGadgetColor(#DebutChamps+j,#PB_Gadget_BackColor, $0AFAF5)                    
        SetGadgetColor(#DebutChamps+j,#PB_Gadget_FrontColor, $E25048)                    
        ; ---------------------------------  Question et champs pour réponses --------------              
        For j=1 To Nombre                                                                                                       
            Texte$=Trim(Quest(j-1))                                                                                           
            TextGadget(#DebutChamps+j,10, PosY, Milieu-15,20,Texte$)    ; Attention ici les ID sont attribué dynamiquement ! 
            StringGadget(#AutrePoint+j, Milieu, PosY,Milieu-10,20,"")            ; Attention ici les ID sont attribué dynamiquement ! 
                ; 
                SetGadgetFont(#DebutChamps+j,LoadFont(#DebutChamps+j, "Arial", 12))
                SetGadgetColor(#DebutChamps+j,#PB_Gadget_BackColor, $0AFAF5)
                SetGadgetColor(#DebutChamps+j,#PB_Gadget_FrontColor, $E25048)
            PosY+30
        Next J
        SetActiveGadget(#AutrePoint+1)                                                       ; Active le premier champs 
        ; -----------------------------------------------------------------------------------------------
        BoutonVal=#AutrePoint+j  ; ICI j'affecte au "Bouton" une ID Dynamique pour l'exemple
        ;
        ButtonGadget(BoutonVal,10,PosYBouton,100,20,"Valider",#PB_Button_Toggle)     
        ButtonGadget(#bouton_annule,Largeur_fenetre-120,PosYBouton,100,20,"Annuler",#PB_Button_Toggle)
        ;   Et ICI c'est "#bouton_annule" 
        ; -----------------------------------------------------------------------------------------------    
    EndIf                
;   ********************************************************************************************
    Repeat
        Select WaitWindowEvent (#Fenetre_Champ)       ; Traite les boutons....
             Case #PB_Event_Gadget
                 Select EventGadget ()                                   ; Selectionne en fonction de ....???
                    ; -----------------------------------------------------------------------------------
                    Case BoutonVal                                          ; VALIDE  pour MODIF ou AJOUT 
                        ;
                        For j=1 To Nombre                                 ; Récupère les données dans le tableau 
                            Rep(j-1)=GetGadgetText (#AutrePoint+j)     
                        Next J       
                        Fermer_window1=1 :Cas=1
                        ; --------------------------------------------------------------------------------  
                    Case #bouton_annule ;BoutonAnul             ; Annule l'entrée
                        Fermer_window1=1 :Cas=9
                        ; --------------------------------------------------------------------------------    
                EndSelect
        EndSelect
    Until Fermer_window1=1
    StickyWindow(#Fenetre_Champ,0) 
    CloseWindow (#Fenetre_Champ)                             ; Fermeture de la fenêtre ajoute...
    ; ---------------------------------
    ProcedureReturn Cas
    ;
EndProcedure 
;**************************************************************************************************************************

Publié : dim. 30/août/2009 11:39
par Le Soldat Inconnu
Jamais eu de problème en mélangeant ID fixe et avec #PB_Any

Publié : dim. 06/sept./2009 14:21
par Fred
Il n'y pas de probleme de mixage, c'est fait pour.

Publié : dim. 06/sept./2009 15:15
par Anonyme
non , mais il m'est arrivé d'avoir un grand id généré via #pb_any , avec une utilisation conjonte avec les sprite 3D sous windows.
une erreur d'exécution en découlais...
mais cela dit , ca fait longtemps , & jai pas revu le phénomène pour le moment.