ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Incrémenter une variable array (4 façons)   



L'auteur

eddymaue
Canada Canada
Membre Simple
# 0000000075
enregistré le 26/10/2004
Maue Eddy
j8j 8j8 Gatineau
de la société Formatek
Fiche personnelle


Note des membres
pas de note

Contributions > 01 - PRG : Programmation > Tableaux / Array

Incrémenter une variable array (4 façons)
# 0000000093
ajouté le 25/11/2004 03:39:15 et modifié le 30/03/2005
consulté 6931 fois
Niveau débutant

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0
VFP 6.0
VFP 5.0

Description

1- se servire de l'objet ArrayLib de la Classe Utility.vcx et ou vous avez les méthode
   AcolScan
   DelAitem
   InsAitem

Simple d'utilisation mais un p'tit peu lente.

2- Si vous avez Vfp 7 et + et sont intellisense Manager
    Je l'appel "DeclareAlen"

Prendre soin d'initialiser n_column et c_na

#DEFINE N_COLUMN        && N COLUMN
#DEFINE C_NA              && NAME ARRAY  oSource.MyArray ou MyArray
DECLARE C_NA(ALEN(C_NA,1)+IIF(VARTYPE(C_NA(ALEN(C_NA,1),1))="L",0,1),N_COLUMN)
  
C_NA(ALEN(C_NA,1),1)=NSTRCOUNT
C_NA(ALEN(C_NA,1),2)="SET STEP ON"

#UNDEFINE N_COLUMN
#UNDEFINE C_NA

3- IncArray(@MyArray) pour toutes les versions 3 et +

4- oIncArray(oSource,"MyArray" pour toutes les versions 3 et +

Code source :
* La utility.vcx n'étant pas de moi je vous encourage à l'étudier
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fox7help/html/smpsample_class_libraries.asp

#if .f.   && commentaire

Passons à la deuxième méthode
Prenez soin de la mettre dans l'intellisense Manager.
Quand vous en servire ?
Posez-vous les questions suivantes
Ai-je besoin d'
incrémeter un tableau dont
   j'ignore le contenu de la dernière rangée ? Oui

Oui m'
est si son contenu n'est pas encore
initialisé ai-je vraiment besoin de l'
incrémenter ? non

Voilà l'utilité de mes trois prochaines fonctions

La première que j'
ai placé dans l'itellisense Manager
et que j'
appel DeclareAlen est plus simple que n'y parrait

#DEFINE N_COLUMN && N COLUMN
#DEFINE C_NA && NAME ARRAY
DECLARE C_NA(ALEN(C_NA,1)+IIF(VARTYPE(C_NA(ALEN(C_NA,1),1))="L",0,1),N_COLUMN)

C_NA(ALEN(C_NA,1),1)=NSTRCOUNT
C_NA(ALEN(C_NA,1),2)="SET STEP ON"

#UNDEFINE N_COLUMN
#UNDEFINE C_NA

Dans les faits une seule ligne est exécutée
DECLARE C_NA(ALEN(C_NA,1)+IIF(VARTYPE(C_NA(ALEN(C_NA,1),1))="L",0,1),N_COLUMN)

Grace à #Define, c_na peut prendre le nom de n'
importe quel source de tableau
qu'il soit local,private,public ou un tableau attaché un objet, elle est tres efficace
Décomposons là

Declare c_na(5,2) && je sais vous compremez tous

Remplacons 5 par Alen(c_na,1)
Declare c_na(Alen(c_na,1)+1,2) && c'est certain que le tablea va s'incrémenter

Ce qui ne permet pas de répondre à nos deux question sité ci-dessus
C'
est là l'utilité et la subtilité d'un iif(,,)

  iif(VARTYPE(C_NA(ALEN(C_NA,1),1))="L" , 0 , 1)

  si VARTYPE(C_NA(ALEN(C_NA,1),1))="L" c'est que la derniere rangée n'a pas été initialisé
      = 0
  dans un cas contraire commene VARTYPE(C_NA(ALEN(C_NA,1),1)) serait "C" ou "D" ou "N"
     = 1

ce qui fait que si l'on remplace +1 de Declare c_na(Alen(c_na,1)+1,2)
nous allons avoir

DECLARE C_NA(ALEN(C_NA,1) + IIF(VARTYPE(C_NA(ALEN(C_NA,1),1))="L",0,1) ,2)

Et pour finir grace à #DEFINE on obtien une flexibilité du code qui ferait rougir ben des codeurs

#define n_column
et là on remplace ,2 par n_column

#define c_na MyArray
ou
#define c_na oSource.MyArray

va faire que avant de compiler le préprocesseur de fox va remplacer c_na par son défine

Regarder comme se serait long d'
écrire oSource.MyArray
    DECLARE oSource.MyArray(ALEN(oSource.MyArray,1) + IIF(VARTYPE(oSource.MyArray(ALEN(oSource.MyArray,1),1))="L",0,1) ,n_column)

Ben j'ai mieux l'écrire une seule fois et lasser le préprocesseur de fox faire le reste pour moi

#endif && fin des commentaires

* Passons au deux dernières
* IncArray(@MyArray) et oIncArray(oSource,"MyArray")

* IncArray(@MyArray)
PROCEDURE IncArray(paTab,plforce)
  #Define nCol  IIF(ALEN(paTab,2)=0,1,ALEN(paTab,2))
  #Define nRow  ALEN(paTab,1)
  Declare paTab(nRow+IIF(VARTYPE(paTab(nRow,nCol))="L" .AND. !plforce,0,1),nCol)
  RETURN ALEN(paTab,1)
Endproc

*  oIncArray(oSource,"MyArray")
PROCEDURE oIncArray(poTab,pcName,plForce)
   #Define nCol  IIF(ALEN(potab.&pcName,2)=0,1,ALEN(potab.&pcName,2))
   #Define nRow  ALEN(potab.&pcName,1)
   Declare potab.&pcName(nRow+IIF(VARTYPE(potab.&pcName(nRow,1))="L" .AND. !plforce,0,1),nCol)
   RETURN ALEN(poTab.&pcName,1)

endproc

* C'est tout et bonne soirée, bonne nuit. Quoi. Pour les fraicais biensûre et excusé mon français y
* fait pitié je le sais. Mais bon c'est pas de français mais la la programation qu'il est question ici.



Commentaires
Aucun commentaire enregistré ...

Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2018.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0