DEFINE CLASS clsPrinterForms AS STRUCT DIMENSION aForms[1] cMembers = "o:aForms" nMemorySize = 100000 && Reserve memory for pointers PROCEDURE INIT This.aForms[1] = CREATEOBJECT("clsFormInfo") DODEFAULT() ENDPROC ENDDEFINE DEFINE CLASS clsFormInfo AS STRUCT flags = 0 pName = "" && form name Size = .NULL. && paper size ImageableArea = .NULL. cMembers = "l:flags, pz:pName, o:size, o:imageableArea" PROCEDURE INIT This.Size = CREATEOBJECT("clsSizeL") This.ImageableArea = CREATEOBJECT("clsRectL") DODEFAULT() ENDPROC ENDDEFINE DEFINE CLASS clsSizeL AS STRUCT cx = 0 && paper width cy = 0 && paper height cMembers = "l:cx, l:cy" ENDDEFINE DEFINE CLASS clsRectL AS STRUCT nLeft = 0 nTop = 0 nRight = 0 nBottom = 0 cMembers = "l:nLeft, l:nTop, l:nRight, l:nBottom" ENDDEFINEYou'll need to use GetPointer and SetPointer instead of GetString and SetString. You'll also need to redimension the array once you find out how many forms you are putting in it.