Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Objet GRID. | |
|
+4mindstorm Jean Claude Klaus pan59 8 participants | |
Auteur | Message |
---|
pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Objet GRID. Sam 11 Jan 2014 - 17:56 | |
| Bonjour à tous.
L'un d'entre vous utilise-t-il ce genre d'objet ?
Je viens de l'expérimenter.
A ma grande surprise, il n'est pas possible de saisir directement dans les cellules !
Avez-vous une solution à proposer ?
Merci de votre aide. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Objet GRID. Sam 11 Jan 2014 - 18:13 | |
| Oui, on ne peut pas saisir directement dans les cellules. La propriété "éditeur" du TStringGrid n'est pas activée, d'où cette restriction.
J'utilise beaucoup les GRID, qui pour moi sont des objets commodes de présentation formattée. Je les utilise exactement comme les LIST, sauf qu'il y a plusieurs colonnes.
Alors, pour saisir dedans, il faut avoir 3 zones de saisie séparées et un bouton: pour choisir la ligne ciblée, pour choisir la colonne ciblée, pour saisir la valeur, et finalement pour valider la saisie.
Dans mes programmes, je charge ces 3 zones par un clic gauche dans une des cellules du GRID. Das la routine ON_CLICK du GRID, je détermine la ligne par GRID_Y_TO_ROW, la colonne par GRID_X_TO_COLUMN, et je copie ces valeurs dans les deux zones de saisie correspondantes, ainsi que le contenu de la cellule dans sa zone de saisie. La routine ON_CLICK du bouton effectue l'opération inverse, en utilisant le contenu des deux zones de saisie pour ligne et colonne comme adressage du tableau.
Bonne chance ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Objet GRID. Sam 11 Jan 2014 - 19:45 | |
| Et voici un petit code de démo de la méthode: - Code:
-
label click_grid, valider dim i%, lig%, col%
grid 1 height 1,280 : width 1,350 grid_row 1,41 : grid_column 1,5 on_click 1,click_grid for i%=1 to 40 grid_write 1,i%+1,1,str$(i%) next i% for i%=1 to 4 grid_write 1,1,i%+1,str$(i%) next i%
alpha 11 : top 11,10 : left 11,400 : caption 11,"Ligne:" edit 12 : top 12,10 : left 12,450 : width 12,40 alpha 13 : top 13,40 : left 13,400 : caption 13,"Colonne:" edit 14 : top 14,40 : left 14,450 : width 14,40 alpha 15 : top 15,80 : left 15,400 : caption 15,"Contenu:" edit 16 : top 16,80 : left 16,450 : width 16,80
button 20 : top 20,110 : left 20,450 : caption 20,"Valider" on_click 20,valider
end
click_grid: lig% = grid_y_to_row(1,mouse_y_left_down(1)) - 1 col% = grid_x_to_column(1,mouse_x_left_down(1)) - 1 text 12,str$(lig%) text 14,str$(col%) text 16,grid_read$(1,lig%+1,col%+1) return valider: lig% = val(text$(12)) col% = val(text$(14)) grid_write 1,lig%+1,col%+1,text$(16) return
| |
| | | pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Objet GRID. Sam 11 Jan 2014 - 20:08 | |
| Bonsoir.
Un grand merci Klaus pour le petit bout de code.
Je vais de ce pas l'incorporer dans mon programme général de plus de 25.000 lignes.
| |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Objet GRID. Sam 11 Jan 2014 - 20:50 | |
| Cet objet GRID est d'une très grande utilité et je déplore qu'il ne soit pas plus avancé. Mais il a le mérite d’exister et avec un peu d'imagination on peut en tirer quelque chose. Ton code, Klaus, montre des possibilités, mais je trouve dommage que La propriété "éditeur" du TStringGrid n'est pas activée (pour reprendre tes propos). Je souhaite que cet objet évolue, mais bon, Jack ne peut pas être sur tous les fronts et je le comprends.
Merci à Klaus pour ce petit code qui montre que GRID est exploitable.
A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Objet GRID. Sam 11 Jan 2014 - 20:57 | |
| Eh bien, continuons de broder autour du GRID. Voici une variante du code ci-dessus. Le bouton Valider a fait place au bouton Saisir, et la zone de saisie des données est inactive. Un clic sur le bouton Saisir active ce champ et positionne le curseur dedans. Le bouton devient "Valider". Lors du clic sur le bouton, les données sont placées dans le tableau, puis retour à la situation initiale: - Code:
-
label click_grid, valider dim i%, lig%, col%
grid 1 height 1,280 : width 1,350 grid_row 1,41 : grid_column 1,5 on_click 1,click_grid for i%=1 to 40 grid_write 1,i%+1,1,str$(i%) next i% for i%=1 to 4 grid_write 1,1,i%+1,str$(i%) next i%
alpha 11 : top 11,10 : left 11,400 : caption 11,"Ligne:" edit 12 : top 12,10 : left 12,450 : width 12,40 alpha 13 : top 13,40 : left 13,400 : caption 13,"Colonne:" edit 14 : top 14,40 : left 14,450 : width 14,40 alpha 15 : top 15,80 : left 15,400 : caption 15,"Contenu:" edit 16 : top 16,80 : left 16,450 : width 16,80 : inactive 16
button 20 : top 20,110 : left 20,450 : caption 20,"Saisir" on_click 20,valider
end
click_grid: lig% = grid_y_to_row(1,mouse_y_left_down(1)) - 1 col% = grid_x_to_column(1,mouse_x_left_down(1)) - 1 text 12,str$(lig%) text 14,str$(col%) text 16,grid_read$(1,lig%+1,col%+1) return valider: if active(16)=1 lig% = val(text$(12)) col% = val(text$(14)) grid_write 1,lig%+1,col%+1,text$(16) inactive 16 caption 20,"Saisir" else active 16 caption 20,"Valider" set_focus 16 end_if return
| |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Objet GRID. Sam 11 Jan 2014 - 21:06 | |
| Oui c'est bien ce ce que disais, on peut broder sur cet objet. Je me souviens que tu avais fait un code qui permettait de colorer les cellules. Je vais essayer de retrouver ce code.
| |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: Objet GRID. Sam 11 Jan 2014 - 21:41 | |
| bonsoir a tous et merci , je viens de decouvrir la fonction grid il serai surement utile pour stocker des données ou autre | |
| | | pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Objet GRID. Dim 12 Jan 2014 - 16:13 | |
| Bonjour à tous.
Je tiens à remarquer que le calcul de la ligne et de la colonne est faussé, lorsque vous utilisez les commandes suivantes:
mouse_y_left_down() et mouse_x_left_down()
Ces commandes ne tiennent pas compte de l'épaisseur des traits de séparation horizontal et vertical entre chaque ligne et chaque colonne.
Il faut donc ajouter 1 pixel par ligne et colonne, dans le cas où vous souhaiteriez placer un objet EDIT de saisie dans la ligne et colonne sélectionnées.
| |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Dim 12 Jan 2014 - 18:35 | |
| C'est une discussion inéressante, c'est vrai qu'on ne peut pas écrire directement dans les cellules du grid. Mais bon, on peut facilement faire comme Klaus l'a montré. Mais ce que je trouve qui manque, dans le grid, c'est la possibilité de déplacer le grand carré bleu qui désigne où est le curseur, il est en 1,1 au début et si on écrit quelque chose par exemple en 3,2 eh bien il reste en 1,1 Cela a le désavantage de ne pas indiquer l'endroit où le texte va être affiché avant qu'on l'affiche, ce qui peut facilement arriver lorsqu'on est dans un programme plus complexe que la petite démonstration ci-dessus. Tiens, j'ai pas fait d'humour, aujourd'hui... | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Objet GRID. Dim 12 Jan 2014 - 19:42 | |
| Il faut aussi voir la simplicité d'utilisation de la sauvegarde par la fonction GRID_SAVE
Elle permet en une seule ligne de faire une sauvegarde complète du tableau C'est extrêmement pratique et simple.
Je n'utilise plus que cela pour stocker mes données dans un programme, en plus c'est très rapide !!!
Je pense vous faire partager d'ici quelques temps un programme de gestion sportive (alimentation, sport, mensurations, objectifs, etc...) ou je n'utilise que des GRID pour tout gérer.
En tout cas pour moi c'est LA fonction incontournable pour la gestion des données. | |
| | | pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Objet GRID. Lun 13 Jan 2014 - 10:57 | |
| Bonjour à tous. Merci de votre aide pour le débogage de ce petit programme. Les valeurs saisies dans l'objet EDIT ne s'inscrivent pas toujours dans les cases sélectionnées. Et là j'avoue ne pas comprendre. Petite précision: la 1ère colonne ne doit pas apparaître sur la FORM. - Code:
-
dim colonne%, h%, hauteur_ecran%, l%, largeur_ecran%, ligne%, nc%, xx%, yy% dim chaine$, fichier$, langue_cible$, langue_source$, temporaire$
langue_cible$="espagnol" langue_source$="français"
label enregistrer_dico_perso, selection
gerer_vocabulaire_perso() end
sub gerer_vocabulaire_perso()
largeur_ecran%=screen_x hauteur_ecran%=screen_y
h%=25 l%=125 nc%=6
form 182 caption 182,"Gestion d'une liste de vocabulaire personnel." width 182,(nc%-1)*l%+50 height 182,500 left 182,(largeur_ecran%-width(182))/2 top 182,(hauteur_ecran%-height(182))/2
grid 331 parent 331,182 color 331,255,255,153 left 331,(l%*-1)-1 width 331,width(182)+l% height 331,height(182) grid_column 331,nc% grid_row 331,100 grid_row_height 331,h% grid_column_width 331,l% ' 1ère colonne invisible. ' grid_one_column_width 331,1,1 ' 1ère rangée fixe. grid_row_fixed 331,1
font_size 331,12
fichier$="dico_perso_"+langue_source$+"_"+langue_cible$+".txt" if file_exists(fichier$)>0 grid_load 331,fichier$ else aligner(331,"Mot français","C",100) grid_write 331,1,2,temporaire$ aligner(331,"Type","C",100) grid_write 331,1,3,temporaire$ aligner(331,"Mot "+langue_cible$,"C",100) grid_write 331,1,4,temporaire$ aligner(331,"Type","C",100) grid_write 331,1,5,temporaire$ aligner(331,"Sens","C",100) grid_write 331,1,6,temporaire$ end_if
on_click 331,selection on_key_down 331,selection
edit 321 parent 321,182 left 321,-200 font_size 321,12 font_bold 321 font_color 321,0,128,255
button 666 parent 666,182 caption 666,"Enregistrer et quitter" font_bold 666 font_size 666,12 left 666,(width(182)-200)/2 top 666,height(182)-90 width 666,200 height 666,30 on_click 666,enregistrer_dico_perso
end_sub
enregistrer_dico_perso: grid_save 331,100,6,fichier$ message "Données enregistrées !"
hide 182 return
selection:
ligne%=int(mouse_y_left_down(331)/h%)+1 yy%=(ligne%-1)*(h%+1)
colonne%=int(mouse_x_left_down(331)/l%)+1 xx%=(colonne%-1)*(l%+1)
caption 182,"Ligne: "+str$(ligne%)+", colonne: "+str$(colonne%)
chaine$=text$(321) if len(chaine$)>0 grid_write 331,ligne%,colonne%,chaine$ text 321,"" end_if left 321,xx%-l% top 321,yy% width 321,l%+1 height 321,h%+1
set_focus 321 ' text 321,"" return
sub aligner(no%,t$,align$,wc%)
dim_local sp%,x%,t%
sp% = text_width(" ",no%) : ' La variable sp% correspond à la taille d'un espace t% = text_width(t$,no%) : ' La variable t% correspond à la taille du texte
if align$="C" x% = int((wc%-sp%-t%)/sp%*2) : ' Calcul du nombre d'espaces à ajouter devant la chaine else if align$="D" then x% = int((wc%-sp%-t%)/sp%) end_if if x% > 0 then t$ = string$(x%," ")+t$ : ' On ajoute les espaces devant la chaine (0 si alignement à gauche)
temporaire$ = t$
end_sub | |
| | | pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Objet GRID. Lun 13 Jan 2014 - 11:31 | |
| Je viens juste de trouver la solution à ce bug. Voici donc le code modifié. - Code:
-
dim colonne%, h%, hauteur_ecran%, l%, largeur_ecran%, ligne%, nc%, xx%, yy% dim chaine$, fichier$, langue_cible$, langue_source$, temporaire$
langue_cible$="espagnol" langue_source$="français"
label enregistrer_dico_perso, selection
gerer_vocabulaire_perso() end
sub gerer_vocabulaire_perso()
largeur_ecran%=screen_x hauteur_ecran%=screen_y
h%=25 l%=125 nc%=6
form 182 caption 182,"Gestion d'une liste de vocabulaire personnel." width 182,(nc%-1)*l%+50 height 182,500 left 182,(largeur_ecran%-width(182))/2 top 182,(hauteur_ecran%-height(182))/2
grid 331 parent 331,182 color 331,255,255,153 left 331,(l%*-1)-1 width 331,width(182)+l% height 331,height(182) grid_column 331,nc% grid_row 331,100 grid_row_height 331,h% grid_column_width 331,l% ' 1ère colonne invisible. ' grid_one_column_width 331,1,1 ' 1ère rangée fixe. grid_row_fixed 331,1
font_size 331,12
fichier$="dico_perso_"+langue_source$+"_"+langue_cible$+".txt" if file_exists(fichier$)>0 grid_load 331,fichier$ else aligner(331,"Mot français","C",100) grid_write 331,1,2,temporaire$ aligner(331,"Type","C",100) grid_write 331,1,3,temporaire$ aligner(331,"Mot "+langue_cible$,"C",100) grid_write 331,1,4,temporaire$ aligner(331,"Type","C",100) grid_write 331,1,5,temporaire$ aligner(331,"Sens","C",100) grid_write 331,1,6,temporaire$ end_if
on_click 331,selection on_key_down 331,selection
edit 321 parent 321,182 left 321,-200 font_size 321,12 font_bold 321 font_color 321,0,128,255
button 666 parent 666,182 caption 666,"Enregistrer et quitter" font_bold 666 font_size 666,12 left 666,(width(182)-200)/2 top 666,height(182)-90 width 666,200 height 666,30 on_click 666,enregistrer_dico_perso
end_sub
enregistrer_dico_perso: grid_save 331,100,6,fichier$ message "Données enregistrées !"
hide 182 return
selection:
chaine$=text$(321) if len(chaine$)>0 then grid_write 331,ligne%,colonne%,chaine$
ligne%=int(mouse_y_left_down(331)/h%)+1 yy%=(ligne%-1)*(h%+1)
colonne%=int(mouse_x_left_down(331)/l%)+1 xx%=(colonne%-1)*(l%+1)
caption 182,"Ligne: "+str$(ligne%)+", colonne: "+str$(colonne%)
left 321,xx%-l% top 321,yy% width 321,l%+1 height 321,h%+1
set_focus 321 text 321,"" return
sub aligner(no%,t$,align$,wc%)
dim_local sp%,x%,t%
sp% = text_width(" ",no%) : ' La variable sp% correspond à la taille d'un espace t% = text_width(t$,no%) : ' La variable t% correspond à la taille du texte
if align$="C" x% = int((wc%-sp%-t%)/sp%*2) : ' Calcul du nombre d'espaces à ajouter devant la chaine else if align$="D" then x% = int((wc%-sp%-t%)/sp%) end_if if x% > 0 then t$ = string$(x%," ")+t$ : ' On ajoute les espaces devant la chaine (0 si alignement à gauche)
temporaire$ = t$
end_sub | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Objet GRID. Lun 13 Jan 2014 - 19:30 | |
| Joli.
Petite suggestion: lorsque tu cliques sur une cellule, il serait intéressant d'afficher le contenu de la cellule dans l'EDIT que tu places par-dessus. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Objet GRID. Lun 13 Jan 2014 - 19:31 | |
| Puisque l'on parle du GRID et de ses fonctions...
Quelqu'un aurait il une idée pour faire un classement facile sur une ou plusieurs lignes ou colonnes.
Cela permet par exemple un classement chronologique ou alphabétique.
Peut être Jack peut trouver la fonction intéressante et la développer... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 13 Jan 2014 - 19:40 | |
| Pour le classement chronologique, il me semble que j' avais un truc avec ma petite dll... je vais essayer de retrouver cela... Edit : c'est dans YGERONIMI/Astuces/Grid tri par date sur mon webdav... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Objet GRID. Lun 13 Jan 2014 - 20:09 | |
| Ton code fonctionne très bien sur une colonne, Ygeronimi. Mais si te GRID contient plusieurs colonnes, ça ne marche pas - les autres colonnes ne snt pas modifiées par le tri.
Une solution qui marchera dans TOUS les cas: - créer un DLIST avec SORT_on - écrire dans ce DLIST, pour chaque ligne du tableau à trier, le contenu de la colonne servant de critère de tri, complétée par des espaces jusqu'à une longueur maxilale fixe (30, 100, 200 caractères...), suivi de toutes les cellules dans l'ordre, y compris la cellule de critère de tri, avec un caractère particulier comme séparateur (exemple: ²). - effacer le GRID complètement - la DLIST étant triée automatiquement, après avoir écrit toutes les lignes dedans, il ne reste plus qu'à lire la DLIST ligne par ligne et de réécrire les cellules du GRID.
Et voilà...
Ceci dit, le tri par date de YGeronimi est impeccable. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 13 Jan 2014 - 20:12 | |
| Ce n' était qu' une ébauche mais on peut ajouter ce que l' on veut pour arriver à ses fins... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 13 Jan 2014 - 21:55 | |
| Voilà un petit prog de tri par date avec un grid - Code:
-
dim x%,sep%,L$ dim date_sup%,z%,date_cell%,Donnee$,DateSupLign% dim jour%,mois%,an%,result% label Charger,Trier
' initialisation du form width 0,800 :height 0,300 :font_name 0,"arial" :font_size 0,8 caption 0,"Tri d' un Grid par date"
' initialisation du grid grid 1: top 1,0 :left 1,0 :width 1,width(0)-16 :height 1,155 grid_row 1,6 : grid_column 1,5 grid_one_column_width 1,2,80 grid_one_column_width 1,3,120 grid_one_column_width 1,4,120 grid_one_column_width 1,5,300 for x%=2 to 6 grid_write 1,x%,1,str$(x%-1) next x% grid_write 1,1,2,"date" grid_write 1,1,3,"Titre" grid_write 1,1,4,"Auteur" grid_write 1,1,5,"Commentaires"
' initialisation des boutons button 2 : top 2,top(1)+160 : left 2,20 :caption 2,Charger : on_click 2,Charger button 3 : top 3,top(1)+160 : left 3,170 :caption 3,Trier : on_click 3,Trier
' initialisation du dlist dlist 4 dlist 5 end
Charger: inactive 3 file_load 4,"test.txt" for x%=1 to 5 L$=item_read$(4,x%) sep%=instr(L$,"|") grid_write 1,x%+1,2,left$(L$,sep%-1) L$=right$(L$,len(L$)-sep%) sep%=instr(L$,"|") grid_write 1,x%+1,3,left$(L$,sep%-1) L$=right$(L$,len(L$)-sep%) sep%=instr(L$,"|") grid_write 1,x%+1,4,left$(L$,sep%-1) L$=right$(L$,len(L$)-sep%) grid_write 1,x%+1,5,L$ next x% active 3 return
Trier: for x%=1 to count(4) date_sup%=0 for z%=1 to count(4) date_cell%=0 L$=item_read$(4,z%) sep%=instr(L$,"|") Donnee$=left$(L$,sep%-1) dll_on "YGF.dll" jour% = val(left$(donnee$,2)) mois% = val(mid$(donnee$,4,2)) an% = val(right$(donnee$,4)) result% = dll_call3("NbJours", jour%, mois%, an%) Date_Cell%=result% dll_off if Date_cell% > Date_sup% Date_Sup% = Date_Cell% DateSupLign% = z% end_if next z% item_insert 5,1,item_read$(4,DateSupLign%) item_delete 4,DateSupLign% item_insert 4,DateSupLign%,"30/12/1899|" next x% file_save 5,"test.txt" clear 4 gosub Charger return le fichier test.txt : 12/10/2000|Titre 3|Auteur 3|Commentaire 3 11/09/1999|Titre 2|Auteur 2|Commentaire 2 01/01/2014|Titre 5|Auteur 5|Commentaire 5 20/03/1995|Titre 1|Auteur 1|Commentaire 1 12/12/2003|Titre 4|Auteur 4|Commentaire 4 La dll est sur mon webdav.... Ps : A adapter selon vos souhaits et sans oublier de mettre les gardes fous habituels que je n' ai pas mis pour faire plus court... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Objet GRID. Mar 14 Jan 2014 - 2:05 | |
| Voici un exemple comment trier un GRID selon n'importe quelle colonne, et avec le choix de faire un tri numérique un alpha. D'autres types de tri peuvent être ajoutés aisément (sur la date, par exemple). Le programme est 100 % Panoramic, sans DLL. Il faut y ajouter le chargement des données à l'endroit indiqué - je vous laisse imaginer vos données. - Code:
-
label trier
dim n_lig% : n_lig% = 31 dim n_col% : n_col% = 5 dim typ$ : typ$ = "tri numérique" dim typ$ : typ$ = "tri alpha"
dim i%, j%, k%, nc%, s$
grid 1 : grid_row 1,n_lig% : grid_column 1,n_col% width 1,345 : height 1,405 for i%=2 to n_lig% grid_write 1,i%,1,str$(i%-1) next i% for i%=2 to n_col% grid_write 1,1,i%,str$(i%-1) next i%
button 12 : top 12,410 : left 12,70 : width 12,60 : caption 12,"Trier" on_click 12,trier button 13 : top 13,410 : left 13,135 : width 13,60 : caption 13,"Trier" on_click 13,trier button 14 : top 14,410 : left 14,200 : width 14,60 : caption 14,"Trier" on_click 14,trier button 15 : top 15,410 : left 15,265 : width 15,60 : caption 15,"Trier" on_click 15,trier
' ici, charger les lignes du GRID... ' ... end
trier: dlist 2 : sort_on 2 nc% = number_click - 10 ' phase 1 : création de la liste triée for i%=2 to n_lig% if typ$="tri numérique" s$ = right$(string$(30,"0")+grid_read$(i%,nc%),30) end_if if typ$="tri alpha" s$ = left$(grid_read$(i%,nc%)+string$(30," "),30) end_if for j%=2 to n_col% s$ = s$ + "²" + grid_read$(1,i%,j%) next j% item_add 2,s$+"²" next i% ' phase 2 - effacement du GRID grid_clear 1,n_row%,n_col% ' pase 3 - chargement du GRID à partir de la liste triée for i%=2 to n_lig% : ' ou count(2) s$ = item_read$(2,i%-1) ' éliminer le critère de tri s$ = mid$(s$,instr(s$,"²")+1,len(s$)) ' charger chaque colonne de la ligne i% for j%=2 to n_col% k% = instr(s$,"²") grid_write 1,i%,j%,left$(s$,k%-1) if k%<len(s$) then s$ = mid$(s$,k%+1,len(s$) end_if next i% delete 2 return
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Objet GRID. Mar 14 Jan 2014 - 12:06 | |
| Bonjour Klaus. Revoir les lignes 5 et 6 - Code:
-
dim typ$ : typ$ = "tri numérique" dim typ$ : typ$ = "tri alpha" Ligne 64 la remplacer par next j% au lieu de end_if | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Objet GRID. Mer 15 Jan 2014 - 0:18 | |
| Merci, Papydall. Tu as raison, et j'ai corrigé. J'ai également corrigé certaines autres petites anomalies, et j'ai mis le choix du type de tri (numérique ou alpha) dans une combo. C'est plus intuitif ainsi. Voici ce que ça donne: - Code:
-
label trier
dim n_lig% : n_lig% = 31 dim n_col% : n_col% = 5
dim i%, j%, k%, nc%, s$, typ$, tot%
grid 1 : grid_row 1,n_lig% : grid_column 1,n_col% width 1,345 : height 1,405 for i%=2 to n_lig% grid_write 1,i%,1,str$(i%-1) next i% for i%=2 to n_col% grid_write 1,1,i%,str$(i%-1) next i%
combo 3 : top 3,20 : left 3,360 : width 3,200 item_add 3,"tri numérique" item_add 3,"tri alpha" text 3,item_read$(3,1)
button 12 : top 12,410 : left 12,70 : width 12,60 : caption 12,"Trier" on_click 12,trier button 13 : top 13,410 : left 13,135 : width 13,60 : caption 13,"Trier" on_click 13,trier button 14 : top 14,410 : left 14,200 : width 14,60 : caption 14,"Trier" on_click 14,trier button 15 : top 15,410 : left 15,265 : width 15,60 : caption 15,"Trier" on_click 15,trier
' ici, charger les lignes du GRID... ' ... end
trier: dlist 2 : sort_on 2 nc% = number_click - 10 typ$ = text$(3) : ' récupérer le type de tri souhaité ' phase 1 : création de la liste triée for i%=2 to n_lig% if typ$="tri numérique" s$ = right$(string$(30,"0")+grid_read$(1,i%,nc%),30)+right$(string$(6,"0")+str$(i%),6) end_if if typ$="tri alpha" s$ = left$(grid_read$(1,i%,nc%)+string$(30," "),30)+right$(string$(6,"0")+str$(i%),6) end_if for j%=2 to n_col% s$ = s$ + "²" + grid_read$(1,i%,j%) next j% item_add 2,s$+"²" next i%
' phase 2 - effacement du GRID grid_clear 1,n_lig%,n_col%
' pase 3 - chargement du GRID à partir de la liste triée for i%=2 to n_lig% : ' ou count(2) grid_write 1,i%,1,str$(i%) s$ = item_read$(2,i%-1) ' éliminer le critère de tri s$ = mid$(s$,instr(s$,"²")+1,len(s$)) ' charger chaque colonne de la ligne i% for j%=2 to n_col% k% = instr(s$,"²") grid_write 1,i%,j%,left$(s$,k%-1) if k%<len(s$) then s$ = mid$(s$,k%+1,len(s$)) next j% next i% for i%=2 to n_col% grid_write 1,1,i%,str$(i%) next i% delete 2 return En fait, pour la première version, je n'étais pas chez moi et ne disposais pas de Panoramic. C'étaut un code que j'avais saisi directement dans le post, sans pouvoir le tester. C'est fait maintenant. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Objet GRID. Mer 15 Jan 2014 - 12:19 | |
| J'ai transformé mon code pour faire une SUB qui permet de trier n'importe quelle colonne dun GRID. Ainsi, le code est facilement utilisable dans n'importe quel programme. La procédure utilise un DLIST de façon interne, mais elle le créer au début et le supprime à la fin, sans interférer avec les numéros d'objets existants. J'ai ajouté 5 lignes de données pour montrer l'effet des tris pour chaque colonne. - Code:
-
label trier
dim n_lig% : n_lig% = 31 dim n_col% : n_col% = 5
dim i%, nc%, typ$
grid 1 : grid_row 1,n_lig% : grid_column 1,n_col% width 1,345 : height 1,405 for i%=2 to n_lig% grid_write 1,i%,1,str$(i%-1) next i% for i%=2 to n_col% grid_write 1,1,i%,str$(i%-1) next i%
combo 3 : top 3,20 : left 3,360 : width 3,200 item_add 3,"tri numérique" item_add 3,"tri monétaire" item_add 3,"tri alpha" text 3,item_read$(3,1)
button 12 : top 12,410 : left 12,70 : width 12,60 : caption 12,"Trier" on_click 12,trier button 13 : top 13,410 : left 13,135 : width 13,60 : caption 13,"Trier" on_click 13,trier button 14 : top 14,410 : left 14,200 : width 14,60 : caption 14,"Trier" on_click 14,trier button 15 : top 15,410 : left 15,265 : width 15,60 : caption 15,"Trier" on_click 15,trier
' ici, charger les lignes du GRID... grid_write 1,2,2,"Jaques" grid_write 1,2,3,"12,8" grid_write 1,2,4,"Paris" grid_write 1,2,5,"Plombier"
grid_write 1,3,2,"Anaïs" grid_write 1,3,3,"23" grid_write 1,3,4,"Boulogne" grid_write 1,3,5,"Maçon"
grid_write 1,4,2,"Gertrude" grid_write 1,4,3,"30" grid_write 1,4,4,"Versailles" grid_write 1,4,5,"Artiste" ' ... grid_write 1,5,2,"Xavier" grid_write 1,5,3,"13,41" grid_write 1,5,4,"Versailles" grid_write 1,5,5,"MACON"
grid_write 1,6,2,"Pierre" grid_write 1,6,3,"19" grid_write 1,6,4,"Brest" grid_write 1,6,5,"PLOMBIER"
end
trier: nc% = number_click - 10 typ$ = text$(3) : ' récupérer le type de tri souhaité trier_grid(1,n_lig%,n_col%,nc%,typ$) return
' Cette procédure trie un GRID selon une de ses colonnes. ' Paramètres: ' n_grid% numéro d'objet du GRID ' n_lig% nombre total de lignes ' n_col% nombre total de colonnes ' nc% numéro de colonnes selon laquelle il faut trier ' typ$ type de tri: ' "tri numérique" ' "tri alpha"
sub trier_grid(n_grid%,n_lig%,n_col%,nc%,typ$) dim_local no%, i%, j%, s$, k% for no%=1 to 10000 if object_exists(no%)=0 then exit_for next no% dlist no% : sort_on no% ' phase 1 : création de la liste triée for i%=2 to n_lig% s$ = "" for j%=2 to n_col% s$ = s$ + grid_read$(n_grid%,i%,j%) next j% if trim$(s$)<>"" if typ$="tri numérique" s$ = right$(string$(30,"0")+grid_read$(n_grid%,i%,nc%),30)+right$(string$(6,"0")+str$(i%),6) end_if if typ$="tri monétaire" s$ = trim$(grid_read$(n_grid%,i%,nc%)) if s$="" then s$ = 0 k% = instr(s$,",") if k%>0 then s$ = left$(s$,k%-1) + "." + mid$(s$,k%+1,len(s$)) if numeric(s$)=0 message "Ligne "+str$(i%)+": valeur non numérique" delete no% exit_sub end_if k% = instr(s$,".") if k%>0 s$ = s$ + string$(len(s$)-k%,"0") else s$ = s$ + ".00000" end_if s$ = right$(string$(30,"0")+s$,30)+right$(string$(6,"0")+str$(i%),6) end_if if typ$="tri alpha" s$ = left$(grid_read$(n_grid%,i%,nc%)+string$(30," "),30)+right$(string$(6,"0")+str$(i%),6) end_if ' *** ajouter ici d'éventuels autres types de tri... for j%=2 to n_col% s$ = s$ + "²" + grid_read$(n_grid%,i%,j%) next j% item_add no%,s$+"²" end_if next i%
' phase 2 - effacement du GRID grid_clear n_grid%,n_lig%,n_col%
' pase 3 - chargement du GRID à partir de la liste triée for i%=2 to count(2)+1 grid_write n_grid%,i%,1,str$(i%) s$ = item_read$(no%,i%-1) ' éliminer le critère de tri s$ = mid$(s$,instr(s$,"²")+1,len(s$)) ' charger chaque colonne de la ligne i% for j%=2 to n_col% k% = instr(s$,"²") grid_write n_grid%,i%,j%,left$(s$,k%-1) if k%<len(s$) then s$ = mid$(s$,k%+1,len(s$)) next j% next i% for i%=2 to n_col% grid_write n_grid%,1,i%,str$(i%) next i% delete no% end_sub
Il est facile d'ajouter d'autres types de tri à cette procédure. Il suffit d'ajouter le code nécessaire à la construction du critère de tri, à l'endroit indiqué dans le source. @Ygeronimi: Cette SUB pourrait peut-être figurer dans la liste des SUB du MAG ?
Dernière édition par Klaus le Mer 15 Jan 2014 - 12:44, édité 1 fois | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 15 Jan 2014 - 12:26 | |
| Elle le peut. Cela va me changer des messages contrariant du compilateur... Edit : C' est en ligne !
Dernière édition par ygeronimi le Mer 15 Jan 2014 - 12:57, édité 1 fois | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Objet GRID. Mer 15 Jan 2014 - 12:46 | |
| Reprends alors le code posté ci-dessus - je viens de rajouter un mode de tri "monétaire" qui permet de trier des valeurs décimales (jusqu'à 5 chiffres après la virgule) dans leur ordre numérique réel, au lieu d'un ordre numérique basé sur de l'alpha. Là, ça correspond vraiment à l'ordre auquyel on s'attend. Les données de la démo ont été adaptées pour montrer cela. | |
| | | Contenu sponsorisé
| Sujet: Re: Objet GRID. | |
| |
| | | | Objet GRID. | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |