Page 1 sur 2

Tableur

Publié : lun. 30/oct./2006 16:53
par Pascal Vernie
Bonjour à tous
Je fais depuis 3 ans des relevés météo grâce à une petite station météo.
Jusqu'à présent je note mes relevés sur un tableau Excel et je fais mes calculs de moyennes avec les formules d’Excel.
N’ayant pour l’instant fait que des petits jeux (Tétris,Sokoban etc) et quelques autres programmes avec PureBasic je me suis dis voila l’occasion de passer à d’autres méthode de programmation.
Mon problème revient à faire une sorte de tableur ma question est donc la suivante :
Est-il possible avec ListIconGadget de faire un tableau ou l’on peut rentrer des valeurs au clavier dans des cases de différentes colonnes, de faire les calculs puis d’afficher dans ce tableau les résultats avec différentes couleurs bleu pour les valeurs négatives, rouge pour les positives etc.
En vous remerciant de vos réponses
Amitiés
Pascal

Publié : lun. 30/oct./2006 18:05
par Flype
c'est possible oui mais pas facile.

sauf si tu t'orientes vers une userlibrary dédiée telle que eGrid.

voir ici :
http://www.purebasic.fr/english/viewtop ... highlight=

Publié : mar. 31/oct./2006 9:37
par Pascal Vernie
merci pour ta réponse
Pascal

Publié : mar. 31/oct./2006 10:16
par Progi1984
Et en version free voire OS, qu'y a t il comme possibilité ?

Publié : mar. 31/oct./2006 11:24
par gnozal
Progi1984 a écrit :Et en version free voire OS, qu'y a t il comme possibilité ?
A part eGrid (maintenant shareware), il y a :
CSGrid : http://www.purebasic.fr/english/viewtopic.php?t=17586
xGrid : www.purebasic.fr/english/viewtopic.php?t=21723
CreateGadget (Lib de PBOSL), à utiliser avec RAGrid.lib : http://pbosl.purearea.net/index.php?site=Libs

Publié : mar. 31/oct./2006 11:41
par olivier
J'avais pondu ce code pour faire un tableau...

Code : Tout sélectionner


Enumeration #PB_Compiler_EnumerationValue
     #saisie
     #area_tableau
     #image_tableau
     #image_colonne_temp
     #image_colonne
     #image_ligne_temp
     #image_ligne
     #image_coin
     #image_coin_hg
     #image_coin_hd
     #image_coin_bg
     
EndEnumeration

#tab_x=10
#tab_y=10
#tab_l=400
#tab_h=400
#tab_nb_colonne=20
#tab_largeur_colonne=60
#tab_nb_ligne=100
#tab_hauteur_ligne=20
#tab_largeur_colonne_tete=20

Enumeration
     #Fenetre_base
EndEnumeration

Global der_x,der_y,der_c,der_l
Procedure lecture_tableau()
     Global Dim tarif(#tab_nb_colonne,#tab_nb_ligne)
     For i=0 To #tab_nb_ligne
          prix=20+Random(100)
          For j=0 To #tab_nb_colonne
               tarif(j,i)=prix*(j+1)
          Next
     Next
EndProcedure

Procedure deplace_ligne_colonne()
    
          pos_x=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
          pos_y=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)
          CreateGadgetList(WindowID(#Fenetre_base))
          GrabImage(#image_colonne_temp, #image_colonne, pos_x, 0, #tab_l-#tab_largeur_colonne_tete-20, #tab_hauteur_ligne)
          ImageGadget(#image_colonne,#tab_x+#tab_largeur_colonne_tete+1,#tab_y,10,10,ImageID(#image_colonne))
          
          GrabImage(#image_ligne_temp, #image_ligne, 0, pos_y, #tab_largeur_colonne_tete, #tab_h-20-#tab_hauteur_ligne)
          ImageGadget(#image_ligne,#tab_x,#tab_y+#tab_hauteur_ligne+1,10,10,ImageID(#image_ligne))

     
EndProcedure

Procedure creation_ligne_colonne()
     
     CreateGadgetList(WindowID(#Fenetre_base))
     li=#tab_nb_colonne*#tab_largeur_colonne
     hi=#tab_nb_ligne*#tab_hauteur_ligne
     
     ;{- colonne
     CreateImage(#image_colonne_temp,li,#tab_hauteur_ligne)
     LoadFont(1, "Arial", 10)
     StartDrawing(ImageOutput(#image_colonne_temp))
     Box(0, 0, li,hi,$AEAEAE)
     
     DrawingFont(FontID(1))
     DrawingMode(1)
     For i=1 To  #tab_hauteur_ligne/2
          LineXY(0,i,li,i,RGB(196+5*i,196+5*i,196+5*i))
          LineXY(0,#tab_hauteur_ligne-i,li,#tab_hauteur_ligne-i,RGB(196+5*i,196+5*i,196+5*i))
     Next
     
     
     For i=1 To #tab_nb_colonne
          LineXY( i*#tab_largeur_colonne-1,6,i*#tab_largeur_colonne-1, #tab_hauteur_ligne-6,$C5C5C5)
          LineXY( i*#tab_largeur_colonne,4,i*#tab_largeur_colonne, #tab_hauteur_ligne-4,$585858)
          LineXY( i*#tab_largeur_colonne+1,6,i*#tab_largeur_colonne+1, #tab_hauteur_ligne-6,$C5C5C5)
          DrawText((i-1)*#tab_largeur_colonne+15, 3, Str(i))
     Next
     
     StopDrawing()
     
     ;}
     
     ;{- ligne
     CreateImage(#image_ligne_temp,#tab_largeur_colonne_tete,hi)
     LoadFont(1, "Arial", 10)
     StartDrawing(ImageOutput(#image_ligne_temp))
     
     Box(0, 0, #tab_largeur_colonne,hi,$AEAEAE)
     
     DrawingFont(FontID(1))
     DrawingMode(1)
     For i=1 To  #tab_largeur_colonne_tete/2
          c=180
          LineXY(i,0,i,hi,RGB(c+5*i,c+5*i,c+5*i))
          LineXY(#tab_largeur_colonne_tete-i,0,#tab_largeur_colonne_tete-i,hi,RGB(c+5*i,c+5*i,c+5*i))
     Next
     
     For i=1 To #tab_nb_ligne
          LineXY(6,i*#tab_hauteur_ligne-1,#tab_largeur_colonne_tete-6,i*#tab_hauteur_ligne-1,$C5C5C5)
          LineXY(4,i*#tab_hauteur_ligne,#tab_largeur_colonne_tete-4,i*#tab_hauteur_ligne,$585858)
          LineXY(6,i*#tab_hauteur_ligne+1,#tab_largeur_colonne_tete-6,i*#tab_hauteur_ligne+1,$C5C5C5)
          
          DrawText(#tab_largeur_colonne_tete/2-(TextWidth(Str(i))/2) , (i-1)*#tab_hauteur_ligne+2, Str(i))
     Next
     
     StopDrawing()
     
     ;}
     deplace_ligne_colonne()
EndProcedure

Procedure tableau()
     
     
     
     CreateGadgetList(WindowID(#Fenetre_base))
     li=#tab_nb_colonne*#tab_largeur_colonne
     hi=#tab_nb_ligne*#tab_hauteur_ligne
     
     
     
     ScrollAreaGadget(#area_tableau,#tab_x+#tab_largeur_colonne_tete,#tab_y+#tab_hauteur_ligne,#tab_l-#tab_largeur_colonne_tete,#tab_h-#tab_hauteur_ligne,li,hi,20,#PB_ScrollArea_Single )
     creation_ligne_colonne()
     OpenGadgetList(#area_tableau)
     StringGadget(#saisie,0,0,#tab_largeur_colonne,#tab_hauteur_ligne,"",#PB_String_Numeric)
     SetGadgetColor(#saisie,#PB_Gadget_BackColor,$F1B4B7)
     HideGadget(#saisie,1)
     CreateImage(#image_tableau,li,hi)
     LoadFont(1, "Arial", 10)
     StartDrawing(ImageOutput(#image_tableau))
     Box(0, 0, li,hi,$FFFFFF)
     
     DrawingFont(FontID(1))
     For i=1 To #tab_nb_colonne
          LineXY( i*#tab_largeur_colonne,0,i*#tab_largeur_colonne, hi,$585858)
          LineXY( i*#tab_largeur_colonne+1,0,i*#tab_largeur_colonne+1, hi,$C5C5C5)
          ;DrawText(i*largeur_colonne+15, 3, Str(i))
     Next
     For i=1 To #tab_nb_ligne
          LineXY(0,i*#tab_hauteur_ligne,li,i*#tab_hauteur_ligne,$585858)
          LineXY(0,i*#tab_hauteur_ligne+1,li,i*#tab_hauteur_ligne+1,$C5C5C5)
          ;DrawText(5, i*hauteur_ligne+2, Str(i))
     Next
     ;DrawingMode(1)
     For i=0 To #tab_nb_ligne
          For j=0 To #tab_nb_colonne
               DrawText((j+1)*#tab_largeur_colonne-5-TextWidth(Str(tarif(j,i))) , (i)*#tab_hauteur_ligne+2, Str(tarif(j,i)))
          Next
     Next
     
     StopDrawing()
     ImageGadget(#image_tableau,0,0,l,h,ImageID(#image_tableau))
     ;{creation des coins
     CreateGadgetList(WindowID(#Fenetre_base))
     
     CreateImage(#image_coin,#tab_largeur_colonne_tete*2,#tab_largeur_colonne_tete*2)
     StartDrawing(ImageOutput(#image_coin))
     Box(0,0,#tab_largeur_colonne_tete*2,#tab_largeur_colonne_tete*2,$D2D2D2)
     DrawingMode(4)
     For i=1 To #tab_largeur_colonne_tete/2
          c=180
          Circle(#tab_largeur_colonne_tete,#tab_largeur_colonne_tete, i,RGB(c+5*i,c+5*i,c+5*i))
          Circle(#tab_largeur_colonne_tete,#tab_largeur_colonne_tete, #tab_largeur_colonne_tete-i,RGB(c+5*i,c+5*i,c+5*i))
     Next
     
     StopDrawing()
     GrabImage(#image_coin, #image_coin_hg, 0, 0, #tab_largeur_colonne_tete,#tab_largeur_colonne_tete)
     GrabImage(#image_coin, #image_coin_hd, #tab_largeur_colonne_tete, 0, #tab_largeur_colonne_tete,#tab_largeur_colonne_tete)
     GrabImage(#image_coin, #image_coin_bg, 0, #tab_largeur_colonne_tete, #tab_largeur_colonne_tete,#tab_largeur_colonne_tete)
     ImageGadget(#image_coin_hg,#tab_x,#tab_y,#tab_largeur_colonne_tete,#tab_hauteur_ligne,ImageID(#image_coin_hg))
     ImageGadget(#image_coin_hd,#tab_x+#tab_l-#tab_largeur_colonne_tete,#tab_y,#tab_largeur_colonne_tete,#tab_hauteur_ligne,ImageID(#image_coin_hd))
     ImageGadget(#image_coin_bg,#tab_x,#tab_y+#tab_h-#tab_largeur_colonne_tete,#tab_largeur_colonne_tete,#tab_hauteur_ligne,ImageID(#image_coin_bg))
     
     ;}
EndProcedure

Procedure choix_cellule(c,l,dep=-1)
     If GetAsyncKeyState_(#VK_SHIFT) >=0
          If GetActiveGadget()=#saisie
               If dep>0 ;{deplacement avec les fleche ou la touche entree
                    Select dep
                         
                         Case 4 : c=der_c-1  : l=der_l
                         Case 8 : c=der_c     : l=der_l -1
                         Case 6 : c=der_c+1 : l=der_l
                         Case 2 : c=der_c     : l=der_l +1
                         Case 1 : c=#tab_nb_colonne-1: l=der_l  : SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+#tab_nb_colonne*#tab_largeur_colonne)
                         Case 7 : c=0: l=der_l  : SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, 0)
                              
                    EndSelect
               EndIf
               ;}
          EndIf
          ;{verification du depacement dans le tableau
          If c>#tab_nb_colonne-1 : c=#tab_nb_colonne-1 : EndIf
          If c<0 : c=0 : EndIf
          If l>#tab_nb_ligne-1: l=#tab_nb_ligne-1 : EndIf
          If l<0 : l=0 : EndIf
          ;}
          
          ;{mise à jour du tableau : si la cullule est modifié choix de la couleur
          nv_text$=GetGadgetText(#saisie)
          If nv_text$<>"" And tarif(der_c,der_l)<>Val(nv_text$)
               tarif(der_c,der_l)=Val(nv_text$)
               couleur=$B3F2C2
          Else
               couleur=$FFFFFF
          EndIf
          ;}
          
          ;{ redessine le tableau
          StartDrawing(ImageOutput(#image_tableau))
          ;efface avec un dessin de couleur
          DrawingFont(FontID(1))
          Box(der_c*#tab_largeur_colonne+2,der_l*#tab_hauteur_ligne+2, #tab_largeur_colonne-2,#tab_hauteur_ligne-2,couleur)
          DrawingMode(1)
          DrawText((der_c+1)*#tab_largeur_colonne-5-TextWidth(Str(tarif(der_c,der_l))), der_l*#tab_hauteur_ligne+2, Str(tarif(der_c,der_l)))
          ;(j+1)*#tab_largeur_colonne-5-TextWidth(Str(tarif(j,i)))
          ; dessine la boite de selection de la cellule
          If dep<>0
               Box(c*#tab_largeur_colonne+2,l*#tab_hauteur_ligne+2, #tab_largeur_colonne-2,#tab_hauteur_ligne-2,$F1B4B7)
               
               StopDrawing()
               der_c=c
               der_l=l
               
               SetGadgetState(#image_tableau,ImageID(#image_tableau))
               OpenGadgetList(#area_tableau)
               StringGadget(#saisie,c*#tab_largeur_colonne+1,l*#tab_hauteur_ligne+1,#tab_largeur_colonne,#tab_hauteur_ligne,Str(tarif(c,l)),#PB_String_Numeric )
               SetGadgetColor(#saisie,#PB_Gadget_BackColor,$F1B4B7)
               SetActiveGadget(#saisie)
               ;SimulateKeyPress(35,200,0,0,1)
          Else
               der_c=0
               der_l=0
               StopDrawing()
               SetGadgetState(#image_tableau,ImageID(#image_tableau))
               HideGadget(#saisie,1)
               SetGadgetText(#saisie,"")
          EndIf
          
          ;}
          
          ;{ deplacement de la zone area
          If  GadgetX(#saisie)>GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+#tab_l-#tab_largeur_colonne*2
               SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+#tab_largeur_colonne)
          Else
               If  GadgetX(#saisie)<GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
                    SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)-#tab_largeur_colonne)
               EndIf
          EndIf
          
          If  GadgetY(#saisie)>GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)+#tab_h-#tab_hauteur_ligne*2
               SetGadgetAttribute(#area_tableau,#PB_ScrollArea_y, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)+#tab_hauteur_ligne)
          Else
               If  GadgetY(#saisie)<GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)
                    SetGadgetAttribute(#area_tableau,#PB_ScrollArea_y, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)-#tab_hauteur_ligne)
               EndIf
          EndIf
          ;}
          deplace_ligne_colonne()
     EndIf
     
     
EndProcedure

Procedure clic_tableau()
     
     x_i=WindowMouseX(#Fenetre_base)-#tab_x+#tab_largeur_colonne_tete+GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
     y_i=WindowMouseY(#Fenetre_base)-#tab_y+GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)
     ;SetCursorPos_(WindowX(#Fenetre_base)+ WindowMouseX(#Fenetre_base)+45,WindowY(#Fenetre_base)+WindowMouseY(#Fenetre_base)+25)
     num_col=x_i/#tab_largeur_colonne-1
     num_ligne=y_i/#tab_hauteur_ligne-1
     ;Debug Str(num_col)+" : "+Str(num_ligne)
     choix_cellule(num_col,num_ligne)
     
EndProcedure

Procedure valide_saisie()
     Debug GadgetX(#saisie)
     If GadgetX(#saisie)>#tab_l/2
          SetGadgetAttribute(#area_tableau,#PB_ScrollArea_X, GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+#tab_largeur_colonne)
          creation_ligne_colonne()
     EndIf
     
     x_m=WindowX(#Fenetre_base)+ GadgetX(#area_tableau)-GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)+ GadgetX(#saisie)+#tab_largeur_colonne+5
     y_m=WindowY(#Fenetre_base)+ GadgetY(#area_tableau)+GadgetY(#saisie)-GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)+5+25
     ; #MOUSEEVENTF_LEFTDOWN
     ; #MOUSEEVENTF_LEFTUP
     SetCursorPos_(x_m,y_m)
     mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTDOWN   ,  x_m,y_m,0,0)
     mouse_event_(#MOUSEEVENTF_ABSOLUTE | #MOUSEEVENTF_LEFTUP,  x_m,y_m,0,0)
     
EndProcedure

Procedure defile_tableau()
     nv_x=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_X)
     nv_y=GetGadgetAttribute(#area_tableau,#PB_ScrollArea_y)
     If der_x<>nv_x Or der_y<>nv_y
          der_x=nv_x
          der_y=nv_y
          creation_ligne_colonne()
     EndIf
EndProcedure

Procedure CallBack_base(Hnd,Msg,wParam,lParam)
     Resultat = #PB_ProcessPureBasicEvents
     
     ;{- fenetre de base
     If Hnd=WindowID(#Fenetre_base)
          If Msg=13103
               deplace_ligne_colonne()
          EndIf
          
     EndIf
     ;}
     
     
     ProcedureReturn Resultat
EndProcedure

If OpenWindow(#Fenetre_base, 463, 182, 500, 500, "Prog base",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
     If CreateGadgetList(WindowID(#Fenetre_base))
          
         
          lecture_tableau()
          tableau()
           SetWindowCallback(@CallBack_base(),#Fenetre_base)
          Repeat
               event=WaitWindowEvent()
               
               ;If event<>0 : Debug event : EndIf
               If EventWindow()=#Fenetre_base
                    
                    Select event
                         Case #WM_KEYDOWN
                              
                              Debug EventwParam()
                              Select EventwParam()
                                   
                                   Case 36 ;tout en haut
                                        choix_cellule(0,0,7)
                                   Case 35 ;tout à la fin
                                        choix_cellule(0,0,1)
                                   Case 13
                                        choix_cellule(0,0,6)
                                   Case 37
                                        choix_cellule(0,0,4)
                                   Case 38
                                        choix_cellule(0,0,8)
                                   Case 39
                                        choix_cellule(0,0,6)
                                   Case 40
                                        choix_cellule(0,0,2)
                                   Case 27 ;escape
                                        choix_cellule(0,0,0)
                                        
                              EndSelect
                              
                         Case #PB_Event_Gadget; *****************Choix d'un bouton
                              Select EventGadget()
                                   
                                   
                                   Case #image_tableau
                                        clic_tableau()
                                        
                              EndSelect
                              
                              
                              
                         Case #WM_CLOSE ; ***************************#PB_EventCloseWindow
                              quit=1
                              
                              
                    EndSelect
               EndIf
               
          Until quit = 1
     EndIf
EndIf

   
End

Publié : mar. 31/oct./2006 11:53
par Backup
@olivier : Chapeau bas , tres beau code :D

Publié : mar. 31/oct./2006 11:56
par Pascal Vernie
Trés interressant ton code Olivier.
Je vais essayer de le comprendre car c'est tout à fait dans l'optique de ce que je veux essayer de faire. Et je vais trouver la réponse à mon Post "input??" puisque l'on peut rentrer des valeurs dans ton tableau.
Merci.
Amitiés.
Pascal

Publié : mar. 31/oct./2006 11:57
par Pascal Vernie
Trés interressant ton code Olivier.
Je vais essayer de le comprendre car c'est tout à fait dans l'optique de ce que je veux essayer de faire. Et je vais trouver la réponse à mon Post "input??" puisque l'on peut rentrer des valeurs dans ton tableau.
Merci.
Amitiés.
Pascal

Publié : mar. 31/oct./2006 11:59
par Pascal Vernie
excusez le double Post, fausse manip de ma part

Publié : mar. 31/oct./2006 12:00
par Progi1984
Je pencherais personnellement plus pour xGrid : OpenSource et bien codé !

Publié : mar. 31/oct./2006 12:29
par lionel_om
Progi1984 a écrit :Je pencherais personnellement plus pour xGrid : OpenSource et bien codé !
Ca bug chez moi : le curseur de la souris disparaît quand on le passe sur la grille. Dommage sinon on effet ça à l'air vachement bien fait et complet !!!

Publié : mar. 31/oct./2006 12:35
par Progi1984
Regarde que les curseurs soient bien chargés !

Publié : mar. 31/oct./2006 15:07
par lionel_om
Progi1984 a écrit :Regarde que les curseurs soient bien chargés !
Y'a aucun endroit dans le programme où il charge les icônes. Y'a juste dans les commentaires de l'éditeur JaBe (les commentaires en fin de fichier) des assignations, mais je ne connais pas comment ça marche. Donc est-ce spécifique à JaBe ou pas ? Car j'utilise l'éditeur original de PB.

Publié : mar. 31/oct./2006 15:30
par Progi1984
Je regarde et te tiens au courant !

[edit 15:35]
-Créer un fichier file.RC
-mets cela dedans :

Code : Tout sélectionner

2   CURSOR   "C:\Documents and Settings\usr1\Bureau\Divers\USBDivers\old_CellSelect.cur"
3   CURSOR   "C:\Documents and Settings\usr1\Bureau\Divers\USBDivers\RowSelect.cur"
4   CURSOR   "C:\Documents and Settings\usr1\Bureau\Divers\USBDivers\ColumnSelect.cur"
5   CURSOR   "C:\Documents and Settings\usr1\Bureau\Divers\USBDivers\SizeV.cur"
6   CURSOR   "C:\Documents and Settings\usr1\Bureau\Divers\USBDivers\SizeH.cur"
En remplacant C:\Documents and Settings\usr1\Bureau\Divers\USBDivers\ par le bon chemin
- enregistre
-Ouvre main.pb
- va dans Compilateur > options du compilateur> ressources >
- clique sur les trois petits points
- va chercher le fichier file.RC
- Ajouter
- ok
- et F5 :)