en fait je n'ai pas trop de mal avec PB
je me permet de poster un petit code commenté pour débutant qui permet de comprendre pas mal de chose en attendant de poster qqchose de plus conséquent...dis moi si je ne suis pas trop à côté de la plaque en purebasic comme j'ai commencé il y a moins d'un mois
Code : Tout sélectionner
;Code pour linux ou windows
;utilisation :
;- d'un thread
;- d'une macro
;- d'une structure
;- de tableaux
;principe : affiche la date et l'heure courante avec les secondes, en français et en anglais,
;change dynamiquement le label du bouton, en utilisant un thread, donc non bloquant pour l'utilisateur
;en cas d'une application plus complexe
;niveau : débutant (code commenté)
;PS : par sécurité, pensez à activer l'option thread dans le compilateur
;bien que je pense que ce ne soit pas indispensable pour ce code
;création d'un thread
Procedure HeureCourante(*n); remarquez ici le *n comme argument
Structure JouretMois:jour.s:day.s:Mois.s:Mont.s:EndStructure; une structure pour les jours de la
;semaine et les mois en français et en anglais
Dim semaine.JouretMois(6); tableau des jours en français
semaine(0)\jour="dimanche":semaine(1)\jour="lundi":semaine(2)\jour="mardi":semaine(3)\jour="mercredi"
semaine(4)\jour="jeudi":semaine(5)\jour="vendredi":semaine(6)\jour="samedi"
Dim week.JouretMois(6); tableau des jours en anglais
week(0)\day="Sunday":week(1)\day="Monday":week(2)\day="Thuesday":week(3)\day="Wednesday"
week(4)\day="Thursday":week(5)\day="Friday":week(6)\day="Saturday"
Dim mois.JouretMois(11); tableau des mois en français
mois(0)\Mois="janvier":mois(1)\Mois="février":mois(2)\Mois="mars":mois(3)\Mois="avril":mois(4)\Mois="mai"
mois(5)\Mois="juin":mois(6)\Mois="juillet":mois(7)\Mois="août":mois(8)\Mois="septembre"
mois(9)\Mois="octobre":mois(10)\Mois="novembre":mois(11)\Mois="décembre"
Dim mont.JouretMois(11); tableau des mois en anglais
mont(0)\Mont="January":mont(1)\Mont="February":mont(2)\Mont="March":mont(3)\Mont="April":mont(4)\Mont="May"
mont(5)\Mont="June":mont(6)\Mont="July":mont(7)\Mont="August":mont(8)\Mont="September"
mont(9)\Mont="October":mont(10)\Mont="November":mont(11)\Mont="December"
;une boucle sans fin repeat forever avec un delai de 1000 ms pour rafraichir les secondes
Repeat
d= DayOfWeek(Date());variable pour récupérer le nombre correspondant au jour de la semaine(de 0 à 6)
m= Month(Date()) ;variable pour récupérer le mois (nombre de 1 à 12)
dday=Day(Date()); variable pour récupérer le jour (nombre de 1 à 31)
;on regarde l'argument de la procedure *n
If *n=1 ;si c'est 1=français, on met toutes les variables string en français,on construit les strings et on met à jour les gadgets
If dday=1:th$="er ":Else:th$=" ":EndIf; cas du premier du mois
;construction du string date$
date$="Aujourd'hui, nous sommes "+semaine(d)\jour+" "+Str(dday)+th$+mois(m-1)\Mois+FormatDate(" %yyyy.",Date())
;construction du string heure$
heure$=" Il est : "+FormatDate("%hh:%ii:%ss.", Date())
SetWindowTitle(0,"Date & Heure");on en profite pour mettre à jour le titre de l'application
EndIf
If *n=10;si c'est 10, c'est l'anglais
;comme il y a beaucoup de cas, on préfère un select case en fonction de dday
Select dday
Case 1,21,31:th$="st"
Case 2,22:th$="nd"
Case 3,23:th$="rd"
Default:th$="th"
EndSelect
;on construit les strings anglais
date$="Today is "+week(d)\day+", "+mont(m-1)\Mont+" "+Str(dday)+th$+FormatDate(" %yyyy. ",Date())
heure$="It's : "+FormatDate("%hh:%ii:%ss.", Date())
;et on met le titre de l'application à jour
SetWindowTitle(0,"Date & Hour")
EndIf
;on met à jour le texte du gadget affichant la date et l'heure
SetGadgetText(1 ,date$+heure$)
Delay(1000); on attend 1s et on recommence
ForEver
EndProcedure; fin du thread
;une Macro pour initialiser l'affichage puis l'actualiser de façon dynamique
Macro affichage
; si on est en français on propose de passer en anglais et inversement
If n=10:n=1:etat$="View in English":n+1:EndIf; on rajoute 1 pour éviter que la condition suivante soit vraie
If n=1:n=10:etat$="Affichage en Français":n+1:EndIf
n-1; une fois les conditions passées, on retranche 1 pour que n ne soit égal qu'à 1 ou 10
SetGadgetText(2,etat$);, on met à jour le label du bouton
;on vérifie si le thread existe, important car au départ il n'est pas encore lancé, une fois
;qu'on clique sur le bouton, il est lancé, on le tue puis on le recrée avec comme argument n
If IsThread(ThreadHeure):KillThread(ThreadHeure):EndIf
ThreadHeure=CreateThread(@HeureCourante(),n)
EndMacro; fin de la macro
Procedure OpenMain();une procedure pour créer les fenêtres etc etc et gérer les évènements
a=10:l=45*a:h=7*a; variables de la fenêtre
If OpenWindow(0, 0, 0,l,h,"",#PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
;création des gadgets
ButtonGadget(2,15*a,4*a,15*a,2*a,etat$)
TextGadget(1,a,a,43*a,2*a,date$+heure$,#PB_Text_Center)
n=10 ;on initialise n, si n=1 on démarre l'application en anglais
affichage ;et on lance la macro pour l'affichage
EndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget:If EventGadget()=2:affichage:EndIf ; si on a cliqué sur le bouton2, on réinitialise l'affichage avec la macro
Case #PB_Event_CloseWindow:Quit = 1
EndSelect
Until Quit = 1
EndProcedure
OpenMain(); et enfin on lance la procédure principale
@+
