2 petites questions d'un linuxien

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
choubibar
Messages : 21
Inscription : jeu. 18/mars/2010 16:21

Re: 2 petites questions d'un linuxien

Message par choubibar »

Salut,

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
merci

@+ ;)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: 2 petites questions d'un linuxien

Message par flaith »

C'est pas mal du tout comme petit programme :wink:
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: 2 petites questions d'un linuxien

Message par G-Rom »

Ca marche bien ^^
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: 2 petites questions d'un linuxien

Message par Geo Trouvpatou »

Salut.

C'est sympa.

Par contre, j'avais lu qu'il était plutôt préférable de mettre les structures en début de code et surtout pas dans une procédure.

Et puisque ce code s'adresse pour les débutants, tu aurais dû l'aérer au maximum plutôt que de condenser plusieurs instructions sur une même ligne.
Ou au pire mettre quelques petits espaces.
Exemple :

Code : Tout sélectionner

If n=1 : n=10 : etat$ = "Affichage en Français" : n+1 : EndIf
au lieu de :

Code : Tout sélectionner

If n=1:n=10:etat$="Affichage en Français":n+1:EndIf
Même si pour ma part en tant que débutant j'y vois plus clair avec :

Code : Tout sélectionner

If n=1
n=10
etat$ = "Affichage en Français"
n+1
EndIf
Et même encore mieux avec l'indentation :

Code : Tout sélectionner

If n=1
      n=10
      etat$ = "Affichage en Français"
      n+1
EndIf
Quelques autres critiques :
Si le code s'adresse à des débutants :
[1] Donne des noms de variable plus explicite, comme :
choixLangue au lieu de n (Si j'ai bien compris à quoi servait cette variable)

[2] uniformise ton code.
Tu as de simples variables avec une minuscule en 1er et d'autres avec une majuscule en 1er :
Ex : affichage et Quit

Bye.
choubibar
Messages : 21
Inscription : jeu. 18/mars/2010 16:21

Re: 2 petites questions d'un linuxien

Message par choubibar »

Salut,

merci pour les critiques, pour l'indentation, j'avoue que l'interface de purebasic me déroute, j'ai l'habitude que ce soit fait automatiquement avec une fonction comme dans code::blocks, pour "n", c'est une vieille habitude du C (avec le classique "i" aussi :mrgreen: ), pour les macros, en principe j'utilise "MacroAffichage" pour du code plus complexe, surtout que les macros sont déclarées dans un pbi à part et initialisées avec xinclude dans un main.pb (un peu comme en C)

dans purebasic, les macros m'apparaissent plus comme l'équivalent d'un void en C et permettent d'éviter des procedures qui ne renvoient pas spécialement de résultat

je retourne sur mon appli d'apprentissage plus complexe (sans commentaire, sans indentation et aération :mrgreen: :mrgreen: ) le but étant de la réaliser avec moins de 800 lignes de code (contrainte posée par ma version démo actuelle)

merci

@+ ;)
choubibar
Messages : 21
Inscription : jeu. 18/mars/2010 16:21

Re: 2 petites questions d'un linuxien

Message par choubibar »

Salut,

J'ai donc terminé de "manger" mes 800 lignes de code environ avec la version de démo.

Voici ma petite application : un simple éditeur de texte (avec une utilisation détournée de scintilla)

En raison de la limitation de la taille du code, il manque pas mal de fonctions basiques : retour à la ligne automatique, justifier,aligner, centrer, remplacer, insertion date et heure, numéro des lignes dans la marge, fond coloré, utilisation des lexer, qques messagebox n'ont pas été traduites en anglais....

En raison de la taille du code, je n'ai pas pu perfectionner la fonction d'enregistrement, donc attention lors de vos essais, l'application fermera vos fichiers en cas de non conformité sans les enregistrer, l'application écrasera vos fichiers s'ils existent déjà lors d'un enregistrement sans avertissement.

Toujours en raison de la limitation (surtout au niveau de l'api cette fois), la fonction d'impression est basique : elle ne sait pas gérer plusieurs page ou le passage automatique à une nouvelle page d'impression, faites des tests éventuels uniquement avec de petits fichiers.

Si vous voulez les sources, faites moi signe.

l'application windows est disponible ici (testée uniquement sous xp):
Petit Editeur de Texte

@+ ;)
Répondre