Alle Gadgets aufzählen
Verfasst: 22.09.2006 19:53
... oder auch jegliche anderen PB-Objekte.
Hab mal im SDK-Ordner von PB gestöbert und ohne Doku (wie immer
)
versucht das PB-Objektmanagement zu verstehen. Ich glaube es ist mir
gelungen.
Als kleines Produkt gibts hier einen Gadget-Enumerator, wozu auch immer
man diesen verwenden kann
Weiter unten noch ein Beispiel um selbst das Objektemanagement von
PB zu nutzen (schnell, mit #PB_Any Unterstützung).
Der Enumerator sollte stimmen, beim eigenen Allocieren von Objekten
könnte eine Überprüfung eines PB-Teammembers nicht schaden.
greetz
Remi
Edit: Code verkürzt mit Import-EndImport
Edit2: Code angepasst -> auch im Thread Modus
Hab mal im SDK-Ordner von PB gestöbert und ohne Doku (wie immer

versucht das PB-Objektmanagement zu verstehen. Ich glaube es ist mir
gelungen.
Als kleines Produkt gibts hier einen Gadget-Enumerator, wozu auch immer
man diesen verwenden kann

Weiter unten noch ein Beispiel um selbst das Objektemanagement von
PB zu nutzen (schnell, mit #PB_Any Unterstützung).
Code: Alles auswählen
Prototype ThreadMemoryInitFunction(*Memory) ; pointer to function
Prototype ThreadMemoryEndFunction(*Memory) ; pointer to function
Prototype.l ObjectEnumerateAllCallback(id.l, *Element, *Datas) ; pointer to function
Prototype ObjectFreeFunction(id.l) ; pointer to function
Structure PB_Object
StructureSize.l
IncrementStep.l
ObjectsNumber.l
*ListFirstElement.PB_SimpleList
FreeID.ObjectFreeFunction ; to call when reallocating a static ID
CurrentID.l ; For the Object Enumeration without callback (static id)
*CurrentElement.PB_SimpleList ; // (dynamic id)
CompilerIf #PB_Compiler_Thread ;>
; For multi-THREAD
IncrementShift.l
*FirstObjectsArea.PB_SimpleList ; // simplelists build up backwards (always add at start), so we have to later walk it backwards
*LastObjectsArea.PB_SimpleList ; // this is the *real* first memoryblock
ObjectMutex.l
CompilerElse ;=
; For single-THREAD
*ObjectsArea
CompilerEndIf ;<
EndStructure
Import ""
PB_Object_GetOrAllocateID(*Object.PB_Object, id.l)
PB_Object_GetObject (*Object.PB_Object, DynamicOrArrayID.l)
PB_Object_IsObject (*Object.PB_Object, DynamicOrArrayID.l)
PB_Object_EnumerateAll (*Object.PB_Object, Callback.ObjectEnumerateAllCallback, *Datas)
PB_Object_EnumerateStart (*Object.PB_Object)
PB_Object_EnumerateNext (*Object.PB_Object, *id)
PB_Object_EnumerateAbort (*Object.PB_Object)
PB_Object_FreeID (*Object.PB_Object, DynamicOrArrayID.l)
PB_Object_Init.l (StructureSize.l, IncrementStep.l, FreeID.ObjectFreeFunction)
PB_Object_GetThreadMemory(MemoryID.l)
PB_Object_InitThreadMemory.l(Size.l, InitFunction.ThreadMemoryInitFunction, EndFunction.ThreadMemoryEndFunction)
EndImport
Global *GadgetObjects.PB_Object
Structure PB_GadgetStructure
Gadget.l ; OS Gadget pointer (HWND)
*VirtualTable.GadgetFunctions
CustomData.l ; Can be used to store extra infos on this gadget
CustomData2.l ; Can be used to store extra infos on this gadget
; to continue! 32bytes!
t1.l
t2.l
t3.l
t4.l
EndStructure
Procedure.l CallBack(id.l, *Element.PB_GadgetStructure, *Datas)
If PB_Object_IsObject(*GadgetObjects, id)
*Element2 = PB_Object_GetObject(*GadgetObjects, id)
If *Element2 And *Element2 <> *Element
*Element = *Element2
EndIf
EndIf
If *Element
With *Element
Debug "-------------------------"
Debug "ID = " + Str(id)
Debug "Gadget = " + Str(\Gadget)
Debug "VT = " + Str(\VirtualTable)
Debug "CD1 = " + Str(\CustomData)
Debug "CD2 = " + Hex(\CustomData2)
Debug "t1 = " + Str(\t1)
Debug "t2 = " + Str(\t2)
Debug "t3 = " + Str(\t3)
Debug "t4 = " + Str(\t4)
EndWith
EndIf
ProcedureReturn 1
EndProcedure
Macro DQ
"
EndMacro
Macro DebugField(Field)
Debug DQ#field#dq + " = " + Str(\Field)
EndMacro
If OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
ButtonGadget(0, 10, 10, 200, 20, "Standard Button")
ButtonGadget(#PB_Any, 10, 40, 200, 20, "Left Button", #PB_Button_Left)
ButtonGadget(2, 10, 70, 200, 20, "Right Button", #PB_Button_Right)
ButtonGadget(#PB_Any, 10,100, 200, 60, "Multiline Button (längerer Text wird automatisch umgebrochen)", #PB_Button_MultiLine)
ButtonGadget(400, 10,170, 200, 20, "Toggle Button", #PB_Button_Toggle)
!EXTRN _PB_Gadget_Objects
!MOV Eax, [_PB_Gadget_Objects]
!MOV [p_GadgetObjects], Eax
Debug "### GadgetObject ###"
With *GadgetObjects
DebugField(StructureSize) ; Grösse eines Objektes
DebugField(IncrementStep) ; wieviele IDs im Voraus allocieren
DebugField(ObjectsNumber) ; bis zu welcher ID schon allociert
DebugField(ListFirstElement) ; SimpleList (PB_Any?)
DebugField(FreeID) ; reallocation Funktion
DebugField(CurrentID)
DebugField(CurrentElement)
CompilerIf #PB_Compiler_Thread ;>
; For multi-THREAD
DebugField(IncrementShift)
DebugField(FirstObjectsArea)
DebugField(LastObjectsArea)
DebugField(ObjectMutex)
CompilerElse ;=
; For single-THREAD
DebugField(ObjectsArea)
CompilerEndIf ;<
EndWith
Debug "###################"
PB_Object_EnumerateAll(*GadgetObjects, @CallBack(), 0)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Code: Alles auswählen
Global *Objects
Structure TESTOBJECT
number.l
face.f
EndStructure
Procedure TestReallocStaticID(id.l)
Protected *obj.TESTOBJECT = PB_Object_GetObject(*Objects, id)
; called when reallocating static ID
Debug "In Reallocation function"
If *obj
Debug "Content ------------------"
Debug *obj\number
Debug *obj\face
Debug "EndContent ---------------"
Else
Debug "Nothing to reallocate."
EndIf
EndProcedure
*Objects = PB_Object_Init(SizeOf(TESTOBJECT), 5, @TestReallocStaticID()) ; pointer to function
*obj.TESTOBJECT = PB_Object_GetOrAllocateID(*Objects, 1)
*obj\number = 1
*obj\face = 2
Debug PB_Object_IsObject(*Objects, 1)
*obj.TESTOBJECT = PB_Object_GetOrAllocateID(*Objects, 1)
*obj\number = 1
*obj\face = 2
Debug PB_Object_IsObject(*Objects, 1)
Debug PB_Object_FreeID(*Objects, 1)
könnte eine Überprüfung eines PB-Teammembers nicht schaden.
greetz
Remi
Edit: Code verkürzt mit Import-EndImport
Edit2: Code angepasst -> auch im Thread Modus