J'ai une soeur qui veut apprendre à identifier les numérations binaires et hexa.
Alors j'ai commis ce truc.
Sais pas si on peut faire des trucs mieux mais c'est un début.
Code : Tout sélectionner
Enumeration
#Window_Main
#StatusBar
#Gadget_String_Decimal
#Gadget_Button_Decimal
#Gadget_String_Hexadecimal
#Gadget_Button_Hexadecimal
#Gadget_String_Binary
#Gadget_Button_Binary
EndEnumeration
;
; La structure OneByte est utilisée comme intermédiaire de pointage de la chaine argument des fonctions.
; Ce système d'adressage est plus rapide et efficace qu'une analyse par caractère dans une chaine.
;
Structure OneByte
a.b
EndStructure
;
; IsValid prend la chaine d'un gadget et vérifie que tous les caractères de cette chaine appartiennent à la liste de caractères autorisés dans Mask
;
Procedure IsValid(Gadget.l, Mask.s, Text.s)
IsValid = #TRUE
For i = 1 To Len(GetGadgetText(Gadget))
If FindString(Mask, Mid(GetGadgetText(Gadget), i, 1), 1)
Else
IsValid = #FALSE
SetGadgetText(Gadget, ReplaceString(GetGadgetText(Gadget), Mid(GetGadgetText(Gadget), i, 1), ""))
EndIf
Next
If IsValid = #FALSE
MessageRequester("Attention", "Les valeurs " + Text + " ne peuvent contenir que des caratères parmi " + Mask, #PB_MessageRequester_OK)
EndIf
EndProcedure
;
; Conversion d'une chaine de caractères binaire en valeur décimale stockée dans un entier long
;
Procedure.l Bin2Dec(BinaryStringNumber.s)
*t.OneByte = @BinaryStringNumber
Result.l = 0
While *t\a <> 0
Result = (Result << 1) + (*t\a - 48)
*t + 1
Wend
ProcedureReturn Result
EndProcedure
;
; Conversion d'une chaine de caractères héxadécimale en valeur décimale stockée dans un entier long
;
Procedure.l Hex2Dec(HexNumber.s)
*t.OneByte = @HexNumber
Result.l = 0
While *t\a <> 0
If *t\a >= '0' And *t\a <= '9'
Result = (Result << 4) + (*t\a - 48)
ElseIf *t\a >= 'A' And *t\a <= 'F'
Result = (Result << 4) + (*t\a - 55)
ElseIf *t\a >= 'a' And *t\a <= 'f'
Result = (Result << 4) + (*t\a - 87)
Else
Result = (Result << 4) + (*t\a - 55)
EndIf
*t + 1
Wend
ProcedureReturn Result
EndProcedure
;
; Conversion d'une chaine de caractères décimale en valeur héxadécimale stockée dans une chaine
;
Procedure.s Dec2HexString(DecimalString.s)
ProcedureReturn Hex(Val(DecimalString))
EndProcedure
;
; Conversion d'une chaine de caractères décimale en valeur binaire stockée dans une chaine
;
Procedure.s Dec2BinString(DecimalString.s)
ProcedureReturn Bin(Val(DecimalString))
EndProcedure
;
; Conversion d'une chaine de caractères héxadécimale en valeur décimale stockée dans une chaine
;
Procedure.s Hex2DecString(HexadecimalString.s)
ProcedureReturn Str(Hex2Dec(HexadecimalString))
EndProcedure
;
; Conversion d'une chaine de caractères héxadécimale en valeur binaire stockée dans une chaine
;
Procedure.s Hex2BinString(HexadecimalString.s)
ProcedureReturn Bin(Hex2Dec(HexadecimalString))
EndProcedure
;
; Conversion d'une chaine de caractères binaire en valeur décimale stockée dans une chaine
;
Procedure.s Bin2DecString(BinaryString.s)
ProcedureReturn Str(Bin2Dec(BinaryString))
EndProcedure
;
; Conversion d'une chaine de caractères binaire en valeur héxadécimale stockée dans une chaine
;
Procedure.s Bin2HexString(BinaryString.s)
ProcedureReturn Hex(Bin2Dec(BinaryString))
EndProcedure
;
; Programme principal
;
WindowXSize = 480
WindowYSize = 360
Quit = #FALSE
OldGadgetText_Decimal.s
OldGadgetText_Hexadecimal.s
OldGadgetText_Binary.s
If OpenWindow(#Window_Main, 0, 0, WIndowXSize, WindowYSize, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered, "Tests Bin Dec Hex")
AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Return, #PB_Shortcut_Return)
AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Up, #PB_Shortcut_Up)
AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Down, #PB_Shortcut_Down)
If CreateGadgetList(WindowID())
SetGadgetFont(#PB_Default, LoadFont(23, "Verdana", 12, #PB_Font_Bold | #PB_Font_HighQuality))
hStringGadget_Decimal = StringGadget(#Gadget_String_Decimal, 10, 10, WindowXSize - 90, 40, "", #PB_String_UpperCase | #ES_RIGHT)
SendMessage_(hStringGadget_Decimal, #EM_SETLIMITTEXT, 10, 0)
ButtonGadget(#Gadget_Button_Decimal, WindowXSize - 70, 10, 60, 40, "OK")
hStringGadget_Hexadecimal = StringGadget(#Gadget_String_Hexadecimal, 10, 60, WindowXSize - 90, 40, "", #PB_String_UpperCase | #ES_RIGHT)
SendMessage_(hStringGadget_Hexadecimal, #EM_SETLIMITTEXT, 8, 0)
ButtonGadget(#Gadget_Button_Hexadecimal, WindowXSize - 70, 60, 60, 40, "OK")
hStringGadget_Binary = StringGadget(#Gadget_String_Binary, 10, 110, WindowXSize - 90, 40, "", #PB_String_UpperCase | #ES_RIGHT)
SendMessage_(hStringGadget_Binary, #EM_SETLIMITTEXT, 32, 0)
ButtonGadget(#Gadget_Button_Binary, WindowXSize - 70, 110, 60, 40, "OK")
EndIf
If CreateStatusBar(#StatusBar, WindowID())
EndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = #TRUE
Case #PB_Event_Menu
Select EventMenuID()
Case #PB_Shortcut_Escape
Quit = #TRUE
Case #PB_Shortcut_Return
Select LastGadgetTouched
Case #Gadget_String_Decimal
SetGadgetText(#Gadget_String_Hexadecimal, Dec2HexString(GetGadgetText(#Gadget_String_Decimal)))
SetGadgetText(#Gadget_String_Binary, Dec2BinString(GetGadgetText(#Gadget_String_Decimal)))
Case #Gadget_String_Hexadecimal
SetGadgetText(#Gadget_String_Decimal, Hex2DecString(GetGadgetText(#Gadget_String_Hexadecimal)))
SetGadgetText(#Gadget_String_Binary, Hex2BinString(GetGadgetText(#Gadget_String_Hexadecimal)))
Case #Gadget_String_Binary
SetGadgetText(#Gadget_String_Hexadecimal, Bin2HexString(GetGadgetText(#Gadget_String_Binary)))
SetGadgetText(#Gadget_String_Decimal, Bin2DecString(GetGadgetText(#Gadget_String_Binary)))
EndSelect
Case #PB_Shortcut_Up
Select LastGadgetTouched
Case #Gadget_String_Decimal
SetGadgetText(#Gadget_String_Decimal, Str(Val(GetGadgetText(#Gadget_String_Decimal)) + 1))
SetGadgetText(#Gadget_String_Hexadecimal, Dec2HexString(GetGadgetText(#Gadget_String_Decimal)))
SetGadgetText(#Gadget_String_Binary, Dec2BinString(GetGadgetText(#Gadget_String_Decimal)))
Case #Gadget_String_Hexadecimal
SetGadgetText(#Gadget_String_Hexadecimal, Str(Val(GetGadgetText(#Gadget_String_Hexadecimal)) + 1))
SetGadgetText(#Gadget_String_Decimal, Hex2DecString(GetGadgetText(#Gadget_String_Hexadecimal)))
SetGadgetText(#Gadget_String_Binary, Hex2BinString(GetGadgetText(#Gadget_String_Hexadecimal)))
Case #Gadget_String_Binary
SetGadgetText(#Gadget_String_Binary, Str(Val(GetGadgetText(#Gadget_String_Binary)) + 1))
SetGadgetText(#Gadget_String_Hexadecimal, Bin2HexString(GetGadgetText(#Gadget_String_Binary)))
SetGadgetText(#Gadget_String_Decimal, Bin2DecString(GetGadgetText(#Gadget_String_Binary)))
EndSelect
Case #PB_Shortcut_Down
Select LastGadgetTouched
Case #Gadget_String_Decimal
SetGadgetText(#Gadget_String_Decimal, Str(Val(GetGadgetText(#Gadget_String_Decimal)) - 1))
SetGadgetText(#Gadget_String_Hexadecimal, Dec2HexString(GetGadgetText(#Gadget_String_Decimal)))
SetGadgetText(#Gadget_String_Binary, Dec2BinString(GetGadgetText(#Gadget_String_Decimal)))
Case #Gadget_String_Hexadecimal
SetGadgetText(#Gadget_String_Hexadecimal, Str(Val(GetGadgetText(#Gadget_String_Hexadecimal)) - 1))
SetGadgetText(#Gadget_String_Decimal, Hex2DecString(GetGadgetText(#Gadget_String_Hexadecimal)))
SetGadgetText(#Gadget_String_Binary, Hex2BinString(GetGadgetText(#Gadget_String_Hexadecimal)))
Case #Gadget_String_Binary
SetGadgetText(#Gadget_String_Binary, Str(Val(GetGadgetText(#Gadget_String_Binary)) - 1))
SetGadgetText(#Gadget_String_Hexadecimal, Bin2HexString(GetGadgetText(#Gadget_String_Binary)))
SetGadgetText(#Gadget_String_Decimal, Bin2DecString(GetGadgetText(#Gadget_String_Binary)))
EndSelect
EndSelect
Case #PB_Event_Gadget
Select EventGadgetID()
Case #Gadget_String_Decimal
If OldGadgetText_Decimal <> GetGadgetText(#Gadget_String_Decimal)
IsValid(#Gadget_String_Decimal, "-0123456789", "décimales")
LastGadgetTouched = #Gadget_String_Decimal
SetGadgetText(#Gadget_String_Hexadecimal, Dec2HexString(GetGadgetText(#Gadget_String_Decimal)))
SetGadgetText(#Gadget_String_Binary, Dec2BinString(GetGadgetText(#Gadget_String_Decimal)))
OldGadgetText_Decimal = GetGadgetText(#Gadget_String_Decimal)
Debug "#Gadget_String_Decimal"
EndIf
While WindowEvent() : Wend
Case #Gadget_String_Hexadecimal
If OldGadgetText_Hexadecimal <> GetGadgetText(#Gadget_String_Hexadecimal)
IsValid(#Gadget_String_Hexadecimal, "0123456789ABCDEF", "héxadécimales")
LastGadgetTouched = #Gadget_String_Hexadecimal
SetGadgetText(#Gadget_String_Decimal, Hex2DecString(GetGadgetText(#Gadget_String_Hexadecimal)))
SetGadgetText(#Gadget_String_Binary, Hex2BinString(GetGadgetText(#Gadget_String_Hexadecimal)))
OldGadgetText_Hexadecimal = GetGadgetText(#Gadget_String_Hexadecimal)
Debug "#Gadget_String_Hexadecimal"
EndIf
While WindowEvent() : Wend
Case #Gadget_String_Binary
If OldGadgetText_Binary <> GetGadgetText(#Gadget_String_Binary)
IsValid(#Gadget_String_Binary, "01", "binaires")
LastGadgetTouched = #Gadget_String_Binary
SetGadgetText(#Gadget_String_Decimal, Bin2DecString(GetGadgetText(#Gadget_String_Binary)))
SetGadgetText(#Gadget_String_Hexadecimal, Bin2HexString(GetGadgetText(#Gadget_String_Binary)))
OldGadgetText_Binary = GetGadgetText(#Gadget_String_Binary)
Debug "#Gadget_String_Binary"
EndIf
While WindowEvent() : Wend
Case #Gadget_Button_Decimal
SetGadgetText(#Gadget_String_Hexadecimal, Dec2HexString(GetGadgetText(#Gadget_String_Decimal)))
SetGadgetText(#Gadget_String_Binary, Dec2BinString(GetGadgetText(#Gadget_String_Decimal)))
Case #Gadget_Button_Hexadecimal
SetGadgetText(#Gadget_String_Decimal, Hex2DecString(GetGadgetText(#Gadget_String_Hexadecimal)))
SetGadgetText(#Gadget_String_Binary, Hex2BinString(GetGadgetText(#Gadget_String_Hexadecimal)))
Case #Gadget_Button_Binary
SetGadgetText(#Gadget_String_Hexadecimal, Bin2HexString(GetGadgetText(#Gadget_String_Binary)))
SetGadgetText(#Gadget_String_Decimal, Bin2DecString(GetGadgetText(#Gadget_String_Binary)))
EndSelect
EndSelect
Until Quit
EndIf
End