Alle Gadgets aufzählen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Alle Gadgets aufzählen

Beitrag von remi_meier »

... 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 :D
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)
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
Zuletzt geändert von remi_meier am 23.09.2006 14:17, insgesamt 2-mal geändert.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Fehlt im Callback noch ein id = *Element ?

Code: Alles auswählen

  If *Element2 <> *Element
    id = #PB_Any
    *Element = *Element2
    id = *Element
  EndIf
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Wie du willst, aber dein Code macht so nicht gerade viel Sinn :D
ID ist für mich das, was der User angegeben hat. Deshalb weise ich ihr
dort #PB_Any zu, damit man sieht, dass dieses Objekt per #PB_Any
erstellt wurde.
Aber es steht dir natürlich frei das so zu machen.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Ich habe den Code nun angepasst, dass er auch mit der Option THREAD
läuft. Die Infos kommen scheinbar richtig an, nur die IDs sind mir noch
ein Rätsel, d. h. ich weiss nicht, wieso nur das erste statische Gadget (ID=0)
normal überliefert wird und die restlichen statischen IDs dann irgendwelche
komischen Werte haben (128 oder so...).
Antworten