Page 1 sur 1

Problème en POO

Publié : sam. 14/mars/2009 12:32
par Ollivier
Voilà, j'avance tranquillement en POO.

Dans ce code, j'ai deux erreurs lignes 130 et 131 (champ de structure introuvable). Bon, c'est normal puisque je veux appeler des méthodes or *This récupère la structure "gabarit" (template).

2 solutions sont possibles:
1) Globaliser l'objet Prog[]. L'inconvénient c'est que les créations perdent soudain beaucoup de souplesse.
2) Corriger les lignes qui plantent en réécrivant les noms des procédures mais ça me semble faire de la POO un peu tordue.

Est-ce qu'il y a une troisième alternative plus normalisée?

Code : Tout sélectionner

Interface ProcessObject
   SetName.I(Name.S)
   SetParam.I(Param.S)
   SetDir.I(Dir.S)
   SetFlag.I(Flag.I)
   ResetFlag.I()
   Run.I()
   Running.I()
   Close.I()
   ResetText.I()
   ReadText.I()
   GetText.S()
   GetExitCode.I()
   ReadWhileRunning.I()
EndInterface

Structure _ProcessClass
   *vTable
	Hnd.I
	Name.S
	Param.S
   Dir.S
   Flag.I
   Text.S
   ExitCode.I
EndStructure

Procedure.I NewProcessObject()
   Protected *Object._ProcessClass
   *Object = AllocateMemory(SizeOf(_ProcessClass) )
   If *Object
      *Object\vTable = ?VTable_ProcessClass
      *Object\Name = ""
      *Object\Param = ""
      *Object\Dir = ""
   EndIf
   ProcedureReturn *Object
EndProcedure

Procedure.I ProcessClass_SetName(*This._ProcessClass, Name.S)
   Protected Result.I
   *This\Name = Name
   ProcedureReturn Result
EndProcedure

Procedure.I ProcessClass_SetParam(*This._ProcessClass, Param.S)
   Protected Result.I
   *This\Param = Param
   ProcedureReturn Result
EndProcedure

Procedure.I ProcessClass_SetDir(*This._ProcessClass, Dir.S)
   Protected Result.I
   *This\Dir = Dir
   ProcedureReturn Result
EndProcedure

Procedure.I ProcessClass_SetFlag(*This._ProcessClass, Flag.I)
   Protected Result.I
   *This\Flag | Flag
   ProcedureReturn Result
EndProcedure

Procedure.I ProcessClass_ResetFlag(*This._ProcessClass)
   Protected Result.I
   *This\Flag = 0
   ProcedureReturn Result
EndProcedure

Procedure.I ProcessClass_Run(*This._ProcessClass)
   Protected Result.I
   With *This
      \Hnd = RunProgram(\Name, \Param, \Dir, \Flag)
   EndWith
   ProcedureReturn Result
EndProcedure

Procedure.I ProcessClass_Running(*This._ProcessClass)
   Protected Result.I
   With *This
      Result = ProgramRunning(\Hnd)
   EndWith
   ProcedureReturn Result
EndProcedure

Procedure.I ProcessClass_Close(*This._ProcessClass)
   Protected Result.I
   With *This
      \ExitCode = ProgramExitCode(\Hnd)
      CloseProgram(\Hnd)
   EndWith
   ProcedureReturn Result
EndProcedure

Procedure.I ProcessClass_ResetText(*This._ProcessClass)
   Protected Result.I
   With *This
      \Text = ""
   EndWith
   ProcedureReturn Result
EndProcedure

Procedure.I ProcessClass_ReadText(*This._ProcessClass)
   Protected Result.I
   With *This
      \Text + ReadProgramString(\Hnd) + Chr(13)
   EndWith
   ProcedureReturn Result
EndProcedure

Procedure.S ProcessClass_GetText(*This._ProcessClass)
   Protected Result.S
   With *This
      Result = \Text
   EndWith
   ProcedureReturn Result
EndProcedure

Procedure.I ProcessClass_GetExitCode(*This._ProcessClass)
   Protected Result.I
   With *This
      Result = \ExitCode
   EndWith
   ProcedureReturn Result
EndProcedure

Procedure.I ProcessClass_ReadWhileRunning(*This._ProcessClass)
   Protected Result.I
   With *This
      While \Running()
         \ReadText()
      Wend
   EndWith
   ProcedureReturn Result
EndProcedure

DataSection 
VTable_ProcessClass: 
   Data.I @ProcessClass_SetName()
   Data.I @ProcessClass_SetParam()
   Data.I @ProcessClass_SetDir()
   Data.I @ProcessClass_SetFlag()
   Data.I @ProcessClass_ResetFlag()
   Data.I @ProcessClass_Run()
   Data.I @ProcessClass_Running()
   Data.I @ProcessClass_Close()
   Data.I @ProcessClass_ResetText()
   Data.I @ProcessClass_ReadText()
   Data.I @ProcessClass_GetText()
   Data.I @ProcessClass_GetExitCode()
   Data.I @ProcessClass_ReadWhileRunning()
EndDataSection 

;-> Main < <

   Prog.ProcessObject = NewProcessObject()
   Prog\SetDir(#PB_Compiler_Home + "\Compilers\")
   Prog\SetName("PBCompiler.EXE")
   Prog\SetParam("/?")
   Prog\SetFlag(#PB_Program_Open)
   Prog\SetFlag(#PB_Program_Read)
   Prog\SetFlag(#PB_Program_Hide)
   Prog\Run()
   Prog\ResetText()
   Prog\ReadWhileRunning()
   MessageRequester("", Prog\GetText() )
   Prog\Close()
   
   

Publié : sam. 14/mars/2009 12:43
par Anonyme
je ne vais pas me plonger dans le code , mais as tu lu ceci :

http://drac.site.chez-alice.fr/Tutorial ... urquoi.htm


A priori , le code est d'actualité par rapport à la première mouture il me semble.

Publié : sam. 14/mars/2009 13:10
par Ollivier
Beh oui! J'ai lu!! J'ai même corrigé les fautes d'orthographe de ce site il y a plus d'un an!!!

Seulement, j'avais eu un mal fou à trouver un intérêt pour la POO. Au jour, d'aujourd'hui, le contexte est différent: je traduis le tutoriel de sRod pour qu'il soit lisible pour nous. ça + ton propre attrait pour la POO me motive pour plonger plus en profondeur dans ce concept. Ce serait con de traduire un PDF sans rien y comprendre, ce serait un fiasco total dans ce cas!!!

Donc pépère, avec l'humour de sRod je me lance à tenter de percer ce concept!

Mais dans le cas où les objets sont globaux, on ne peut plus créer une DLL? Il y a un problème d'ordre pour renseigner le compilateur?

Publié : sam. 14/mars/2009 16:28
par cha0s
première solution barbare.

Code : Tout sélectionner

Procedure.I ProcessClass_ReadWhileRunning(*This._ProcessClass)
   Protected Result.I, *This_.ProcessObject = *This
   With *This_
      While \Running()
         \ReadText()
      Wend
   EndWith
   ProcedureReturn Result
EndProcedure
sinon plus viable

Code : Tout sélectionner

Structure _ProcessClass
   *vTable
   *M.ProcessObject
   Hnd.I
   Name.S
   Param.S
   Dir.S
   Flag.I
   Text.S
   ExitCode.I
EndStructure

Procedure.I NewProcessObject()
   Protected *Object._ProcessClass
   *Object = AllocateMemory(SizeOf(_ProcessClass) )
   If *Object
      *Object\vTable = ?VTable_ProcessClass
      *Object\M = *Object
      *Object\Name = ""
      *Object\Param = ""
      *Object\Dir = ""
   EndIf
   ProcedureReturn *Object
EndProcedure
ce qui te permet de faire ceci

Code : Tout sélectionner

Procedure.I ProcessClass_ReadWhileRunning(*This._ProcessClass)
   Protected Result.I
   With *This
      While \M\Running()
         \M\ReadText()
      Wend
   EndWith
   ProcedureReturn Result
EndProcedure
Comme il est dit dans la doc le but des interfaces n'est pas de donner une couche objet a pure mais d'adapter les libs faites en POO or en POO les attributs sont le plus souvent privée (si c'est bien codé) ce qui veut dire que l'on ne peut y accéder que dans les méthodes(procédures si tu préfère) de la classe.

C'est en partie pour sa que j'ai décidé de passer par un précompilateur fait maison.

Publié : dim. 15/mars/2009 14:02
par Ollivier
@ChaOs

J'ai essayé ta deuxième solution. ça marche bien. Merci.

Ollivier