FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» KGF.dll - demandes ou suggestions de modifications ou ajouts
par Klaus Aujourd'hui à 19:48

» KGF_dll - nouvelles versions
par pascal10000 Aujourd'hui à 17:27

» Mah-Jong européen new-look
par Minibug Hier à 22:31

» track_bar circulaire
par Klaus Hier à 13:54

» API Windows
par Klaus Hier à 3:21

» Cartes de voeux, menus, etc.
par JL35 Lun 11 Déc 2017 - 17:48

» a l'aide klaus
par Minibug Lun 11 Déc 2017 - 11:42

» bug SYNEDIT_TARGET_IS_OBJECT
par Jack Lun 11 Déc 2017 - 0:16

» Jukebox : Serge Reggiani
par papydall Sam 9 Déc 2017 - 5:58

» Ecouter la radio fm sur votre pc
par pascal10000 Sam 9 Déc 2017 - 3:42

» anomalie
par Klaus Sam 9 Déc 2017 - 3:21

» hommage
par Jicehel Ven 8 Déc 2017 - 11:29

» Logiciel de soutien scolaire en langues.
par Pedro Alvarez Ven 8 Déc 2017 - 10:43

» carte son
par Klaus Ven 8 Déc 2017 - 2:37

» mise a jour calculatrice
par joeeee2017 Mer 6 Déc 2017 - 22:19

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Décembre 2017
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
25262728293031
CalendrierCalendrier

Partagez | 
 

 Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
silverman

avatar

Nombre de messages : 475
Age : 45
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 16:22

Bonjour à tous!

J'ai trouvé le moyen d'obtenir le nb de lignes et de colonnes présentes dans un grid; Astuce 100% panoramic!!!Cool Cool Cool

Code:

' Silverman, septembre 2016
'
' Déterminer le nombre de ligne et de colonne d'un grid
'

dim GRN%,GCN%,lig%,col%
dim result%

' fabrique un grid au dimension aléatoire
grid 1 : width 1,400 : height 1,200 : left 1,180
lig%=rnd(30)+1
col%=rnd(30)+1
grid_row 1,lig%
grid_column 1,col%

' affiche le résultat
print : print "Nb de ligne aléatoire = ",lig%
print : print "Nb de colonne aléatoire = ",col%

' les subs en action
Grid_row_Number(1) : GRN%=result%      :' écrit le nb de ligne dans GRN%

Grid_Column_Number(1) : GCN%=result%  :' écrit le nb de colonne dans GCN%


' affiche le résultat
caption 0,"Grid_row_Number = " + str$(GRN%)+" /  Grid_Column_Number = " + str$(GCN%)



END
' LES SUBS
' Trouve le nb de colonne
sub Grid_Column_Number(my_grid)
 dim_local deb%,mil%,fin%
  '
  ' initialisation
  deb%=0
  fin%=1
  repeat
      fin%=fin%*2
  until grid_x_to_column(my_grid,fin%)=0
 
  ' recherche par dichotomie
  repeat
      mil%=(deb%+fin%)/2
      if grid_x_to_column(my_grid,mil%)<>0
        deb%=mil%
      else
        fin%=mil%
      end_if
  until (fin%-deb%)<2
 
  ' résultat
  result%=grid_x_to_column(my_grid,deb%)

end_sub


' Trouve le nb de ligne
sub Grid_row_Number(my_grid)
 dim_local deb%,mil%,fin%
  '
  ' initialisation
  deb%=0
  fin%=1
  repeat
      fin%=fin%*2
  until grid_y_to_row(my_grid,fin%)=0

  ' recherche par dichotomie
  repeat
      mil%=(deb%+fin%)/2
      if grid_y_to_row(my_grid,mil%)<>0
        deb%=mil%
      else
        fin%=mil%
      end_if
  until (fin%-deb%)<2
  '
  ' résultat
  result%=grid_y_to_row(my_grid,deb%)

end_sub
EDIT : Après plusieurs autres tests, il est préférable d'utiliser la variable "result%" directement, plutot que de passer par des peeks et pokes pour renvoyer un résultat(sinon, ça peut être aléatoire). ---> J'ai supprimé les peeks et pokes


Dernière édition par silverman le Jeu 15 Sep 2016 - 13:34, édité 3 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 19:15

C'est laborieux, mais intéressant, dommage que ça n'existe pas en natif.

En tout cas je note pour regarder de plus près, ça m'intéresse beaucoup.
Merci silverman
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 20:52

J'ai eu une idée géniale: quand on fait un Grid_Save dans un fichier, les deux premières lignes contiennent respectivement en Ascii le nombre de lignes et le nombre de colonnes, alors je me suis dit: faisons une sauvegarde et allons lire ces paramètres.

Manque de chance, pour faire la sauvegarde il faut préciser le nombre de lignes et de colonnes à sauvegarder...
J'ai essayé en mettant dans le Save des valeurs élevées par exemple 100 et 100, mais il sauvegarde imperturbablement 100 lignes de 100 colonnes (vides évidemment), avec en tête de la sauvegarde 100 et 100.

Donc c'est raté, en attendant une autre idée géniale...

Pour le moment j'ai écrit des Subs de gestion des grilles, où je maintiens en permanence à jour le nombre de lignes et de colonnes, et leurs dimensions, mais effectivement c'est intéressant de pouvoir le calculer.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 475
Age : 45
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 21:30

JL35 a écrit:
J'ai eu une idée géniale: quand on fait un Grid_Save dans un fichier, les deux premières lignes contiennent respectivement en Ascii le nombre de lignes et le nombre de colonnes, alors je me suis dit: faisons une sauvegarde et allons lire ces paramètres.

J'avais déjà évoqué cette idée ici, et tu y avais même répondu! Perdrais tu la tête? Laughing

Le nb de lignes/colonnes n'est pas calculé, il est lu. What a Face
L'astuce consiste à rechercher par dichotomie, la coordonnée VALIDE(cad <>0) la plus à droite du grid retourné par GRID_X_TO_COLUMN, ce qui correspond au nombre de colonne. Même principe pour les lignes!
Les peek/pokes renvoient le résultat dans une variable utilisateur transmise par ADR(). Ainsi, ce n'est pas le programmeur qui s'adapte à la sub, mais bien le contraire! Pas besoin de savoir que le résultat final est stocké dans la variable mil% puisqu'il est renvoyé! santa

!!! POUR PEEK ET POKE, VOIR L'EDIT DU PREMIER POST !!!


Dernière édition par silverman le Mar 13 Sep 2016 - 20:51, édité 3 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 21:30

Bon silverman, j'ai repiqué ton idée géniale à toi d'utiliser GRID_X_TO_COLUMN et GRID_Y_TO_ROW, qui renvoient zéro quand X est en dehors du Grid, et ça fait un truc assez simple finalement.
La sub est Grid_Licol() qui renvoie les deux: nombre de lignes et nombre de colonnes.
J'ai aussi repris (avec ta permission Very Happy ) ton programme d'appel de la routine:
Code:
' Silverman, septembre 2016
' Déterminer le nombre de ligne et de colonne d'un grid
'
 dim GRN%,GCN%,lig%,col%
' fabrique un grid au dimension aléatoire
grid 1 : width 1,400 : height 1,200 : left 1,180
lig%=rnd(30)+1
col%=rnd(30)+1
grid_row 1,lig%
grid_column 1,col%
' affiche le résultat, pour contrôle
print : print "Nb de ligne aléatoire = ",lig%
print : print "Nb de colonne aléatoire = ",col%
' les subs en action
Grid_licol(1): ' <<<<<<<<<<<<<<<<<<<<<<<<<<<<
' affiche le résultat
caption 0,"Grid_row_Number = " + str$(GRN%)+" /  Grid_Column_Number = " + str$(GCN%)
END
' ==============================================================================
SUB Grid_Licol(gr%)
  ' Nb de rangées et de colonnes du GRID gr% -> GRN% et GCN%
  DIM_LOCAL v%,i%
  v% = 0: i% = GRID_X_TO_COLUMN(gr%,v%)
  WHILE i% > 0: GCN% = i%: v% = v%+1: i% = GRID_X_TO_COLUMN(gr%,v%): END_WHILE
  v% = 0: i% = GRID_Y_TO_ROW(gr%,v%)
  WHILE i% > 0: GRN% = i%: v% = v%+1: i% = GRID_Y_TO_ROW(gr%,v%): END_WHILE
END_SUB
' ==============================================================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 21:33

On s'est croisés silverman, effectivement je ne me rappelais même plus que le problème avait déjà été évoqué... que veux-tu, je vieillis...
En tout cas la sub telle que ci-dessus me convient parfaitement et je l'adopte à l'unanimité.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 475
Age : 45
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 21:43

On s'est croisé Very Happy 

Ta méthode fonctionne parfaitement, mais il y a un souci de performance.
Par exemple pour la recherche du nb de colonne, tu boucles autant de fois que la largeur du grid, cad que pour pour une largeur de 300 pixels, tu boucles 300 fois!
L'intérêt de la dichotomie, c'est de diminuer cela. Dans mon code, pour la même largeur, je boucle une vingtaine de fois tout au plus, ce qui est plus rapide!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 22:03

Je suis bien conscient et d'accord que c'est un peu bestial comme méthode, mais c'est une opération qu'on ne fait qu'une seule fois, j'ai commencé par faire un essai sur 1000 pixels et je n'ai constaté aucun délai, alors à mon avis ce n'est pas du tout gênant, même si ta méthode est plus élégante, certes.

PS je viens de mesurer, sur un tableau de 100 lignes et de 50 colonnes (de 100 pixels chacune), ce qui est déjà un gros tableau, je trouve 889 ms de temps d'exécution, donc moins d'une seconde. Et je suis loin d'avoir un pc de course.
Ça fait 5000 pixels en largeur et 2200 pixels en hauteur.

En ce qui concerne le temps d'exécution, dans la sub, au lieu de progresser pixel par pixel (v% = v%+1) on peut sans problème le faire de 5 en 5, ou de 10 en 10, ce qui divise le temps par 10 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6018
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Ven 9 Sep 2016 - 15:37

Sur le même principe breveté silverman, deux petites subs pour récupérer la largeur d'une colonne donnée ou la hauteur d'une ligne donnée.
Le résultat est rendu respectivement dans wc% et hr% déclarés dans le programme appelant ( = -1 si colonne ou ligne incorrects).
Code:
' ------------------------------------------------------------------------------
SUB Grille_Getwc(gr%,col%)
  ' Récupérer la largeur de la colonne col% du grid gr% -> wc% (-1 si col% incorrecte)
  DIM_LOCAL v1%,v2%,i%
  v1% = 0: i% = GRID_X_TO_COLUMN(gr%,v1%)
  WHILE i% < col%
      v1% = v1%+1: i% = GRID_X_TO_COLUMN(gr%,v1%): IF i% = 0 THEN wc% = -1: EXIT_SUB
  END_WHILE
  v2% = v1%: i% = GRID_X_TO_COLUMN(gr%,v2%)
  WHILE i% = col%: v2% = v2%+1: i% = GRID_X_TO_COLUMN(gr%,v2%): END_WHILE
  wc% = v2%-v1%-1
END_SUB
' ------------------------------------------------------------------------------
SUB Grille_Gethr(gr%,rng%)
  ' Récupérer la hauteur de la ligne rng% du grid gr% -> hr% (=-1 si rng% incorrecte)
  DIM_LOCAL v1%,v2%,i%
  v1% = 0: i% = GRID_Y_TO_ROW(gr%,v1%)
  WHILE i% < rng%
      v1% = v1%+1: i% = GRID_Y_TO_ROW(gr%,v1%): IF i% = 0 THEN hr% = -1: EXIT_SUB
  END_WHILE
  v2% = v1%: i% = GRID_Y_TO_ROW(gr%,v2%)
  WHILE i% = rng%: v2% = v2%+1: i% = GRID_Y_TO_ROW(gr%,v2%): END_WHILE
  hr% = v2%-v1%-1
END_SUB
' ------------------------------------------------------------------------------
D'accord silverman, c'est du pixel par pixel, mais ça va très vite quand même.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   

Revenir en haut Aller en bas
 
Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Suggestions de sujets d'astuce
» Petite astuce informatique
» Boucle de retournement
» Un autre mystère
» Klaxon Au croisements des trains

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: