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

Forum AtoutFox : This.parent dans une classe fille dont le pointeur est dans une collection   

Sujet

rss Flux RSS des derniers messages

Vous devez vous identifier pour pouvoir poser une question ou répondre.

dim. 18 janvier 2015, 10h49
Jean à Grenoble
atoutfox.public.association

This.parent dans une classe fille dont le pointeur est dans une collection

Bonjour à tous,

dans une classe, je voudrais un pointeur sur une classe_fille (les parents) et
une collection de pointeurs sur une autre classe fille (leurs enfants). Dans les
classes filles, je voudrais pouvoir accéder aux propriétés et méthodes de la
classe supérieure avec this.parent (ou This.parent.parent dans le cas de la
collection).

On a 2 moyens pour définir un pointeur sur une classe fille :
- créer une propriété 'ptr' et écrire This.ptr = AddObject() mais dans ce cas,
this.parent est inconnu dans la classe fille
- écrire This.addobject("ptr", "maclassefille", ...) et dans ce cas
This.parent est bien connu dans la classe fille.

Ce que je n'arrive pas à faire, c'est créer les classes filles à l'intérieur de
la collection. J'étai parti sur :

FOR lnindice = 1 TO 5
   This.newobject("ptr""classe_fille""test_newobject.prg""", m.lnindice)
   This.colldyn_fille.add(This.ptr)
   This.RemoveObject("ptr")
NEXT


mais lors du removeobject, l'élément de la collection est supprimé (à la fin de
la boucle This.colldyn_fille.count = 0)

J'ai essayé sans succès :
FOR lnindice = 1 TO 5
   This.newobject("ptr""classe_fille""test_newobject.prg""", m.lnindice)
   lnptr = This.ptr
   This.colldyn_fille.add(m.lnptr)
   This.RemoveObject("ptr")
NEXT


J'ai aussi essayé :
FOR lnindice = 1 TO 5
   This.colldyn_fille.add(This.newobject("ptr""classe_fille", ;
    "test_newobject.prg""", m.lnindice))
NEXT

mais à la deuxième boucle, il me dit que ptr existe déjà.

Le contournement du problème est de passer 'this' en paramètre lors de la
création de la classe fille. Mais si on pouvait faire cela plus OOP ....

Bonne journée à tous

Jean à Grenoble


Ci dessous, l'ensemble du programme qui me sert pour tester cela :

loobj = CREATEOBJECT("classe_parent")
loobj.test()
loobj = NULL

DEFINE CLASS classe_fille AS custom && jme 18/01/2015
  nom = "classe_fille"
  indice = 0

  PROCEDURE Init(pnindice AS Number)
    IF PCOUNT()>0
      This.indice = m.pnindice
    ELSE && PCOUNT()>0
      This.indice = -1
    ENDIF && PCOUNT()>0
  ENDPROC && Init

  PROCEDURE Destroy
  ENDPROC && Destroy

  PROCEDURE test_parent(pnindice AS Number)
    IF m.pnindice = 0
      ? STR(This.indice,4)+ " "This.parent.nom
    ELSE && m.pnindice = 0
      ? STR(This.indice,4)+ " "This.parent.parent.nom
    ENDIF && m.pnindice = 0
    RETURN
  ENDPROC && test_parent

ENDDEFINE && classe_fille


DEFINE CLASS classe_parent AS custom && jme 18/01/2015
  nom = "classe_parent"
*!*    ptr_fille = NULL
*!*    coll_fille = NULL

  PROCEDURE Init
*!*    This.ptr_fille = NEWOBJECT("classe_fille", "test_newobject.prg")
*!*    This.coll_fille = CREATEOBJECT("collection")
*!*    FOR lnindice = 1 TO 5
*!*      This.coll_fille.add(NEWOBJECT("classe_fille", "test_newobject.prg", "",
m.lnindice))
*!*    NEXT && lnindice = 1 TO 5
  ENDPROC && Init

  PROCEDURE Destroy
  ENDPROC && Destroy

  PROCEDURE test
    CLEAR
*!*    ? "test 1 "
*!*    This.ptr_fille.test_parent(0) && erreur .parent n'existe pas
*!*    FOR lnindice = 1 TO 5
*!*      This.coll_fille.item(m.lnindice).test_parent(m.lnindice)  && erreur
*!*    NEXT && lnindice = 1 TO 5
    This.newobject("ptrdyn_fille""classe_fille""test_newobject.prg")
    This.ptrdyn_fille.test_parent(0)
    This.addobject("colldyn_fille""collection")
*SET STEP ON
    FOR lnindice = 1 TO 5
*!*      This.newobject("ptr", "classe_fille", "test_newobject.prg", "", m.lnindice)
*!*      This.colldyn_fille.add(This.ptr)
*!*      This.RemoveObject("ptr")


*!*      This.newobject("ptr", "classe_fille", "test_newobject.prg", "", m.lnindice)
*!*      lnptr = This.ptr
*!*      This.colldyn_fille.add(m.lnptr)
*!*      This.RemoveObject("ptr")

      This.colldyn_fille.add(This.newobject("ptr""classe_fille",
"test_newobject.prg""", m.lnindice))
    NEXT && lnindice = 1 TO 5
    ? "test 2 "
    This.ptrdyn_fille.test_parent(0)
    FOR lnindice = 1 TO 5
      This.colldyn_fille.item(m.lnindice).test_parent(m.lnindice)
    NEXT && lnindice = 1 TO 5
    RETURN
  ENDPROC && test

ENDDEFINE && classe_parent

Permalink : http://www.atoutfox.org/nntp.asp?ID=0000015765
20 087 messages dans le forum • Liste complète des messages

Publicité

Les pubs en cours :


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