Je mets ça ici car j'ai passé une semaine à me faire c.... pour arriver à ce que je voulais donc si cela peut en aider pourquoi pas.
Je dois déclarer les procedure associé pour chaque objet (add_methode) si quelqu'un à une idée pour ne déclarer les procedures qu'une fois et que cela s'applique directement au nouveau objet je suis preneur.
Code : Tout sélectionner
;{
Macro class(classname)
Interface classname#_IN
EndMacro
Macro methode(classname)
EndInterface
Structure classname#_MT
EndMacro
Macro membre(classname)
EndStructure
Structure classname#_MB
*MT.classname#_MT
EndMacro
Macro endclass(classname)
EndStructure
Structure classname
MT.classname#_MT
mb.classname#_MB
action.classname#_IN
EndStructure
EndMacro
;----- CLASS HERITAGE
Macro class_h(classname,classmere)
Interface classname#_IN Extends classmere#_IN
EndMacro
Macro methode_h(classname,classmere)
EndInterface
Structure classname#_MT Extends classmere#_MT
EndMacro
Macro membre_h(classname,classmere)
EndStructure
Structure classname#_MB Extends classmere#_MB
EndMacro
;----- CREATION D'UN OBJET OU LISTE
Macro new_listclass(classname,liste)
Global NewList liste.classname#()
EndMacro
Macro new_objetclass(classname,objet)
*objet.classname = AllocateMemory(SizeOf(classname))
EndMacro
;----- AJOUT ITEM A UNE LISTE
Macro add_item_listclass(liste)
AddElement(liste#())
liste#()\mb\MT = liste#()\MT
liste#()\action = @liste()\mb
EndMacro
;----- AJOUT UNE METHODE A UNE LISTE
Macro add_methode_listclass(liste,methode,proc)
liste#()\MT\methode = @proc#()
EndMacro
;----- AJOUTE UN OBJET
Macro add_item_objetclass(variable)
*variable\mb\MT = *variable\MT
*variable\action = @*variable\mb
EndMacro
;----- AJOUTE UNE METHODE A UN OBJET
Macro add_methode_objetclass(variable,methode,proc)
*variable\MT\methode = @proc()
EndMacro
;----- FONCTION POUR LA CREATION DE PROCEDURE
Macro mb(membre)
*this\membre
EndMacro
Macro Pointerclass(classname)
*this.classname#_MB
EndMacro
;----- FIN MACRO
;}
;exemple d'utilisation
;DEFINITION DES CLASSES
class(inventaire)
slot(slot.b,nomobjet.s)
methode(inventaire)
*slot
membre(inventaire)
sac.s[16]
endclass(inventaire)
class_h(perso,inventaire)
position(x,y)
methode_h(perso,inventaire)
*position
membre_h(perso,inventaire)
x.l
y.l
vie.l
endclass(perso)
;DEFINITION DES PROCEDURES DE CLASSES
Procedure.s slot(Pointerclass(inventaire),slot,nomobjet.s)
;*this\sac[slot] = nomobjet
mb(sac[slot]) = nomobjet
ProcedureReturn nomobjet
EndProcedure
Procedure position(Pointerclass(perso),x.l,y.l)
mb(x) = x ;UTILISATION AVEC LA MACRO
*this\y = y ;== mb(y) = y UTILISATION DIRECTE SANS LA MACRO
EndProcedure
new_listclass(perso,perso) ;ON CREER UNE LISTE CONTENANT NOS PERSONNAGES
;ON AJOUTE UN PERSONNAGE ET LES METHODES ASSOCIEES
add_item_listclass(perso)
add_methode_listclass(perso,slot,slot)
add_methode_listclass(perso,position,position)
;JUSTE POUR EXEMPLE UNE PROCEDURE STANDARD
Procedure position_(x,y) ;une strucutre standard identique à celle de dessus
perso()\mb\x = x
perso()\mb\y = y
EndProcedure
;maintenant on peut appeler les procedures directement ainsi que les champs(membre)
perso()\action\position(50,12) ;on utilise la structure classe
Debug Str(perso()\mb\x)+" : "+Str(perso()\mb\y)
position_(78,98) ; on utilise la structure standard
Debug Str(perso()\mb\x)+" : "+Str(perso()\mb\y)
perso()\action\slot(1,"plume")
retour = perso()\action\slot(2,"encre")
;retour$ = PeekS(perso()\action\slot(2,"encre")) ; les retour de string sont des adresses
Debug PeekS(retour)
;CREATION D'UN DEUXIEME PERSONNAGE
add_item_listclass(perso)
add_methode_listclass(perso,slot,slot)
add_methode_listclass(perso,position,position)
perso()\action\position(23,45) ;ON DEFINI SA POSITION
perso()\action\slot(1,"parchemin") ;ON RENTRE UN OBJET DANS LE SLOT 1
;on récapitule
Debug "RECAPITULATIF DES PERSOS"
num = 1
ForEach perso()
Debug "perso "+Str(num)+" en position X "+ Str(perso()\mb\x) + " Y "+Str(perso()\mb\y)
Debug "inventaire :"
For i=1 To 2
If perso()\mb\sac[i]<>""
Debug " - "+perso()\mb\sac[i]
EndIf
Next i
num+1
Next