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

initiation à this_access   



L'auteur

Jean à Grenoble
France France
Membre Actif (personne physique)
# 0000000032
enregistré le 16/10/2004

http://www.j-maurice.fr
64 ans
MAURICE JEAN
38000 GRENOBLE
Fiche personnelle


Note des membres
pas de note

Contributions > 01 - PRG : Programmation

initiation à this_access
# 0000000850
ajouté le 22/04/2013 09:31:47 et modifié le 22/04/2013
consulté 3282 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0

Description
Un détail dans la présentation de Cesar CHALOM aux rencontres de ROISSY2013 m'a beaucoup interessé : les propriétés et les méthodes de _screen sont 'structurées hirarchiquement', par exemple _Screen.oFoxyPreviewer. Dans nos applications, nous trainons un grand nombre de paramètres et de données qu'il est facile et interessant, du moins pour la relecture, de structurer. Il suffit de créer une classe mère et une classe pour chaque categorie :

[vfp]
DEFINE CLASS donnees AS custom && jme 22/04/2013

* classe dont l'instance va contenir 'toutes' les données de

* l'application d'une manière hierarchique


PROCEDURE Init

This.newobject("impression", "parametres_impression")

This.newobject("dates", "dates")

* etc ...

ENDPROC && Init

ENDDEFINE && donnees



DEFINE CLASS parametres_impression AS custom && jme 22/04/2013
imprimante = ""
etat = ""
nombre_copie = 1
ENDDEFINE && parametres_impression

DEFINE CLASS dates AS custom && jme 22/04/2013
date_du_jour = {}
jour_julien = 0

PROCEDURE Init
This.newobject("dates_factures", "factures")
ENDPROC && Init

ENDDEFINE && dates

DEFINE CLASS factures AS custom && jme 22/04/2013
debut_periode = {}
fin_periode = {}
nbre_mois = 0
ENDDEFINE && factures
[\vfp]

Mais, j'ai voulu aller un peu plus loin ! en effet, dans l'exemple ci-dessus, on a besoin des dates de facturation que lorsqu'on fait des factures. Faut-il alors aller chercher systématiquement des valeurs dont on pourra n'avoir pas besoin dans l'application ce jour ? Ce serait bien si on ne pouvait aller les chercher qu'en cas de besoin.

Celà nous fait penser à une méthode _ACCESS mais _access sur quoi ? eh bien sur la classe complète ! en utilisant la méthode THIS_ACCESS. Cette méthode sera lancée chaque fois qu'on accédera à la classe (en fait à l'instance de la classe) et elle aura comme paramètre le nom de la propriété que l'on veut. Il suffit alors de vérifier si la propriété existe; si oui, on n'a rien à faire; si non on la crée. Le plus simple pour comprendre est d'executer le programme pas à pas ci-dessous et de voir ce qu'il se passe.

Cette méthode a un inconvénient (assez important) : on déroule du code chaque fois que l'on veut accéder à une propriété. Ce n'est pas très efficace mais il y a un moyen de minimiser ce problème en créant une variable (locale ou privée) sur la propriété 'cheffe de rubrique' comme je l'ai fait avec l'instruction
lofils = m.loobject.classefils
A l'execution de cette instruction, on va lancer this_access et donc créer la propriété si elle n'existe pas déjà; mais pas après en utilisant m.lofils.


Code source :
set step on
loobject = CREATEOBJECT("classe1")
lnaccu = m.loobject.classefils.toto     && on execute this_access
? m.lnaccu
lofils = m.loobject.classefils          && on execute this_access
lnaccu = m.lofils.toto                  && on n'execute pas this_access
lnaccu = m.lofils.toto + 1              && on n'execute pas this_access
*loobject.removeobject("classefils")    && on execute this_access
lopapa = m.loobject                     && on n'execute pas this_access
lnaccu = m.lopapa.classefils.toto       && on execute this_access
RELEASE lofils, lopapa
loobject = NULL                         && on détruit classe1. On passe
*                                          dans le destroy et dans this_access
RELEASE loobject
SET STEP OFF

DEFINE CLASS classe1 AS custom && jme 20/04/2013

  PROCEDURE Init
    WAIT WINDOW "classe1.init" NOWAIT NOCLEAR
  ENDPROC && Init

  PROCEDURE Destroy
    This.removeobject("classefils")
  ENDPROC && Destroy

  PROCEDURE this_access
    LPARAMETERS pcmembre

    IF m.pcmembre == "classefils"
      IF PEMSTATUS(This"classefils",5) = .F.
        This.newobject("classefils""classefille1")
      ENDIF && PEMSTATUS("classefils",5) = .F.
    ENDIF && m.pcmembre == "classefils"
    RETURN This
  ENDPROC && this_access

ENDDEFINE && classe1

DEFINE CLASS classefille1 AS custom && jme 20/04/2013
  toto = 123

  PROCEDURE Init
    WAIT WINDOW "classefille1.init" NOWAIT NOCLEAR
    This.toto = This.toto *2
  ENDPROC && Init

  PROCEDURE Destroy

  ENDPROC && Destroy

ENDDEFINE && classefille1

Commentaires
le 22/04/2013, Marc Thivolle a écrit :
Alors là Jean, chapeau ! Je découvre le This_access.
le 22/04/2013, Jean à Grenoble a écrit :
C'est pas mal mais ce qui serait mieux c'est que je puisse indenter mon code dans le premier exemple !
Jean à Grenoble


Publicité

Les pubs en cours :


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