Page 1 sur 1

Mon IP-Requester perso !

Publié : dim. 09/mai/2004 13:23
par Chris
Selon le style appliqué, il affiche les champ:

IP
IP + Port
IP + Masque
IP + Port + Masque

et las boutons:

Valider
Valider + Annuler

Code : Tout sélectionner

;- Enumerations IPRequester
Enumeration
  #Win_IP_Input
EndEnumeration
Enumeration
  #Btn_No
  #Btn_Ok
  
  #Str_Port
  #IP_Mask
  #IP_Address
  #Txt_Ip
  #TxT_Mask
  #Txt_Port
EndEnumeration

;- Types de boutons
#PB_ButtonEx_Valid    = 32    ; Bouton Valider
#PB_ButtonEx_Cancel   = 128   ; Bouton Annuler

;- Constantes IPRequester_Ex
#PB_Ex_IP     = 1             ; Champ IP seulement
#PB_Ex_Mask   = 2             ; Champs IP + Masque
#PB_Ex_Port   = 4             ; Champs IP + Port
#PB_Ex_All    = 8             ; Champs IP + Masque + Port

;- Structures IPRequester_Ex
Structure IP_ADDRESS_Ext ; IP_Requester_Ex
  Ip.s
  Mask.s
  Port.s
EndStructure

;- Procedure
Procedure IPRequester_Ex(Titre.s, Type.l)
  Global Ip.IP_ADDRESS_Ext
  
  hWinForeGround = GetForegroundWindow_()
  
  If Type & #PB_Ex_IP = 0 And Type & #PB_Ex_Mask = 0 And Type & #PB_Ex_Port = 0 And Type & #PB_Ex_All = 0
    WinFlag = 1 : W_Width = 185 : W_Height = 90
  ElseIf  Type & #PB_Ex_IP    : WinFlag = 1 : W_Width = 185 : W_Height = 90
  ElseIf  Type & #PB_Ex_Mask  : WinFlag = 2 : W_Width = 185 : W_Height = 145
  ElseIf  Type & #PB_Ex_Port  : WinFlag = 3 : W_Width = 240 : W_Height = 90
  ElseIf  Type & #PB_Ex_All   : WinFlag = 4 : W_Width = 240 : W_Height = 145
  EndIf
  
  If Type & #PB_ButtonEx_Valid   : BtnOk = 1 : Else : BtnOk = 0 : EndIf
  If Type & #PB_ButtonEx_Cancel  : BtnNo = 1 : Else : BtnNo = 0 : EndIf
  
  If BtnOk = 0 And BtnNo = 1
    MessageRequester("Erreur","Vous ne pouvez pas avoir un bouton "+Chr(34)+"Annuler"+Chr(34)+" si vous n'avez pas le bouton "+Chr(34)+"Ok"+Chr(34))
    BtnOk = 1
  ElseIf BtnOk = 0 And BtnNo = 0
    MessageRequester("Erreur","Vous devez avoir au moins le bouton "+Chr(34)+"Valider"+Chr(34))
    BtnOk = 1
  EndIf
  
  If OpenWindow(#Win_IP_Input,0,0,W_Width,W_Height,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,Titre)
    If CreateGadgetList(WindowID(#Win_IP_Input))
      If WinFlag = 1 ; IP Seule
        TextGadget(#Txt_Ip,10,10,W_Width - 20,15,"Adresse IP")
        IPAddressGadget(#IP_Address,10,25,W_Width-20,25)
      ElseIf WinFlag = 2 ; IP + Masque
        TextGadget(#Txt_Ip,10,10,W_Width - 20,15,"Adresse IP")
        IPAddressGadget(#IP_Address,10,25,W_Width-20,25)
        TextGadget(#TxT_Mask,10,55, W_Width - 20, 15,"Masque de Sous-Réseau")
        IPAddressGadget(#IP_Mask,10,70,W_Width - 20,25)
      ElseIf WinFlag = 3 ; IP + Port
        TextGadget(#Txt_Ip,10,10,W_Width - 75,15,"Adresse IP")
        IPAddressGadget(#IP_Address,10,25,W_Width-75,25)
        TextGadget(#Txt_Port,W_Width-60,10,50,15,"Port")
        StringGadget(#Str_Port, W_Width - 60, 25, 50, 25,"")
      ElseIf WinFlag = 4 ; Tout
        TextGadget(#Txt_Ip,10,10,W_Width - 75,15,"Adresse IP")
        IPAddressGadget(#IP_Address,10,25,W_Width-75,25)
        TextGadget(#Txt_Port,W_Width-60,10,50,15,"Port")
        StringGadget(#Str_Port, W_Width - 60, 25, 50, 25,"")
        TextGadget(#TxT_Mask,10,55, W_Width - 20, 15,"Masque de Sous-Réseau")
        IPAddressGadget(#IP_Mask,10,70,W_Width - 20,25)
      EndIf
      
      If BtnOk  And BtnNo
        ButtonGadget(#Btn_Ok, (W_Width/2)-85, W_Height - 30,80,25,"Valider")
        ButtonGadget(#Btn_No, (W_Width/2)+ 5, W_Height - 30,80,25,"Annuler")
      Else
        ButtonGadget(#Btn_Ok, (W_Width/2)-40, W_Height - 30,80,25,"Valider")
      EndIf
    EndIf
    
    EnableWindow_(hWinForeGround, #False)
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          CloseWindow(#Win_IP_Input)
          
        Case #PB_Event_Gadget
          Select EventGadgetID()
            Case #Btn_Ok
              EnableWindow_(hWinForeGround, #True)
              
              Select WinFlag
                Case 1
                  If GetGadgetText(#IP_Address) <> "0.0.0.0"
                    Ip\Ip = GetGadgetText(#IP_Address)
                    Ip\Mask = ""
                    Ip\Port = ""
                  EndIf
                  
                Case 2
                  If GetGadgetText(#IP_Address) <> "0.0.0.0" And GetGadgetText(#IP_Mask) <> "0.0.0.0"
                    Ip\Ip = GetGadgetText(#IP_Address)
                    Ip\Mask = GetGadgetText(#IP_Mask)
                    Ip\Port = ""
                  EndIf
                  
                Case 3
                  If GetGadgetText(#IP_Address) <> "0.0.0.0" And GetGadgetText(#Str_Port) <> "0.0.0.0"
                    Ip\Ip = GetGadgetText(#IP_Address)
                    Ip\Mask = ""
                    Ip\Port = GetGadgetText(#Str_Port)
                  EndIf
                  
                Case 4
                  If GetGadgetText(#IP_Address) <> "" And GetGadgetText(#IP_Mask) <> "" And GetGadgetText(#Str_Port) <> ""
                    Ip\Ip = GetGadgetText(#IP_Address)
                    Ip\Mask = GetGadgetText(#IP_Mask)
                    Ip\Port = GetGadgetText(#Str_Port)
                  EndIf
              EndSelect
              ProcedureReturn @Ip
              EnableWindow_(hWinForeGround, #True)
              
            Case #Btn_No
              EnableWindow_(hWinForeGround, #True)
              ProcedureReturn #False
              
          EndSelect
      EndSelect
    ForEver
    CloseWindow(#Win_IP_Input)
  EndIf
EndProcedure

;- Test
; #PB_Ex_IP                 n'affiche que le champ IP
; #PB_Ex_Mask               affiche le champ IP + le champ Masque
; #PB_Ex_Port               affiche le champ IP + le champ Port
; #PB_Ex_All                affiche tous les champs

; #PB_ButtonEx_Valid        affiche le bouton Valider
; #PB_ButtonEx_Cancel       affiche le bouton Annuler


*Result.IP_ADDRESS_Ext = IPRequester_Ex("Adresse",#PB_Ex_All|#PB_ButtonEx_Valid|#PB_ButtonEx_Cancel)

Debug *Result\Ip
Debug *Result\Mask
Debug *Result\Port
Youp'là :lol:

Chris :)

Publié : dim. 09/mai/2004 13:47
par Flype
que dirais-tu que j'ajoute çà à ma userlib RequesterPlus ?

http://purebasic.hmt-forum.com/viewtopic.php?t=698

Publié : dim. 09/mai/2004 13:49
par Chris
Vas-y, pas de problème :wink:

Si tu vois des trucs à corriger, ne te gènes pas;

Chris :)

Publié : dim. 09/mai/2004 14:35
par Flype
d'ailleurs je vous invite à proposer un max de requester ici :

http://purebasic.hmt-forum.com/viewtopic.php?t=698

Publié : mer. 26/mai/2004 13:07
par DarkDragon
cool!
Mais un peu trop grand.

Publié : mer. 26/mai/2004 15:56
par fweil
Chris,

Ton requester est bien. Pour la taille je trouve ça correct.

Pour la forme, ce serait peut-être bien de nommer les constantes avec un nom plus spécifique, genre #PB_IPRequester_... ou qq chose comme ça, en vue d'éviter des conflits futurs.

Améliorations possibles : ajout de paramètres de dimension et de police.

Aussi, du coup, on pourrait en profiter pour augmenter la structure et sortir les éléments qui peuvent être utiles dans certains cas, comme la valeur 32 bits de l'IP en ordre B1B2B3B4, la valeur 32 bits en ordre B4B3B2B1, les valeurs dissociées B1, B2, B3, B4. Commeça tout le monde y trouverait son compte. Et du coup la fonction deviendrait tellement universelle, qu'il faudrait lui ajouter une fonctionnalité : l'appel en aveugle permettant de passer une IP et de récupérer les éléments dans la structure sans afficher le Requester. Après ça manque plus qu'à ajouter la possibilité de rentrer un nom de machine à la place de l'IP et de renvoyer la valeur de l'IP de la machine ! Bon je divague. Mais parès tout pourquoi pas essayer d'épuiser le sujet.

Autres suggestions dans la modif du code ci-dessous : J'ai mis la tambouille pour gérer la touche escape pour sortir du requester et la touche tab pour passer d'un champ de saisie au suivant.

Pour que ce dernier point fonctionne bien, j'ai aussi modifié l'ordre des constantes pour les 3 gadgets de saisie. La formule qui shifte le curseur avec la touche Tab est basée sur le calcul d'un modulo par rapport à la valeur du premier gadget de la liste dans laquelle on veut faire agir la touche Tab. C'est un peu bricolé, mais ça fcontionne.

Code : Tout sélectionner

;- Enumerations IPRequester 
Enumeration 
  #Win_IP_Input 
EndEnumeration 
Enumeration 
  #Btn_No 
  #Btn_Ok 
  #IP_Address 
  #Str_Port 
  #IP_Mask 
  #Txt_Ip 
  #TxT_Mask 
  #Txt_Port 
EndEnumeration 

;- Types de boutons 
#PB_ButtonEx_Valid    = 32    ; Bouton Valider 
#PB_ButtonEx_Cancel   = 128   ; Bouton Annuler 

;- Constantes IPRequester_Ex 
#PB_Ex_IP     = 1             ; Champ IP seulement 
#PB_Ex_Mask   = 2             ; Champs IP + Masque 
#PB_Ex_Port   = 4             ; Champs IP + Port 
#PB_Ex_All    = 8             ; Champs IP + Masque + Port 

;- Structures IPRequester_Ex 
Structure IP_ADDRESS_Ext ; IP_Requester_Ex 
  Ip.s 
  Mask.s 
  Port.s 
EndStructure 

;- Procedure 
Procedure IPRequester_Ex(Titre.s, Type.l) 
  Global Ip.IP_ADDRESS_Ext 
  
  hWinForeGround = GetForegroundWindow_() 
  
  If Type & #PB_Ex_IP = 0 And Type & #PB_Ex_Mask = 0 And Type & #PB_Ex_Port = 0 And Type & #PB_Ex_All = 0 
    WinFlag = 1 : W_Width = 185 : W_Height = 90 
  ElseIf  Type & #PB_Ex_IP    : WinFlag = 1 : W_Width = 185 : W_Height = 90 
  ElseIf  Type & #PB_Ex_Mask  : WinFlag = 2 : W_Width = 185 : W_Height = 145 
  ElseIf  Type & #PB_Ex_Port  : WinFlag = 3 : W_Width = 240 : W_Height = 90 
  ElseIf  Type & #PB_Ex_All   : WinFlag = 4 : W_Width = 240 : W_Height = 145 
  EndIf 
  
  If Type & #PB_ButtonEx_Valid   : BtnOk = 1 : Else : BtnOk = 0 : EndIf 
  If Type & #PB_ButtonEx_Cancel  : BtnNo = 1 : Else : BtnNo = 0 : EndIf 
  
  If BtnOk = 0 And BtnNo = 1 
    MessageRequester("Erreur","Vous ne pouvez pas avoir un bouton "+Chr(34)+"Annuler"+Chr(34)+" si vous n'avez pas le bouton "+Chr(34)+"Ok"+Chr(34)) 
    BtnOk = 1 
  ElseIf BtnOk = 0 And BtnNo = 0 
    MessageRequester("Erreur","Vous devez avoir au moins le bouton "+Chr(34)+"Valider"+Chr(34)) 
    BtnOk = 1 
  EndIf 
  
  If OpenWindow(#Win_IP_Input,0,0,W_Width,W_Height,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,Titre) 
    AddKeyboardShortcut(#Win_IP_Input, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
    AddKeyboardShortcut(#Win_IP_Input, #PB_Shortcut_Tab, #PB_Shortcut_Tab)
    If CreateGadgetList(WindowID(#Win_IP_Input)) 
      If WinFlag = 1 ; IP Seule 
        TextGadget(#Txt_Ip,10,10,W_Width - 20,15,"Adresse IP") 
        IPAddressGadget(#IP_Address,10,25,W_Width-20,25) 
      ElseIf WinFlag = 2 ; IP + Masque 
        TextGadget(#Txt_Ip,10,10,W_Width - 20,15,"Adresse IP") 
        IPAddressGadget(#IP_Address,10,25,W_Width-20,25) 
        TextGadget(#TxT_Mask,10,55, W_Width - 20, 15,"Masque de Sous-Réseau") 
        IPAddressGadget(#IP_Mask,10,70,W_Width - 20,25) 
      ElseIf WinFlag = 3 ; IP + Port 
        TextGadget(#Txt_Ip,10,10,W_Width - 75,15,"Adresse IP") 
        IPAddressGadget(#IP_Address,10,25,W_Width-75,25) 
        TextGadget(#Txt_Port,W_Width-60,10,50,15,"Port") 
        StringGadget(#Str_Port, W_Width - 60, 25, 50, 25,"") 
      ElseIf WinFlag = 4 ; Tout 
        TextGadget(#Txt_Ip,10,10,W_Width - 75,15,"Adresse IP") 
        IPAddressGadget(#IP_Address,10,25,W_Width-75,25) 
        TextGadget(#Txt_Port,W_Width-60,10,50,15,"Port") 
        StringGadget(#Str_Port, W_Width - 60, 25, 50, 25,"") 
        TextGadget(#TxT_Mask,10,55, W_Width - 20, 15,"Masque de Sous-Réseau") 
        IPAddressGadget(#IP_Mask,10,70,W_Width - 20,25) 
      EndIf 
      
      If BtnOk  And BtnNo 
        ButtonGadget(#Btn_Ok, (W_Width/2)-85, W_Height - 30,80,25,"Valider") 
        ButtonGadget(#Btn_No, (W_Width/2)+ 5, W_Height - 30,80,25,"Annuler") 
      Else 
        ButtonGadget(#Btn_Ok, (W_Width/2)-40, W_Height - 30,80,25,"Valider") 
      EndIf 
    EndIf 
    
    EnableWindow_(hWinForeGround, #False) 
    
    Repeat 
      Select WaitWindowEvent() 
        Case #PB_Event_CloseWindow 
          Quit = #TRUE
        Case #PB_Event_Menu
          Select EventMenuID()
            Case #PB_Shortcut_Tab
              SetFocus_(GadgetID((EventGadgetID - #IP_Address + 1) % 3 + #IP_Address))
            Case #PB_Shortcut_Escape
              Quit = #TRUE
          EndSelect
        Case #PB_Event_Gadget 
          EventGadgetID = EventGadgetID()
          Select EventGadgetID
            Case #Btn_Ok 
              EnableWindow_(hWinForeGround, #True) 
              
              Select WinFlag 
                Case 1 
                  If GetGadgetText(#IP_Address) <> "0.0.0.0" 
                    Ip\Ip = GetGadgetText(#IP_Address) 
                    Ip\Mask = "" 
                    Ip\Port = "" 
                  EndIf 
                  
                Case 2 
                  If GetGadgetText(#IP_Address) <> "0.0.0.0" And GetGadgetText(#IP_Mask) <> "0.0.0.0" 
                    Ip\Ip = GetGadgetText(#IP_Address) 
                    Ip\Mask = GetGadgetText(#IP_Mask) 
                    Ip\Port = "" 
                  EndIf 
                  
                Case 3 
                  If GetGadgetText(#IP_Address) <> "0.0.0.0" And GetGadgetText(#Str_Port) <> "0.0.0.0" 
                    Ip\Ip = GetGadgetText(#IP_Address) 
                    Ip\Mask = "" 
                    Ip\Port = GetGadgetText(#Str_Port) 
                  EndIf 
                  
                Case 4 
                  If GetGadgetText(#IP_Address) <> "" And GetGadgetText(#IP_Mask) <> "" And GetGadgetText(#Str_Port) <> "" 
                    Ip\Ip = GetGadgetText(#IP_Address) 
                    Ip\Mask = GetGadgetText(#IP_Mask) 
                    Ip\Port = GetGadgetText(#Str_Port) 
                  EndIf 
              EndSelect 
              ProcedureReturn @Ip 
              EnableWindow_(hWinForeGround, #True) 
              
            Case #Btn_No 
              EnableWindow_(hWinForeGround, #True) 
              ProcedureReturn #False 
              
          EndSelect 
      EndSelect 
    Until Quit
    CloseWindow(#Win_IP_Input) 
  EndIf 
EndProcedure 

;- Test 
; #PB_Ex_IP                 n'affiche que le champ IP 
; #PB_Ex_Mask               affiche le champ IP + le champ Masque 
; #PB_Ex_Port               affiche le champ IP + le champ Port 
; #PB_Ex_All                affiche tous les champs 

; #PB_ButtonEx_Valid        affiche le bouton Valider 
; #PB_ButtonEx_Cancel       affiche le bouton Annuler 


*Result.IP_ADDRESS_Ext = IPRequester_Ex("Adresse",#PB_Ex_All|#PB_ButtonEx_Valid|#PB_ButtonEx_Cancel)

Debug *Result\Ip 
Debug *Result\Mask 
Debug *Result\Port

Publié : jeu. 27/mai/2004 17:13
par Chris
Pour la forme, ce serait peut-être bien de nommer les constantes avec un nom plus spécifique, genre #PB_IPRequester_... ou qq chose comme ça, en vue d'éviter des conflits futurs.
Que veux tu mettre de plus comme nom de constante?
Elles sont suffisamment spécifiques, à mon avis.
Quelle que soit la constante que je vais y mettre, il y a toujours un risque qu'un autre mette la même avec une valeur différente, ou pire, avec la même valeur, mais pour une autre utilisation. Dans ce cas, même pas de message d'erreur, mais gros plantage en vue ;)
Aussi, du coup, on pourrait en profiter pour augmenter la structure et sortir les éléments qui peuvent être utiles dans certains cas, comme la valeur 32 bits de l'IP en ordre B1B2B3B4, la valeur 32 bits en ordre B4B3B2B1, les valeurs dissociées B1, B2, B3, B4. Commeça tout le monde y trouverait son compte. Et du coup la fonction deviendrait tellement universelle, qu'il faudrait lui ajouter une fonctionnalité : l'appel en aveugle permettant de passer une IP et de récupérer les éléments dans la structure sans afficher le Requester. Après ça manque plus qu'à ajouter la possibilité de rentrer un nom de machine à la place de l'IP et de renvoyer la valeur de l'IP de la machine ! Bon je divague. Mais parès tout pourquoi pas essayer d'épuiser le sujet.
On peut aussi coder tout le programme à la place du programmeur, il lui restera juste à mettre son nom et à passer à la caisse :lol:

Bon, je suis d'accord, on pourrait encore améliorer ça, mais faut pas que ça devienne Visaul Basic, non plus. Et puis quelques lignes de code, ça peut faire du bien au doigts, ça empêche l'arthrose :lol:
Autres suggestions dans la modif du code ci-dessous : J'ai mis la tambouille pour gérer la touche escape pour sortir du requester et la touche tab pour passer d'un champ de saisie au suivant.

Pour que ce dernier point fonctionne bien, j'ai aussi modifié l'ordre des constantes pour les 3 gadgets de saisie. La formule qui shifte le curseur avec la touche Tab est basée sur le calcul d'un modulo par rapport à la valeur du premier gadget de la liste dans laquelle on veut faire agir la touche Tab. C'est un peu bricolé, mais ça fcontionne.
Pour la touche Escape, je ne l'avais pas mise, parce que je ne m'en sers pratiquement pas, et comme je fais ça surtout pour moi,...
La touche Tab, c'était déjà fait, dans une version plus récente ou j'ai regroupé les trois requesters que j'ai mis sur le forum.
Par contre, ton code ne fonctionne que lorsque tous les champs sont affichés, ( Constante #PB_Ex_All). Si on ne met que le champs IP + Port ou IP + Mask, ça plante, tout au moins chez moi. (Au debug, j'ai le message "#Gadget Object not initialized").

Chris :)