(Résolu] StringGadget conditionné

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2585
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

(Résolu] StringGadget conditionné

Message par Micoute »

Je fais en ce moment un petit programme qui permet de vérifier le code INSEE de chacun et je m’embête pour la saisie du département Corse, car on peut avoir 2A ou 2B, ce qui fait que je ne peut pas faire une entrée numérique, mais je voudrais éviter qu'on puisse taper 2F ou 5Y.
Donc si le premier caractère tapé est un 2, le suivant ne peux être que A ou B exclusivement, mais peut être bien sûr n'importe quel chiffre de 0 à 9
si le premier chiffre n'est pas un 2, le suivant ne doit être qu'un chiffre de 0 à 9 uniquement.

J'avais pensé à un sous classement, mais je ne m'en sors pas, car je ne récupère pas mon entrée.

voici mon idée:

Code : Tout sélectionner

;Sous classement
Global AncienneValeur

;Une procédure de sous-classement pour le gadget chaîne.
Procedure.i MonStringGadget(hWnd, uMsg, wParam, lParam)
   Protected Resultat
   Select uMsg
      Case #WM_CHAR
         If (wParam >=48 And wParam<= 57) Or wParam = #VK_BACK
            Resultat = CallWindowProc_(AncienneValeur, hWnd, uMsg, wParam, lParam)
         EndIf
   EndSelect
   ProcedureReturn Resultat
EndProcedure

Procedure.i MonStringGadget2(hWnd, uMsg, wParam, lParam)
   Protected Resultat
   Select uMsg
      Case #WM_CHAR
         If (wParam >= 'a' And wParam <= 'b') Or (wParam >=48 And wParam<= 57) Or wParam = #VK_BACK
            Resultat = CallWindowProc_(AncienneValeur, hWnd, uMsg, wParam, lParam)
         EndIf
   EndSelect
   ProcedureReturn Resultat
EndProcedure

If OpenWindow(0, 100, 200, 300, 100, "Base démo sous-classement 3", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   StringGadget(0, 60, 40, 180,20,"")  
   
   Repeat 
     If Left(GetGadgetText(0), 1) = "1" Or Left(GetGadgetText(0), 1) > "2"
         MonStringGadget(hWnd, uMsg, wParam, lParam)
         ;Sous_classement de la chaîne de gadget par le remplacement procédure de fenêtre c'est par une des nôtres.
         AncienneValeur = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @MonStringGadget())
      ElseIf  Left(GetGadgetText(0), 1) = "2"
         MonStringGadget2(hWnd, uMsg, wParam, lParam)
         ;Sous_classement de la chaîne de gadget par le remplacement procédure de fenêtre c'est par une des nôtres.
         AncienneValeur = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @MonStringGadget2())
      EndIf
   Until WaitWindowEvent() = #PB_Event_CloseWindow
   
EndIf
Si quelqu'un veut bien m'aider, je le remercie énormément à l'avance.
Dernière modification par Micoute le mer. 10/avr./2013 9:56, modifié 1 fois.
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: StringGadget conditionné

Message par Backup »

il s'agit du code des communes ?

ben pour Bastia par exemple , les 2 codes sont parfaitement valables :

Bastia (20033)
Bastia (2B033)

pour Ajaccio
Ajaccio (20004)
Ajaccio (2A004)
; *********************
alors te prend pas la tete :)

sinon la soluce la plus simple
tu attends que la saisie soit finie , et si 2A ou 2B est présent (FindString)
tu sais a qu'elle partie de la corse tu as affaires ....
si une autre lettres est présente , tu signales le probleme (messagerequester)

sinon voici une solution ..

tout caracteres autre que A ou B sera refusé un beep se fera entendre

Code : Tout sélectionner


enumeration
	#win
	#String_gadget
Endenumeration

If OpenWindow(#win, 100, 200, 300, 100, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	StringGadget(#String_gadget, 60, 40, 180,20,"",#PB_String_UpperCase ) 
	
	Repeat
		Event = WaitWindowEvent(10)
		Select Event
			Case #PB_Event_Gadget
			Select EventGadget()
				Case #String_gadget
				text.s= GetGadgetText(#String_gadget)
				if (asc(right(text.s,1))>47 and asc(right(text.s,1))<58 ) or  (asc(right(text.s,1))=65 or asc(right(text.s,1))=66)
					text.s= GetGadgetText(#String_gadget)
					else 
					Beep_(880,100)
					text.s= GetGadgetText(#String_gadget)
					text2.s= left(text.s,len(text.s)-1)
					SetGadgetText(#String_gadget, "")
					SetGadgetText(#String_gadget, text2.s)
				Endif
			EndSelect
		EndSelect
		
	Until WaitWindowEvent() = #PB_Event_CloseWindow
	
EndIf; EPB
ps : mettre des constantes dans tes codes, n'est-ce pas plus clair ??

en tenant compte du "2"

Code : Tout sélectionner


enumeration
   #win
   #String_gadget
Endenumeration

If OpenWindow(#win, 100, 200, 300, 100, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   StringGadget(#String_gadget, 60, 40, 180,20,"",#PB_String_UpperCase )
   
   Repeat
      Event = WaitWindowEvent(10)
      Select Event
         Case #PB_Event_Gadget
         Select EventGadget()
            Case #String_gadget
            text.s= GetGadgetText(#String_gadget)
            if (asc(right(text.s,1))>47 and asc(right(text.s,1))<58 ) or  (asc(right(text.s,1))=65  and left(right(text.s,2),1)="2" ) or( asc(right(text.s,1))=66 and left(right(text.s,2),1)="2")
               text.s= GetGadgetText(#String_gadget)
               else
               Beep_(880,100)
               text.s= GetGadgetText(#String_gadget)
               text2.s= left(text.s,len(text.s)-1)
               SetGadgetText(#String_gadget, "")
               SetGadgetText(#String_gadget, text2.s)
            Endif
         EndSelect
      EndSelect
      
   Until WaitWindowEvent() = #PB_Event_CloseWindow
   
EndIf; EPB
Dernière modification par Backup le lun. 08/avr./2013 19:44, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7334
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: StringGadget conditionné

Message par falsam »

Question :?: Une carte Vitale Corse comporte le département en clair sur la carte ? (2A ou 2B)

Exemple 1 96 11 92 2A 033 222
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: StringGadget conditionné

Message par Backup »

Avatar de l’utilisateur
falsam
Messages : 7334
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: StringGadget conditionné

Message par falsam »

Oui mais ....
Pour la Corse, les lettres A et B sont remplacées par des zéros, et on soustrait du nombre à 13 chiffres ainsi obtenu 1 000 000 pour A et 2 000 000 pour B.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2585
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: StringGadget conditionné

Message par Micoute »

Bonjour et merci à tous,

Je ne cherche pas le code postal, mais faire une saisie dans mon StringGadget.

Je souhaiterais pouvoir entrer tous numéros de départements de 01 à 95, mais pour la Corse, il y a une petite exception, 2A et 2B.

Donc, je souhaiterais pouvoir taper A ou B uniquement si le premier caractère est un 2 et seulement A ou B.

Pourriez-vous m'indiquer comment faire un filtre efficace ?

Dobro, ta routine est superbe, il ne me reste plus qu'à la fignoler pour qu'elle se plie à l’exception Corse !

Je vous remercie tous, de tout cœur.
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7334
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: StringGadget conditionné

Message par falsam »

Micoute a écrit :je souhaiterais pouvoir taper A ou B uniquement si le premier caractère est un 2 et seulement A
ou B.
pas la peine de crier :mrgreen:

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Mainform
  #NumInsee
  #NumInseeKey
  
  #NumInseeCalc
  #NumInseeVerify
EndEnumeration

Global Min.i, Max.i, Col.i

;Reg Ex pour tester que la chaine ne comporte que des chiffre de 0 à 9
Global *RegMatch = CreateRegularExpression(#PB_Any ,"[0-9]") 

Procedure StringGadgetCursorX(Gadget) 
  SendMessage_(GadgetID(Gadget),#EM_GETSEL,@Min,@Max) 
  ProcedureReturn Max-SendMessage_(GadgetID(Gadget),#EM_LINEINDEX,SendMessage_(GadgetID(Gadget),#EM_LINEFROMCHAR,Min,0),0)+1 
EndProcedure 

OpenWindow(#Mainform,0,0,220,120,"Code Insee",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StringGadget(#NumInsee, 10, 10, 200, 22,"",#PB_String_UpperCase )
SetGadgetAttribute(#NumInsee, #PB_String_MaximumLength, 13)

SetActiveGadget(#NumInsee)

Repeat  
  Select WaitWindowEvent()

    Case #WM_LBUTTONUP, #WM_KEYUP
      If GetActiveGadget() = #NumInsee
        Col = StringGadgetCursorX(#NumInsee)
        SetWindowTitle(#Mainform,"Column : "+Str(Col))
        
        ;On arrive à la colonne 8
        ;Si le 6eme caractere est un 2 alors le 7eme caractere est soit un A ou un B ou un chiffre
        If Col=8 And Mid(GetGadgetText(#NumInsee), 6, 1) = "2"
          If Mid(GetGadgetText(#NumInsee), 7, 1) <> "A" And Mid(GetGadgetText(#NumInsee), 7, 1) <> "B" Or Not MatchRegularExpression (*RegMatch, Mid(GetGadgetText(#NumInsee), 7, 1))
            MessageRequester("Erreur","Erreur dans le département de naissance")
            keybd_event_(#VK_BACK,0,0,0) ;On efface le dernier caractére 
          EndIf
          
        ;Pour toutes les autres positions le caractére doit etre numérique
        ElseIf Col<>1 And Not MatchRegularExpression (*RegMatch, Mid(GetGadgetText(#NumInsee), Col-1, 1))
            MessageRequester("Erreur","Uniquement des chiffres !")
            keybd_event_(#VK_BACK,0,0,0) ;On efface le dernier caractére             
          EndIf 
        EndIf
         
    Case #PB_Event_CloseWindow
      End
      
  EndSelect
  
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2585
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: StringGadget conditionné

Message par Micoute »

Merci Falsam,

OK, j'arrête de crier,

c'est un très bon code et très complet que tu as pondu, moi j'ai choisi une autre méthode qui consiste à découper les champs pour les recoller à la fin (c'est idiot) et bien plus compliqué, car je voulais que l'utilisateur lambda sache ce que veut dire le code de sa carte vitale.

Pourquoi faire simple, quand on peut faire compliqué ? Surtout si je trouve ça beau (de cheval) !

Merci encore !
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: StringGadget conditionné

Message par Backup »

Micoute a écrit :
Donc, je souhaiterais pouvoir taper A ou B uniquement si le premier caractère est un 2 et seulement A ou B.
essaye en remplaçant dans mon code :

Code : Tout sélectionner

if (asc(right(text.s,1))>47 and asc(right(text.s,1))<58 ) or  (asc(right(text.s,1))=65 or asc(right(text.s,1))=66)
par

Code : Tout sélectionner

 if (asc(right(text.s,1))>47 and asc(right(text.s,1))<58 ) or  (asc(right(text.s,1))=65  and left(right(text.s,2),1)="2" ) or( asc(right(text.s,1))=66 and left(right(text.s,2),1)="2")
Avatar de l’utilisateur
Micoute
Messages : 2585
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: StringGadget conditionné

Message par Micoute »

Bonjour Dobro et merci infiniment, c'est de la balle ton filtre, il est simple et efficace, mais pourquoi n'ai-je pas pu le faire moi-même ?
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1125
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: StringGadget conditionné

Message par MLD »

Salut a tous

J'ai raté le premier train :cry:

Mais voici un code assez court Window uniquement :(

Code : Tout sélectionner

Enumeration
   #win
   #StrG
EndEnumeration
Structure HOOKSTRUCT
  vkCode.l
EndStructure
Procedure.l KeyboardHook(nCode, wParam, *p.HOOKSTRUCT)
 If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP
  If Len(GetGadgetText(#StrG)) = 1 And GetGadgetText(#StrG) = "2" 
   Select *p\vkCode
    Case 96 To 105,65,66,8,46
     ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p)
   Default
    ProcedureReturn 1             
   EndSelect
  Else
   Select *p\vkCode
    Case 96 To 105,8,46
     ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p)
   Default
    ProcedureReturn 1             
   EndSelect
  EndIf 
 EndIf
EndProcedure

OpenWindow(#win, 100, 200, 300, 100, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StringGadget(#StrG, 60, 40, 180,20,"",#PB_String_UpperCase )
SendMessage_(GadgetID(#StrG), #EM_LIMITTEXT,2, 0)
  
   Repeat
      Event = WaitWindowEvent(10)
      Select Event
         Case #PB_Event_Gadget
          Select EventGadget()
            Case #StrG
             SetWindowsHookEx_(#WH_KEYBOARD_LL,@KeyboardHook(),GetModuleHandle_(0),0) 
          EndSelect  
      EndSelect           
  Until  Event = #PB_Event_CloseWindow 
 End              
Il utilise le détournement des infos clavier :lol:
A toi Micoute de le modifier a ta convenance :lol:

& falsam: Dans ton usine a gaz la vapeur elle sort ou? :mrgreen: :lol: :lol:
A problème simple , solution simple
Je plaisante le problème n'est pas aussi simple que vu au premier abord,j'ai planché quelques heures avant de comprendre que la solution était un Hook.
Avatar de l’utilisateur
Micoute
Messages : 2585
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: StringGadget conditionné

Message par Micoute »

Bonjour MLD, mon cher voisin et merci beaucoup,

mois j'avais trouver ça :

Code : Tout sélectionner

Enumeration
   #Fenetre_principale
EndEnumeration
Enumeration
   #Text_0
   #Text_1
   #Text_2
   #Text_3
   #Text_4
   #Text_5
   #Text_6
   #Text_7
   #Text_8
   #Text_9
   #Text_10
   #Text_11
   #Text_12
   #Text_13
   #Text_14
   #Text_15
   #Text_16
   #Text_17
   #Text_18
   #Text_19
   #Text_20
   #Texte_21
   #Texte_22
   #String_Sexe
   #String_Annee
   #String_Mois
   #String_Departement
   #String_Commune
   #String_Numero
   #String_Cle
   #String_Numero_complet
   #Bouton_Sexe
   #Bouton_Annee
   #Bouton_Mois
   #Bouton_Departement
   #Bouton_Commune
   #Bouton_Numero
   #Bouton_Decoder
   #Texte_Trait    
   #Texte_Trait2
   #Texte_Trait3
   #Texte_Trait4
   #Texte_Trait5
   #Texte_Trait6
   #Texte_Trait7
EndEnumeration
Global.s Trait =  "——————————————————————————————————————————————————————————————————————"
Procedure OpenWindow_Fenetre_principale()
   If OpenWindow(#Fenetre_principale, 0, 0, 420, 385, "Calcul de la clé du code Insee", #PB_Window_SystemMenu|#PB_Window_SizeGadget|
                                                                                         #PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
      TextGadget(#Text_0, 5, 5, 285, 15, "Code sexe")
      TextGadget(#Text_1, 5, 20, 285, 15, "[1 = homme, 2 = femme, 3 = numéro temporaire")
      TextGadget(#Texte_Trait, 0, 30, 420, 10, Trait)
      TextGadget(#Text_2, 5, 40, 285, 15, "Année de naissance")
      TextGadget(#Text_3, 5, 55, 285, 15, "[2 derniers chiffres du millésime : 2013 : 13")
      TextGadget(#Texte_Trait2,0,65, 420, 10, Trait)
      TextGadget(#Text_4, 5, 75, 285, 15, "Mois naissance")
      TextGadget(#Text_5, 5, 90, 285, 15, "[sur 2 chiffres : janvier = 01, décembre = 12]")
      TextGadget(#Text_6, 5, 105, 285, 15, "20 et au delà : pièce d'état civil incomplète")
      TextGadget(#Texte_Trait3, 0, 115, 420, 10, Trait)            
      TextGadget(#Text_7, 5, 125, 285, 15, "Code département de naissance")
      TextGadget(#Text_8, 5, 140, 285, 15, "[sur 2 chiffres ou lettres, exemples:")
      TextGadget(#Text_9, 5, 155, 285, 15, "75 pour Paris")
      TextGadget(#Text_10, 5, 170, 285, 15, "99 pour l'étranger")
      TextGadget(#Text_11, 5, 185, 285, 15, "2A pour la Corse du Sud")
      TextGadget(#Text_12, 5, 200, 285, 15, "2B pour la Haute Corse")
      TextGadget(#Text_13, 5, 215, 285, 15, "outre mer : département sur 3 chiffres (1 sur champ suivant)]")
      TextGadget(#Texte_Trait4, 0, 225, 420, 10, Trait)            
      TextGadget(#Text_20, 5, 235, 285, 15, "Code Insee commune de naissance")
      TextGadget(#Texte_21, 5, 250, 285, 15, "[sur 3 chiffres (2 pour l'outre mer)]")
      TextGadget(#Texte_22, 5, 265, 285, 15, "990 à 999 : pupille de l'Etat ou lieu de naissance inconnu")
      TextGadget(#Texte_Trait5, 0, 275, 420, 10, Trait)            
      TextGadget(#Text_14, 5, 285, 285, 15, "Numéro d'ordre")
      TextGadget(#Text_15, 5, 300, 285, 15, "[sur 3 chiffres]")
      TextGadget(#Texte_Trait6, 0, 310, 420, 10, Trait)            
      TextGadget(#Text_16, 5, 320, 285, 15, "Clé de contrôle")
      TextGadget(#Text_17, 5, 335, 285, 15, "[2 chiffres]")
      TextGadget(#Texte_Trait7, 0, 345, 420, 10, Trait)            
      TextGadget(#Text_18, 5, 355, 285, 15, "Numéro de sécurité sociale complet")
      TextGadget(#Text_19, 5, 370, 285, 15, "[15 chiffres]")
      
      StringGadget(#String_Sexe, 290, 5, 14, 20, "", #PB_String_Numeric)
      StringGadget(#String_Annee, 290, 40, 18, 20, "", #PB_String_Numeric)
      StringGadget(#String_Mois, 290, 75, 18, 20, "")
      StringGadget(#String_Departement, 290, 125, 18, 20, "", #PB_String_UpperCase)
      StringGadget(#String_Commune, 290, 235, 25, 20, "", #PB_String_Numeric)
      StringGadget(#String_Numero, 290, 285, 25, 20, "", #PB_String_Numeric)
      TextGadget(#String_Cle, 290, 320, 20, 20, "", #PB_String_ReadOnly)
      StringGadget(#String_Numero_complet, 290, 355, 120, 20, "")
      ButtonGadget(#Bouton_Sexe, 325, 5, 80, 20, "Changer")
      ButtonGadget(#Bouton_Annee, 325, 40, 80, 20, "Changer")
      ButtonGadget(#Bouton_Mois, 325, 75, 80, 20, "Changer")
      ButtonGadget(#Bouton_Departement, 325, 125, 80, 20, "Changer")
      ButtonGadget(#Bouton_Commune, 325, 235, 80, 20, "Changer")
      ButtonGadget(#Bouton_Numero, 325, 285, 80, 20, "Changer")
      ButtonGadget(#Bouton_Decoder, 325, 320, 80, 20, "Décoder la clé")
      
      SetActiveGadget(#String_Sexe)
      
      SetGadgetAttribute(#String_Sexe, #PB_String_MaximumLength, 1)
      SetGadgetAttribute(#String_Annee, #PB_String_MaximumLength, 2)
      SetGadgetAttribute(#String_Mois, #PB_String_MaximumLength, 2)
      SetGadgetAttribute(#String_Departement, #PB_String_MaximumLength, 2)
      SetGadgetAttribute(#String_Commune, #PB_String_MaximumLength, 3)
      SetGadgetAttribute(#String_Numero, #PB_String_MaximumLength, 3)
   EndIf
EndProcedure

OpenWindow_Fenetre_principale()

Repeat
   Select WaitWindowEvent()
      Case #PB_Event_Gadget
         Select EventGadget()
            Case #String_Sexe
               text.s = GetGadgetText(#String_Sexe)
               If text.s < "1" Or text.s > "3"
                  Beep_(880,100)
                  text2.s = Left(text.s,Len(text.s)-1)
                  SetGadgetText(#String_Sexe, text2.s)
               EndIf
            Case #String_Mois
               text.s = GetGadgetText(#String_Mois)
               If text.s > "12"
                  Beep_(880,100)
                  text2.s = Left(text.s,Len(text.s)-2)
                  SetGadgetText(#String_Mois, text2.s)
               EndIf
            Case #String_Departement
               text.s= GetGadgetText(#String_Departement)
               If Len(text.s) < 3
                  Select Left(text.s, 1)
                     Case "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f",
                          "g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"
                        Beep_(880,100)
                        text.s= GetGadgetText(#String_Departement)
                        text2.s= Left(text.s,Len(text.s)-1)
                        SetGadgetText(#String_Departement, text2.s)
                     Case "2"
                        If (Asc(Right(text.s,1))>47 And Asc(Right(text.s,1))<58 ) Or  (Asc(Right(text.s,1))=65 Or Asc(Right(text.s,1))=66)
                           text.s= GetGadgetText(#String_Departement)
                        Else 
                           Beep_(880,100)
                           text.s= GetGadgetText(#String_Departement)
                           text2.s= Left(text.s,Len(text.s)-1)
                           SetGadgetText(#String_Departement, text2.s)
                        EndIf
                        
                     Case "1" , "3" , "4", "5", "6", "7", "8", "9"
                        If (Asc(Right(text.s,1))>47 And Asc(Right(text.s,1))<58 )
                           text.s= GetGadgetText(#String_Departement)
                        Else 
                           Beep_(880,100)
                           text.s= GetGadgetText(#String_Departement)
                           text2.s= Left(text.s,Len(text.s)-1)
                           SetGadgetText(#String_Departement, text2.s)
                        EndIf
                        
                  EndSelect
               EndIf
            Case #Bouton_Decoder
               If UCase(Right(GetGadgetText(#String_Departement),1))= "A" 
                  Departement$ = "20"
                  Resultat = Val(GetGadgetText(#String_Sexe) + GetGadgetText(#String_Annee) + GetGadgetText(#String_Mois) +
                                 Departement$ + GetGadgetText(#String_Commune) + GetGadgetText(#String_Numero))
                  Resultat - 1000000
               ElseIf UCase(Right(GetGadgetText(#String_Departement),1))= "B" 
                  Departement$ = "20"
                  Resultat = Val(GetGadgetText(#String_Sexe) + GetGadgetText(#String_Annee) + GetGadgetText(#String_Mois) +
                                 Departement$+GetGadgetText(#String_Commune)+GetGadgetText(#String_Numero))
                  Resultat - 2000000
               Else
                  Resultat = Val(GetGadgetText(#String_Sexe)+GetGadgetText(#String_Annee)+GetGadgetText(#String_Mois) +
                                 GetGadgetText(#String_Departement)+GetGadgetText(#String_Commune)+GetGadgetText(#String_Numero))
               EndIf
               SetGadgetText(#String_Cle, Str(97 - Mod(Resultat, 97)))
               SetGadgetText(#String_Numero_complet, GetGadgetText(#String_Sexe) + " " + GetGadgetText(#String_Annee) + " " +
                                                     GetGadgetText(#String_Mois) + " " + GetGadgetText(#String_Departement) + " " + 
                                                     GetGadgetText(#String_Commune) + " "+GetGadgetText(#String_Numero) + " [" + GetGadgetText(#String_Cle) + "]")
            Case #Bouton_Sexe
               SetGadgetText(#String_Sexe, "")
               SetActiveGadget(#String_Sexe)
            Case #Bouton_Annee
               SetGadgetText(#String_Annee, "")
               SetActiveGadget(#String_Annee)
            Case #Bouton_Mois
               SetGadgetText(#String_Mois, "")
               SetActiveGadget(#String_Mois)
            Case #Bouton_Departement
               SetGadgetText(#String_Departement, "")
               SetActiveGadget(#String_Departement)
            Case #Bouton_Commune
               SetGadgetText(#String_Commune, "")
               SetActiveGadget(#String_Departement)
            Case #Bouton_Numero
               SetGadgetText(#String_Numero, "")
               SetActiveGadget(#String_Numero)
         EndSelect
         
      Case #PB_Event_CloseWindow
         Select EventWindow()
            Case #Fenetre_principale
               CloseWindow(#Fenetre_principale)
               Break
         EndSelect
   EndSelect
ForEver

Ce code fonctionne pour tous les départements métropolitains et outre mer français !

J'adore le forum français, car il suffit de poser une question et tout le monde s'y met, alors merci à tous et surtout à FRED, sans qui l'aventure n'aurait pas lieu !
Dernière modification par Micoute le jeu. 11/avr./2013 8:40, modifié 5 fois.
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7334
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: StringGadget conditionné

Message par falsam »

MLD a écrit : falsam: Dans ton usine a gaz la vapeur elle sort ou? :mrgreen: :lol: :lol:
A problème simple , solution simple
Je plaisante le problème n'est pas aussi simple que vu au premier abord,j'ai planché quelques heures avant de comprendre que la solution était un Hook.
Bonjour MLD. Je ne vois pas ou tu vois une usine à gaz dans le code que je propose. Mon code permet de saisir une chaîne sur 13 caractéres maximum avec la possibilité de saisir 2A ou 2B UNIQUEMENT en position 2-3.

On ne peut pas dire que ton code soit fonctionnel sur ce point. Donc oui : A problème simple , solution simple:) Et la prochaine fois ne loupe pas le train !

@Micoute : Le calcul de la clé est faux et on peut entrée n'importe quoi dans les champs. (Exemple 1 58 02 BB 4lo oio [23])
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2585
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: StringGadget conditionné

Message par Micoute »

@Micoute : Le calcul de la clé est faux et on peut entrer n'importe quoi dans les champs. (Exemple 1 58 02 BB 4lo oio [23])
Bonjour Falsam et merci de ta critique qui m'a été constructive,

maintenant, c'est corrigé !
Dernière modification par Micoute le mer. 10/avr./2013 9:51, modifié 1 fois.
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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1125
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: StringGadget conditionné

Message par MLD »

@falsam

Mon code est parfaitement fonctionnel seulement 3 chiffres a changer. :mrgreen: :lol: :lol:

a+

Code : Tout sélectionner

Enumeration
   #win
   #StrG
EndEnumeration
Structure HOOKSTRUCT
  vkCode.l
EndStructure
Procedure.l KeyboardHook(nCode, wParam, *p.HOOKSTRUCT)
If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP
  If Len(GetGadgetText(#StrG)) = 6 And Mid(GetGadgetText(#StrG),6,1) = "2" ;********
   Select *p\vkCode
    Case 96 To 105,65,66,8,46
     ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p)
   Default
    ProcedureReturn 1             
   EndSelect
  Else
   Select *p\vkCode
    Case 96 To 105,8,46
     ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p)
   Default
    ProcedureReturn 1             
   EndSelect
  EndIf 
EndIf
EndProcedure

OpenWindow(#win, 100, 200, 300, 100, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StringGadget(#StrG, 60, 40, 180,20,"",#PB_String_UpperCase )
SendMessage_(GadgetID(#StrG), #EM_LIMITTEXT,13, 0);***********
  
   Repeat
      Event = WaitWindowEvent(10)
      Select Event
         Case #PB_Event_Gadget
          Select EventGadget()
            Case #StrG
             SetWindowsHookEx_(#WH_KEYBOARD_LL,@KeyboardHook(),GetModuleHandle_(0),0) 
          EndSelect  
      EndSelect           
  Until  Event = #PB_Event_CloseWindow 
End      
Dernière modification par MLD le mer. 10/avr./2013 9:38, modifié 1 fois.
Répondre