Program KenTest; { a short program to check out collecting TObject Descendents, as opposed to binding data types directly to a collection object} Uses Objects; Type PBaseData = ^BaseData; BaseData = Object(TObject) name : PString; DType: Word; Data : Pointer; Constructor Init(AName:String;Var AData); Procedure PutData(Var S:TStream); virtual; Function GetData(Var S:TStream):Pointer; virtual; Procedure SetData(Var ADAta); virtual; Constructor Load(Var S:TStream); Procedure Store(Var S:TStream); virtual; Destructor Done; virtual; end; Constructor BaseData.Init(AName:String;Var AData); Begin Name := NewStr(Aname); Data := Nil; SetData(AData); End; Constructor BaseData.Load(Var S:TStream); Begin Name := S.ReadStr; S.Read(DType,2); Data := GetData(S); End; Procedure BaseData.SetData(Var AData); Begin DType := 0; End; Procedure BaseData.Store(Var S:TStream); Begin S.WriteStr(Name); S.Write(DType,2); PutData(S); End; Function BaseData.GetData(Var S:TStream):Pointer; Begin GetData := Nil; End; Procedure BaseData.PutData(Var S:TStream); Begin End; Destructor BaseData.Done; Begin DisposeStr(Name); End; Type PStrData = ^StrData; StrData = Object(BaseData) Procedure PutData(Var S:TStream); virtual; Function GetData(Var S:TStream):Pointer; virtual; Procedure SetData(Var ADAta); virtual; Destructor Done; virtual; end; LongPtr = ^LongInt; PNumData = ^NumData; NumData = Object(BaseData) Procedure PutData(Var S:TStream); virtual; Function GetData(Var S:TStream):Pointer; virtual; Procedure SetData(Var ADAta); virtual; Destructor Done; virtual; end; Procedure StrData.PutData(Var S:TStream); Begin S.WriteStr(PString(Data)); End; Function StrData.GetData(Var S:TStream):Pointer; Begin GetData := S.ReadStr; End; Procedure StrData.SetData(Var AData); Var S:String Absolute AData; Begin Data := NewStr(S); DType := 1; End; Destructor StrData.Done; Begin DisposeStr(PString(Data)); Inherited Done; End; Procedure NumData.PutData(Var S:TStream); Begin S.Write(LongPtr(Data)^,SizeOf(LongInt)); End; Function NumData.GetData(Var S:TStream):Pointer; Var L : LongPtr; Begin New(L); S.Read(L^,SizeOf(LongInt)); GetData := L; End; Procedure NumData.SetData(Var AData); Var L:LongInt Absolute AData; Begin DType := 2; New(LongPtr(Data)); LongPtr(Data)^ := L; End; Destructor NumData.Done; Begin Dispose(LongPtr(Data)); Inherited Done; End; Const RStrDataRec : TStreamRec = (ObjType : 19561; VMTLink : Ofs(TypeOf(StrData)^); Load : @StrData.Load; Store : @StrData.Store); RNumDataRec : TStreamRec = (ObjType : 19562; VMTLink : Ofs(TypeOf(NumData)^); Load : @NumData.Load; Store : @NumData.Store); Procedure ShowStuff(P:PCollection); Procedure ShowName(P:PBaseData); far; Begin if P^.Name <> Nil then Write(P^.Name^,' '); Case P^.DType of 1 : if PString(P^.Data) <> Nil then Writeln(PString(P^.Data)^); 2 : writeln(LongPtr(P^.Data)^); end; end; Begin P^.ForEach(@ShowName); End; Var P : PCollection; Ps : PDosStream; m : Longint; S : String; I : LongInt; Begin m := MaxAvail; RegisterType(RCollection); RegisterType(RStrDataRec); RegisterType(RNumDataRec); New(P,init(5,5)); if P <> Nil then Begin S := 'String data # 1'; P^.insert(New(PStrData,init('A string data type ',S))); S := 'String data # 2'; P^.insert(New(PStrData,init('A second string data type ',S))); I := 1234567; P^.Insert(New(PNumData,init('Numeric Data Type',I))); S := 'String Data #3'; P^.Insert(New(PStrData,init('A third string data type ',S))); I := 987654; P^.Insert(New(PNumData,init('A second Numeric data type ',I))); New(Ps,init('Test1.dta',StCreate)); if Ps <> Nil then begin P^.Store(Ps^); dispose(P,Done); Dispose(Ps,Done); if maxavail = m then writeln('mem disposed') else writeln('Failed to release memory'); new(Ps,init('test1.dta',stopenread)); if Ps <> Nil then Begin New(P,Load(Ps^)); dispose(Ps,done); if P <> Nil then showstuff(P); if p <> Nil then dispose(P,done); end; end; end; if maxavail = m then writeln('mem disposed') else writeln('Failed to release memory'); End. ...ken --- * Origin: Telos Point of Source. Replied From Saved Mail. (Max 1:249/201.21)