Page 2 sur 3
					
				
				Publié : mar. 27/juin/2006 11:40
				par Flype
				encore mieux ( çà reste toutefois à confirmer/tester ) : 
Code : Tout sélectionner
Import #PB_Compiler_Home + "Compilers/ObjectManager.lib"
  PB_Object_GetOrAllocateID (Objects, Object.l) 
  PB_Object_GetObject       (Objects, Object.l) 
  PB_Object_IsObject        (Objects, Object.l) 
  PB_Object_EnumerateAll    (Objects, ObjectEnumerateAllCallback, *VoidData) 
  PB_Object_EnumerateStart  (Objects) 
  PB_Object_EnumerateNext   (Objects, *object.Long) 
  PB_Object_EnumerateAbort  (Objects) 
  PB_Object_FreeID          (Objects, Object.l) 
  PB_Object_Init            (StructureSize.l, IncrementStep.l, ObjectFreeFunction) 
  PB_Object_GetThreadMemory (MemoryID.l) 
  PB_Object_InitThreadMemory(Size.l, InitFunction, EndFunction) 
EndImport
 
			 
			
					
				
				Publié : mar. 27/juin/2006 11:58
				par Dr. Dri
				Génial! Voila une version qui reprend mon exemple (en virant les "PB_")
Code : Tout sélectionner
Import #PB_Compiler_Home + "Compilers/ObjectManager.lib"
  Object_GetOrAllocateID (Objects, Object.l) As "_PB_Object_GetOrAllocateID@8"
  Object_GetObject       (Objects, Object.l) As "_PB_Object_GetObject@8"
  Object_IsObject        (Objects, Object.l) As "_PB_Object_IsObject@8"
  Object_EnumerateAll    (Objects, ObjectEnumerateAllCallback, *VoidData) As "_PB_Object_EnumerateAll@12"
  Object_EnumerateStart  (Objects) As "_PB_Object_EnumerateStart@4"
  Object_EnumerateNext   (Objects, *object.Long) As "_PB_Object_EnumerateNext@8"
  Object_EnumerateAbort  (Objects) As "_PB_Object_EnumerateAbort@4"
  Object_FreeID          (Objects, Object.l) As "_PB_Object_FreeID@8"
  Object_Init            (StructureSize.l, IncrementStep.l, ObjectFreeFunction) As "_PB_Object_Init@12"
  Object_GetThreadMemory (MemoryID.l) As "_PB_Object_GetThreadMemory@4"
  Object_InitThreadMemory(Size.l, InitFunction, EndFunction) As "_PB_Object_InitThreadMemory@12"
EndImport
Dri 

 
			 
			
					
				
				Publié : mar. 27/juin/2006 12:07
				par Flype
				hehe, je me suis fais la même mais avec 
DATABASE_IsObject(), 
DATABASE_GetObject(), 
DATABASE_GetOrAllocate(), 
...
sinon, est-ce que d'apres toi cet API est chargé deux fois en mémoire (par le compilateur, puis par le Import/EndImport ) ?
			 
			
					
				
				Publié : mar. 27/juin/2006 12:13
				par Dr. Dri
				Je ne pense pas, mais ce serait à confirmer...
Sinon je préfère garder "Object" parce que c'est générique ^^
Dri
			 
			
					
				
				Publié : mar. 27/juin/2006 14:27
				par gnozal
				oui, çà fonctionne bien (même avec jaPBe 

 )
Code : Tout sélectionner
; /////////////////////////////////////////////////////////// 
;                          C O D E 
; /////////////////////////////////////////////////////////// 
; 
CompilerIf #PB_Compiler_Thread ;> 
  #ObjectManager = "Compilers/ObjectManagerThread.lib"
CompilerElse ;=
  #ObjectManager = "Compilers/ObjectManager.lib"
CompilerEndIf;<
Import #PB_Compiler_Home + #ObjectManager
  Object_GetOrAllocate   (Objects, Object.l) As "_PB_Object_GetOrAllocateID@8" 
  Object_GetObject       (Objects, Object.l) As "_PB_Object_GetObject@8" 
  Object_IsObject        (Objects, Object.l) As "_PB_Object_IsObject@8" 
  Object_EnumerateAll    (Objects, ObjectEnumerateAllCallback, *VoidData) As "_PB_Object_EnumerateAll@12" 
  Object_EnumerateStart  (Objects) As "_PB_Object_EnumerateStart@4" 
  Object_EnumerateNext   (Objects, *object.Long) As "_PB_Object_EnumerateNext@8" 
  Object_EnumerateAbort  (Objects) As "_PB_Object_EnumerateAbort@4" 
  Object_Free            (Objects, Object.l) As "_PB_Object_FreeID@8" 
  Object_Init            (StructureSize.l, IncrementStep.l, ObjectFreeFunction) As "_PB_Object_Init@12" 
  Object_GetThreadMemory (MemoryID.l) As "_PB_Object_GetThreadMemory@4" 
  Object_InitThreadMemory(Size.l, InitFunction, EndFunction) As "_PB_Object_InitThreadMemory@12" 
EndImport
Prototype ObjectFreeFunction(Object.l) 
Structure PB_SimpleList 
  *Next    .PB_SimpleList 
  *Previous.PB_SimpleList 
EndStructure 
Structure PB_Object 
  ; 
  StructureSize.l 
  IncrementStep.l 
  ObjectsNumber.l 
  *ListFirstElement.PB_SimpleList 
  ; 
  FreeObject.ObjectFreeFunction 
  ; 
  Current.l 
  *CurrentElement.PB_SimpleList 
  ; 
  CompilerIf #PB_Compiler_Thread ;> 
    IncrementShift.l 
    *FirstObjectsArea.PB_SimpleList 
    *LastObjectsArea .PB_SimpleList 
    ObjectMutex.CRITICAL_SECTION 
  CompilerElse ;= 
    *ObjectsArea 
  CompilerEndIf ;< 
  ; 
EndStructure 
; 
; /////////////////////////////////////////////////////////// 
;                          E X A M P L E 
; /////////////////////////////////////////////////////////// 
; 
;la structure qui contient les 
;informations sur les timers 
Structure Timer 
  Event.l 
  Window.l 
  Elapse.l 
EndStructure 
;il faut que ce soit global ^^ 
;ou alors shared dans chaque fonction 
Global TimerObjects 
;la fonction la plus importante, sans elle 
;pas d'objets statiques/dynamiques 
Procedure.l FreeTimer(Timer.l) 
  Protected Free.l = #False, *Timer.Timer 
  
  If Timer <> #PB_Any And Object_IsObject(TimerObjects, Timer) 
    *Timer = Object_GetObject(TimerObjects, Timer) 
  EndIf 
  
  If *Timer And IsWindow(*Timer\Window) 
    Free = KillTimer_(WindowID(*Timer\Window), *Timer\Event) 
    Object_Free(TimerObjects, Timer) 
  EndIf 
  
  ProcedureReturn Free 
EndProcedure 
;Retourne "non-zero" si le timer a été créé 
;Retourne l'index du timer si Timer = #PB_Any 
Procedure.l CreateTimer(Timer.l, Window.l, Event.l, Elapse.l) 
  Protected Create.l = #Null, *Timer.Timer 
  
  If IsWindow(Window) And Event 
    FreeTimer(Timer) 
    *Timer = Object_GetOrAllocate(TimerObjects, Timer) 
  EndIf 
  
  If *Timer 
    SetTimer_(WindowID(Window), Event, Elapse, #Null) 
    *Timer\Event  = Event 
    *Timer\Window = Window 
    *Timer\Elapse = Elapse 
  EndIf 
  
  If Timer = #PB_Any 
    Create = *Timer 
  ElseIf *Timer 
    Create = *Timer\Event 
  EndIf 
  
  ProcedureReturn Create 
EndProcedure 
;trois fonctions pour meubler 
Procedure.l GetTimerEvent(Timer.l) 
  Protected Event.l = #PB_Any, *Timer.Timer 
  
  *Timer = Object_GetObject(TimerObjects, Timer) 
  
  If *Timer And IsWindow(*Timer\Window) 
    Event = *Timer\Event 
  EndIf 
  
  ProcedureReturn Event 
EndProcedure 
Procedure.l GetTimerWindow(Timer.l) 
  Protected Window.l = #PB_Any, *Timer.Timer 
  
  *Timer = Object_GetObject(TimerObjects, Timer) 
  
  If *Timer And IsWindow(*Timer\Window) 
    Window = *Timer\Window 
  EndIf 
  
  ProcedureReturn Window 
EndProcedure 
Procedure.l GetTimerElapse(Timer.l) 
  Protected Elapse.l = #PB_Any, *Timer.Timer 
  
  *Timer = Object_GetObject(TimerObjects, Timer) 
  
  If *Timer And IsWindow(*Timer\Window) 
    Elapse = *Timer\Elapse 
  EndIf 
  
  ProcedureReturn Elapse 
EndProcedure 
;si on fait une lib autant 
;créer les évennements qui vont avec ^^ 
#PB_Event_Timer = #WM_TIMER 
;retourne le numéro de timer (#PB_Any s'il n'existe pas) 
Procedure.l EventTimer() 
  Protected Window.l, Event.l, Temp.l 
  Protected Timer.l = #PB_Any, *Timer.Timer 
  
  Window = EventWindow() 
  Event  = EventwParam() 
  
  Object_EnumerateStart(TimerObjects) 
  
  While Object_EnumerateNext(TimerObjects, @Temp) 
    *Timer = Object_GetObject(TimerObjects, Temp) 
    
    If *Timer\Window = Window And *Timer\Event = Event 
      Object_EnumerateAbort(TimerObjects) 
      Timer = Temp 
    EndIf 
  Wend 
  
  ProcedureReturn Timer 
EndProcedure 
;crée la liste d'objets des timers, 
;je ne sais pas à quoi correspond le 2e argument 
TimerObjects = Object_Init(SizeOf(Timer), 1, @FreeTimer()) 
;fin de la "lib" 
;------------------------------------------------------------------------------- 
;début du programme 
Enumeration 
  #Timer_A 
  #Timer_C 
EndEnumeration 
If OpenWindow(0, 0, 0, 222, 50, "Timer", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  CreateGadgetList(WindowID(0)) 
  
  ButtonGadget(0, 10, 10, 200, 30, "Timer", #PB_Button_Toggle) 
  
  CreateTimer(#Timer_A, 0, 6, 2000) 
  CreateTimer(#Timer_C, 0, 2, 1500) 
  
  Repeat 
    
    Event = WaitWindowEvent() 
    
    If Event = #PB_Event_Gadget 
      
      If GetGadgetState(0) 
        Timer = CreateTimer(#PB_Any, 0, 1, 1000) 
      Else 
        FreeTimer(Timer) 
      EndIf 
      
    ElseIf Event = #PB_Event_Timer 
      
      Select EventTimer() 
        Case #Timer_A 
          Debug "#Timer_A" 
          
        Case #Timer_C 
          Debug "#Timer_C" 
          
        Case Timer 
          Debug "Timer" 
          
      EndSelect 
      
    EndIf 
    
  Until Event = #PB_Event_CloseWindow 
EndIf
 
			 
			
					
				
				Publié : mar. 27/juin/2006 20:28
				par poshu
				Wunderbach!
Merci
			 
			
					
				
				Publié : mar. 27/juin/2006 22:45
				par Flype
				oui, çà fonctionne bien (même avec jaPBe  )
meme l'autre version a fini par fonctionner avec jaPBe  

 
			 
			
					
				
				Publié : mar. 09/janv./2007 10:04
				par Progi1984
				Pas de pb avec la V4.02 ?
			 
			
					
				
				Publié : lun. 15/janv./2007 12:05
				par Progi1984
				Aprés test, pas de problèmes !!!!
			 
			
					
				
				Publié : jeu. 08/mars/2007 11:40
				par Progi1984
				J'ai besoin de compiler une lib avec Tailbite....
Qui utilise le #PB_Any (merci 

 )
Donc je mets cela au début de mon code
Code : Tout sélectionner
Import #PB_Compiler_Home + "Compilers/ObjectManager.lib"
  PB_Object_GetOrAllocateID (Objects, Object.l)
  PB_Object_GetObject       (Objects, Object.l)
  PB_Object_IsObject        (Objects, Object.l)
  PB_Object_EnumerateAll    (Objects, ObjectEnumerateAllCallback, *VoidData)
  PB_Object_EnumerateStart  (Objects)
  PB_Object_EnumerateNext   (Objects, *object.Long)
  PB_Object_EnumerateAbort  (Objects)
  PB_Object_FreeID          (Objects, Object.l)
  PB_Object_Init            (StructureSize.l, IncrementStep.l, ObjectFreeFunction)
  PB_Object_GetThreadMemory (MemoryID.l)
  PB_Object_InitThreadMemory(Size.l, InitFunction, EndFunction)
EndImport 
et quand je compile avec Tailbite, j'ai ce message d'erreur :
Code : Tout sélectionner
polib:
POLIB: fatal error: File Not Found 'TBTemp\Functions\TB_Imported_Lib_0.lib'
Le canal de communication a été fermé.
 
			 
			
					
				
				Publié : jeu. 08/mars/2007 12:33
				par Progi1984
				J'ai trouvé la solution :
Il faut que je transforme :
en 
sinon j'ai le bug précédent
 
			 
			
					
				
				Publié : jeu. 08/mars/2007 17:07
				par Dr. Dri
				et ca donne quoi si tu fais un debug #PB_Compiler_Home ?
faut peut être juste faire ca :
Dri
 
			 
			
					
				
				Publié : jeu. 08/mars/2007 18:06
				par Progi1984
				Si je fais ca, ca buggue et me redonne l'erreur là haut 
 
			 
			
					
				
				Publié : jeu. 08/mars/2007 19:25
				par Dr. Dri
				et ce code te donne quoi ?
Code : Tout sélectionner
object.s = #PB_Compiler_Home + "Compilers/ObjectManager.lib"
Debug object
Debug FileSize(object)
Dri 

 
			 
			
					
				
				Publié : ven. 09/mars/2007 14:23
				par lionel_om
				Le problème ne vient pas de 
 ?? a transformer en : 
 / => \ ???