mit diesem alten Osterei kann man auf das PB Objekt-Management direkt zugreifen ohne Assembler benutzen zu müssen.
Dies ist das Ticket Beispiel aus dem SDK Verzeichnis (\SDK\VisualC\ObjectManagement), zu 100% in PB umgeschrieben und mit Test-Code.
Es läuft auch prima mit TailBite zusammen
Code: Alles auswählen
; German forum:
; Author: benubi + perfected by ts-soft & Sicro
; Date: 15. April 2017
; OS: all
; Demo: unknown
; -------------------
; /\/\/\/
; -------------------
; Name: TicketEasterEgg.pb
; Version: v1.1
; PB-Version: All versions since "Import" command was included
; -------------------
; /\/\/\/
; -------------------
; Description :
;
; Ticket example - originaly written in c/c++ - from the PB SDK Folder.
;
; 100% PureBasic
;
; The (original) Ticket example is useful to learn basic/fundamental
; PB-object managment.
;
;
; -------------------
; /\/\/\/ Ticket Library
; -------------------
;
; PureBasic/SDK/Objects.h
; PB Internal Object Management
CompilerIf #PB_Compiler_OS & #PB_OS_Windows = #PB_OS_Windows
Import "" ; <- Oster Ei, easter egg, oeuf de Pâques
CompilerElse
ImportC "" ; <- Oster Ei, easter egg, oeuf de Pâques à la c/c++
CompilerEndIf
; *Object = PB object area
; ID = PB ID (e.g. #Image, #Mesh, #Ticket, #PB_Any ...)
PB_Object_GetOrAllocateID( *Object, ID);
PB_Object_GetObject ( *Object, DynamicOrArrayID);
PB_Object_IsObject ( *Object, DynamicOrArrayID);
PB_Object_EnumerateAll ( *Object, ObjectEnumerateAllCallback , *Data);
PB_Object_EnumerateStart ( *Object);
PB_Object_EnumerateStartRecursive( *Object);
PB_Object_EnumerateNext ( *Object, *ID);
PB_Object_EnumerateNextRecursive( *Object, *ID);
PB_Object_EnumerateAbort ( *Object);
PB_Object_FreeID ( *Object, DynamicOrArrayID);
PB_Object_CleanAll ( *Object);
PB_Object_Init ( StructureSize, IncrementStep, ObjectFreeFunction ); Create new PB object area
PB_Object_Count ( *Object) ;
; etc.
EndImport
; -------------------
; /\/\/\/ Ticket Structures
; -------------------
Structure Ticket ; Ticket structure
RESERVED_OR_OS_HANDLE.i ; MUST be non-zero on successful object-initialisation
; or PB will discard the new object!
Number.i ; Ticket number value
EndStructure
; -------------------
; /\/\/\/
; -------------------
Define.i obj_tickets ; Tickets' object area
; -------------------
; /\/\/\/
; -------------------
;
Declare CreateTicket(ID,Number) ; Create Ticket
Declare FreeTicket(ID) ; Free Ticket
Declare IsTicket(ID) ; Check Ticket
Declare GetTicket(ID) ; Get Ticket value
Declare SetTicket(ID,Number) ; Set Ticket value
Declare Ticket_Init() ; Ticket-Library initialization procedure ( init the ticket object area )
; -------------------
; /\/\/\/
; -------------------
Procedure Ticket_Init() ; You need to init your PureBasic "Objects-Area" first!
Shared obj_tickets
If Not obj_tickets
obj_tickets = PB_Object_Init(SizeOf(Ticket),16,@FreeTicket())
EndIf
ProcedureReturn obj_tickets
EndProcedure
Procedure CreateTicket(ID,Number) ; Create/Replace Ticket
Shared obj_tickets
Protected *OBJ.Ticket
*OBJ = PB_Object_GetOrAllocateID(obj_tickets,ID)
If *OBJ
*OBJ\RESERVED_OR_OS_HANDLE='Dx' ; Init the OS handle / reserved init-value
*OBJ\number=Number
EndIf
ProcedureReturn *OBJ
EndProcedure
Procedure SetTicket(ID,Number) ; Set Ticket value
Shared obj_tickets
Protected *OBJ.Ticket
*OBJ=PB_Object_GetObject(obj_tickets,ID)
If *OBJ
*OBJ\number=number
EndIf
ProcedureReturn *OBJ
EndProcedure
Procedure IsTicket(ID) ; Check if ID is a valid ticket
Shared obj_tickets
ProcedureReturn PB_Object_IsObject(obj_tickets,ID)
EndProcedure
Procedure GetTicket(ID) ; Get Ticket
Shared obj_tickets
Protected *OBJ.Ticket
*OBJ=PB_Object_GetObject(obj_tickets,ID)
If *obj
ProcedureReturn *OBJ\number
EndIf
ProcedureReturn 0
EndProcedure
Procedure FreeTicket(ID) ; Free Ticket
Shared obj_tickets
ProcedureReturn PB_Object_FreeID(obj_tickets,ID)
EndProcedure
; ----
Procedure TicketCount() ; Count all tickets
Shared obj_tickets
ProcedureReturn PB_Object_Count(obj_tickets)
EndProcedure
; -------------------
; -------------------
; ##################################################################################
; -------------------
; /\/\/\/
; -------------------
; TEST: "Internal library" test
; -------------------
; -------------------
; -------------------
Macro _yes_no_(_a_,_b_)
If _b_
Debug "(0x"+RSet(Hex(_a_),SizeOf(Integer)*2,"0")+"): yes"
Else
Debug "(0x"+RSet(Hex(_a_),SizeOf(Integer)*2,"0")+"): no"
EndIf
EndMacro
Ticket_Init()
;
CreateTicket(1,101)
CreateTicket(2,202)
CreateTicket(3,333333)
;
dynamic.i = CreateTicket(-1,404)
;
Debug "Ticket-Count:"
Debug TicketCount()
Debug "Ticket-Values:"
For i.i =1 To 3
Debug "#"+Str(i) + ": " +GetTicket(i)
Next
;
Debug "Dynamic Ticket Value:(0x"+RSet(Hex(dynamic),SizeOf(Integer)*2,"0")+"):"
Debug GetTicket(dynamic)
Debug "****"
Debug "Is Ticket:"
For i.i=0 To 10
_yes_no_(i,IsTicket(i))
Next
_yes_no_(dynamic,IsTicket(dynamic))
Debug "free tickets 0..10"
For i.i = 0 To 10:FreeTicket(i):Next
Debug "****"
Debug "Is Ticket:"
For i.i=0 To 10
_yes_no_(i,IsTicket(i))
Next
_yes_no_(dynamic,IsTicket(dynamic))
Debug "Ticket Count:"
Debug TicketCount()
; -------------------
; -------------------
; ##################################################################################
; -------------------
; -------------------
; TEST 2
;
;
;
;
Benubi