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