Ich bin auch auf die Möglichkeit gestoßen Variablen mit unterschiedlicher Struktur gemeinsam in einer Liste zu speichern.
Nun bin ich mir nicht sicher ob das so in Orndung ist oder ob sich das in zukünfitgen PB Versionen ändern könnte.
Um das zu erreichen verwende ich InitializeStructure und den Hinweis "There is no internal check to ensures the structure match the memory area."
Hier das Beispiel:
Code: Alles auswählen
DeclareModule Car
Structure Car
name.s
speed.l
EndStructure
Declare showInfo(*self.Car)
Declare.s getName(*self.Car)
EndDeclareModule
Module Car
Procedure showInfo(*self.Car)
MessageRequester("",*self\name+" Speed:"+Str(*self\speed))
EndProcedure
Procedure.s getName(*self.Car)
ProcedureReturn *self\name
EndProcedure
EndModule
; Normales Objekt
*vw.Car::Car = AllocateStructure(Car::Car)
*vw\name = "VW"
*vw\speed = 180
;Car::showInfo(*vw)
; Bus erhält die gleiche Basis-Struktur wie Car mit Structure Extends
DeclareModule Bus
Structure Bus Extends Car::Car
seats.l
EndStructure
Declare showInfo(*self.Bus)
EndDeclareModule
Module Bus
Procedure showInfo(*self.Bus)
MessageRequester("",*self\name+" Speed: "+Str(*self\speed)+" Seats: "+Str(*self\seats))
EndProcedure
EndModule
; HIER ist der entscheidende Punkt, mit InitializeStructure kann ein Pointer auf eine beliebige Structure zeigen, *rawbus hat keinen Typ
*rawbus = AllocateMemory(SizeOf(Bus::Bus))
InitializeStructure(*rawbus ,Bus::Bus)
; Man kann daher allerdings auch nicht direkt auf die Felder zugreigen, man benötigt einen Zeiger mit Typ, der kann allerdings eben auch aus dem Supermodul sein
;Bus als Auto
*car.Car::Car = *rawbus
*car\name = "VW Bus als Auto"
*car\speed = 100
;Car::showInfo(*rawbus)
*rawbus = AllocateMemory(SizeOf(Bus::Bus))
InitializeStructure(*rawbus ,Bus::Bus)
;Bus als Bus
*bus.Bus::Bus = *rawbus
*bus\name = "VW Bus"
*bus\speed = 1000
*bus\seats = 110
;Bus::showInfo(*rawbus)
; Jetzt kommt das Auto zusammen mit dem Bus in EINE Liste :D
NewList cars()
AddElement(cars())
cars() = *vw
AddElement(cars())
cars() = *car
AddElement(cars())
cars() = *bus
ForEach cars()
Car::showInfo(cars())
Next