Page 1 sur 2

Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 9:59
par jmg49
Bonjour,

j'ai bricolé un petit outil réseau qui affiche ip WAN, LAN , nom du poste ; il doit y en avoir déjà des centaines comme ça , c'est pour mon usage personnel,
c'est pour travailler la gestion des évènements dans les forms, étant habitué aux frameworks de dev où il suffit de cliquer dans le gadget edit pour que la fonction se créée auto dans le code, je voulais voir ce que ça peut donner en PB,

Je rencontre un problème très simple (grrrrr ! ) j'ai sur un buttongadget en txt l'url du site web pour récupérer l'ip WAN, je ne connais pas d'autres possibilité que de parser dans une page web ;

Pour l'ip Lan, je pensais taper dans l'API windows ou le registre, enfin plein de solutions pour ça mais oh surprise il existe ExamineIPAddresses() et NextIPAddress() !! on va donc pas réinventer la roue,

pour le WAN
quand je clique sur le bouton, je veux que l'url change, de http://www.monip.fr à http://www.monip.org par ex,
j'arrive à le faire changer mais sur 5 possibilités mon prog reste bloqué sur le deuxième choix,

je poste mon code, si vous pouvez m'éclairer !! je vous en remercie d'avance,

Code : Tout sélectionner

;PureBasic 
;Basic Net tool 
;JmG49@2014





Enumeration 0 ; Id. Fenêtres
  #FENETRE1
EndEnumeration

Enumeration 0 ; Id. Gadgets
   #FEN1_GETIP
   #FEN1_QUIT 
   #FEN1_SITE
   #FEN1_edit1
   #FEN1_edit2
   #FEN1_edit3
   #FEN1_edit4
EndEnumeration
 

InitNetwork()


Global Buffer.s

site0.s ="www.monip.org"
site1.s ="www.monip.fr"
site2.s ="www.monip.eu"
site3.s ="www.frameip.com"
site4.s ="www.hostip.fr"

 
If OpenWindow(#FENETRE1, 320, 200, 570, 150, "PureBasic - Network Utility: IP Adresses (JmG@2014)", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
   
   
      ButtonGadget(#FEN1_GETIP, 200, 10, 130, 20, "Get Ip")
      ButtonGadget(#FEN1_QUIT, 350, 10, 70, 20, "Quit")
      ButtonGadget(#FEN1_SITE, 10, 10, 170, 20, site0.s)
      EditorGadget(#FEN1_edit1, 120, 40, 150, 20)
      EditorGadget(#FEN1_edit2, 300, 40, 160, 20)
      EditorGadget(#FEN1_edit3, 120, 80, 150, 20)
      EditorGadget(#FEN1_edit4, 300, 80, 160, 20)
      TextGadget(#PB_Any, 0, 40, 100, 20, "  Local IP Address")
      TextGadget(#PB_Any, 0, 80, 100, 20, "  Wan IP Address")
      
    EndIf
  
    
Procedure GetWanIp()
  Protected Ip.s, IP1.i, IP2.i, IP3.i,IP4.i
 
  IP = StringField(Trim(Mid(Buffer, 1, 15)), 1, "<")
 
  IP1 = Val(StringField(IP, 1, "."))
  IP2 = Val(StringField(IP, 2, "."))
  IP3 = Val(StringField(IP, 3, "."))
  IP4 = Val(StringField(IP, 4, "."))

  ProcedureReturn MakeIPAddress(IP1, IP2, IP3, IP4)
EndProcedure    
    
    
    
Procedure Initweb()
   
   Protected File.l
 
  ReceiveHTTPFile(GetGadgetText(#FEN1_SITE), "index.php")
 
  File=ReadFile(#PB_Any, "index.php")
 
  If File
    While Eof(File)=0
      Buffer=ReadString(File)
      If FindString(Buffer, "IP :")
        Buffer=Trim(Mid(Buffer, 40))
      EndIf
    Wend
    CloseFile(File)
  EndIf
EndProcedure 
  


Procedure.s GetIp() 
    
    If InitNetwork()   
      
      ExamineIPAddresses()
      
      Result2 = NextIPAddress()
      
      ProcedureReturn IPString(Result2)
    
  EndIf



    
EndProcedure    
    
  
 Repeat
      
      Evenement.l = WaitWindowEvent()
      
      Select EventWindow()
         
          ;==============================================
         ;-EVENTS
          ;==============================================
         
 Case #FENETRE1
         
     Select Evenement
            
                Case #PB_Event_Gadget
            
     Select EventGadget()
                
                Case #FEN1_QUIT
                
                  result = MessageRequester("Dialog", "Do you really want to quit ?", #PB_MessageRequester_YesNo )
                  
                  If result= 6 
                
                Break
                
              EndIf
                
                
                
               
                Case #FEN1_GETIP
                  
                  
                  
                  ClearGadgetItems(#FEN1_edit1)
                  ClearGadgetItems(#FEN1_edit2)
                  ClearGadgetItems(#FEN1_edit3)
                  
                  Initweb()
                  SetGadgetItemText(#FEN1_edit3,1,IPString(GetWanIp()))
                  
                                                     
                  
                  GetIp()   
                  
                  SetGadgetItemText(#FEN1_edit1,1, GetIp())
                  SetGadgetItemText(#FEN1_edit2,1,GetEnvironmentVariable("COMPUTERNAME"))
                  
                  
                  
                  
                Case #FEN1_SITE
                   
                   SetGadgetText(#FEN1_SITE, site0.s)
                   SetGadgetText(#FEN1_SITE, site1.s)
                   SetGadgetText(#FEN1_SITE, site2.s)              
                   SetGadgetText(#FEN1_SITE, site3.s)               
                   SetGadgetText(#FEN1_SITE, site4.s)
                  
                  
      EndSelect   ; end of test gadget events 
            
                Case #PB_Event_CloseWindow
                  
                    Break
            
      EndSelect    
        
        
      EndSelect 
      
ForEver   

;epb
    

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 10:29
par falsam
Bonjour jmg49. Regarde ce que j'ai fait sur ce post.

http://www.purebasic.fr/french/viewtopi ... 41#p146041

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 10:39
par jmg49
merci à toi, je l'avais vu et ai utilisé ta fonction pour l'ip wan pour récup l'ip dans la page, bon la problématique reste la même, si la page change ....le top c'est un .php sur un serveur perso qui ne renvoit que l'ip,

ce qui me pose problème c'est de faire changer la caption du bouton entre les différents sites, mais pouquoi donc il reste bloqué sur le site1.s ???

Code : Tout sélectionner

site0.s ="www.monip.org"
site1.s ="www.monip.fr"
site2.s ="www.monip.eu"
site3.s ="www.frameip.com"
site4.s ="www.hostip.fr"

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 10:44
par falsam
A cause de ça

Code : Tout sélectionner

Case #FEN1_SITE        
      SetGadgetText(#FEN1_SITE, site0.s)
      SetGadgetText(#FEN1_SITE, site1.s)
      SetGadgetText(#FEN1_SITE, site2.s)              
      SetGadgetText(#FEN1_SITE, site3.s)               
      SetGadgetText(#FEN1_SITE, site4.s)
Quand tu cliques sur le bouton, tu auras forcement l'affichage du 4eme site.

je te laisse mariner un peu :)

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 10:54
par jmg49
ok , je cherche !!! :P

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 10:57
par falsam
J'aime bien utiliser la fonction Get et SetGadgetData(Gadget) qui permet de lire ou de stocker une valeur dans un gadget évitant ainsi de créer une variable.

Tu l'auras compris, il faut connaitre le nom du site que tu as consulté pour pouvoir passer au suivant.

Le premier site prendra la valeur 0 et le dernier, la valeur 4.
Quand on a atteint le dernier site, on revient on premier.

Code : Tout sélectionner

Case #FEN1_SITE
      Select GetGadgetData(#FEN1_SITE)
            Case 4 
                SetGadgetText(#FEN1_SITE, site0.s)
                SetGadgetData(#FEN1_SITE, 0)
                      
            Case 0
                SetGadgetText(#FEN1_SITE, site1.s)
                SetGadgetData(#FEN1_SITE, 1)
                      
            Case 1  
                SetGadgetText(#FEN1_SITE, site2.s)              
                SetGadgetData(#FEN1_SITE, 2)
                      
            Case 2  
                SetGadgetText(#FEN1_SITE, site3.s)               
                SetGadgetData(#FEN1_SITE, 3)
                      
            Case 3
                SetGadgetText(#FEN1_SITE, site4.s)
                SetGadgetData(#FEN1_SITE, 4)
       EndSelect

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 11:36
par jmg49
c'est ce qu'il me manquait, setgadgetdata() !

parceque j'en étais là dans mon raisonnement :

Code : Tout sélectionner

               Case #FEN1_SITE 
                   
                   SetGadgetText(#FEN1_SITE, site0.s)
                   
                Case #FEN1_SITE   
                      
                   
                   SetGadgetText(#FEN1_SITE, site1.s)
                   
                   
                Case #FEN1_SITE
                   
                   SetGadgetText(#FEN1_SITE, site2.s)              
                   
                Case #FEN1_SITE  
                   
                   SetGadgetText(#FEN1_SITE, site3.s)               
                   
               Case #FEN1_SITE  
                   
                   SetGadgetText(#FEN1_SITE, site4.s)

et ça , ça va pas !!!! mais pas du tout ! :mrgreen: , allez j'implémente !!

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 12:03
par jmg49
fonctionnement étrange , j'ai bien implémenté la suite, le changement se fait bien dans le bouton,

mais la croix pour fermer la fenêtre ne fonctionne plus ,

mais plus étrange encore, lorsque je compile , avec ou sans débogueur, le prog fonctionne bien (sauf la croix ) pour renvoyer l'ip wan,

une fois l'exécutable généré, l'ip wan n'est plus renvoyée je n'obtiens que 0.0.0.0 dans le gadgeteditor,

je n'avais pas remarqué mais ça le faisait aussi avant d'implémenter ta routine Falsam, je n'avais pas généré d' .exe

dans l'EPB ok , hors EPB non

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 12:25
par falsam
Je vais reprendre ton code moisi (Si si il est moisi) et voir ce qu'il ne va pas :)

Tu confonds StringGadget avec Editor gadget, tu testes des valeurs alors que les constantes sont déja defini !

Code : Tout sélectionner

result = MessageRequester("Dialog", "Do you really want to quit ?", #PB_MessageRequester_YesNo )
                  
          If result= 6 
                
                Break
                
              EndIf
Tu as du t’embêter à trouver ta valeur 6 alors que #PB_MessageRequester_yes existe.
Quand tu as une fonction comme MessageRequester(), n'hésite pas à mettre le curseur de l'éditeur sur cette fonctionnalité et à appuyer sur la touche F1 pour connaitre par exemple les valeurs de retour.

Aérer ton code c'est bien mais trop .... c'est trop.

Allez je jette un oeil sur ton code.

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 12:30
par jmg49
:D oui moisi certainement, mais hé ho j'ai la licence que depuis la semaine dernière !!!!

les subtilités m'echappent encore , ça va aller, normalement, je vais demander de moins en moins !

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 12:35
par falsam
jmg49 a écrit :normalement, je vais demander de moins en moins !
Au contraire continue si tu ne connais pas bien Pure Basic. :)

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 12:49
par Backup
falsam a écrit :Aérer ton code c'est bien mais trop .... c'est trop.
si, si , ça donne une justification au menu "Compress" dans mon editeur :mrgreen:

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 12:52
par falsam
Dobro a écrit :si, si , ça donne une justification au menu "Compress" dans mon editeur :mrgreen:
Hé hé ouiiii.

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 12:59
par falsam
Ton code légèrement remis en forme est maintenant suffisamment clair pour te dire qu'il n'a jamais du fonctionner correctement.

Code : Tout sélectionner

;PureBasic 
;Basic Net tool 
;JmG49@2014

Enumeration 0 ; Id. Fenêtres
  #FENETRE1
EndEnumeration

Enumeration 0 ; Id. Gadgets
   #FEN1_GETIP
   #FEN1_SITE
   #FEN1_edit1
   #FEN1_edit2
   #FEN1_edit3
   #FEN1_edit4
EndEnumeration

Global Buffer.s

site0.s ="www.monip.org"
site1.s ="www.monip.fr"
site2.s ="www.monip.eu"
site3.s ="www.frameip.com"
site4.s ="www.hostip.fr"

InitNetwork()  

If OpenWindow(#FENETRE1, 320, 200, 570, 150, "PureBasic - Network Utility: IP Adresses (JmG@2014)", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ButtonGadget(#FEN1_GETIP, 200, 10, 130, 20, "Get Ip")
  ButtonGadget(#FEN1_SITE, 10, 10, 170, 20, site0.s)
  StringGadget(#FEN1_edit1, 120, 40, 150, 20, "")
  StringGadget(#FEN1_edit2, 300, 40, 160, 20, "")
  StringGadget(#FEN1_edit3, 120, 80, 150, 20, "")
  StringGadget(#FEN1_edit4, 300, 80, 160, 20, "")
  TextGadget(#PB_Any, 10, 40, 100, 20, "Local IP Address")
  TextGadget(#PB_Any, 10, 80, 100, 20, "Wan IP Address")      
EndIf
  
    
Procedure GetWanIp()
  Protected Ip.s, IP1.i, IP2.i, IP3.i,IP4.i

  IP = StringField(Trim(Mid(Buffer, 1, 15)), 1, "<")

  IP1 = Val(StringField(IP, 1, "."))
  IP2 = Val(StringField(IP, 2, "."))
  IP3 = Val(StringField(IP, 3, "."))
  IP4 = Val(StringField(IP, 4, "."))

  ProcedureReturn MakeIPAddress(IP1, IP2, IP3, IP4)
EndProcedure    
   
       
Procedure Initweb()   
  Protected File.l

  ReceiveHTTPFile(GetGadgetText(#FEN1_SITE), "index.php")
  File=ReadFile(#PB_Any, "index.php")

  If File
    While Eof(File)=0
      Buffer=ReadString(File)
      If FindString(Buffer, "IP :")
        Buffer=Trim(Mid(Buffer, 40))
      EndIf
    Wend
    CloseFile(File)
  EndIf
  DeleteFile("index.php")
  Debug buffer
  
EndProcedure 

Procedure.s GetIp() 
  ExamineIPAddresses()  
  Result2 = NextIPAddress()
      
  ProcedureReturn IPString(Result2)
EndProcedure    
    
;-Boucle évenementielle  
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()  
          Case #FEN1_GETIP
            SetGadgetText(#FEN1_edit1, "")
            SetGadgetText(#FEN1_edit2, "")
            SetGadgetText(#FEN1_edit3, "")
          
            Initweb()
            SetGadgetText(#FEN1_edit3, IPString(GetWanIp()))                                                 
                  
            GetIp()           
            SetGadgetText(#FEN1_edit1, GetIp())
            SetGadgetText(#FEN1_edit2, GetEnvironmentVariable("COMPUTERNAME"))      
            
          Case #FEN1_SITE
            Select GetGadgetData(#FEN1_SITE)  
              Case 4 
                SetGadgetText(#FEN1_SITE, site0.s)
                SetGadgetData(#FEN1_SITE, 0)
                      
              Case 0
                SetGadgetText(#FEN1_SITE, site1.s)
                SetGadgetData(#FEN1_SITE, 1)
   
              Case 1  
                SetGadgetText(#FEN1_SITE, site2.s)              
                SetGadgetData(#FEN1_SITE, 2)
                        
              Case 2  
                SetGadgetText(#FEN1_SITE, site3.s)               
                SetGadgetData(#FEN1_SITE, 3)
                        
              Case 3
                SetGadgetText(#FEN1_SITE, site4.s)
                SetGadgetData(#FEN1_SITE, 4)    
            EndSelect    
        EndSelect   ; end of test gadget events 
        
      Case #PB_Event_CloseWindow
        If MessageRequester("Dialog", "Do you really want to quit ?", #PB_MessageRequester_YesNo ) = #PB_MessageRequester_Yes
          End
        EndIf
        
    EndSelect       
ForEver   
J'ai ajouté Debug buffer dans ta procédure Initweb() pour te montrer que tu ne reçois jamais rien.

Remplace maintenant

Code : Tout sélectionner

ReceiveHTTPFile(GetGadgetText(#FEN1_SITE), "index.php")
par

Code : Tout sélectionner

ReceiveHTTPFile("http://"+GetGadgetText(#FEN1_SITE), "index.php")
et test à nouveau.

Cette fois çi ta variable buffer reçoit bien quelques chose mais tu devras formater le résultat en fonction du site que tu as sélectionné.

Re: Problème gestion évènement d'un buttongadget

Publié : mer. 19/mars/2014 13:42
par jmg49
:D voila pourquoi je voyais pas les requetes internet sortir avec un firewall logiciel !

j'ai pas encore tout saisi pour le debugueur , pas à pas etc ... je comprends mieux maintenant ,