
{
  This program demonstrates how to use your EXE
  file as a resource.  You should run this program
  twice - once to write info to the EXE and once to

  read info out.
}

program foo;

uses Objects;

type
  PMyObject = ^TMyObject;
  TMyObject = object(TObject)
    AString: String;
    constructor Init(S: String);
    constructor Load(var S: TStream);
    procedure Store(var S: TStream);
  end;

constructor TMyObject.Init(S: String);
begin
  inherited Init;
  AString := S;
end;

constructor TMyObject.Load(var S: TStream);
begin
  inherited Init;
  S.Read(AString, SizeOf(AString));
end;

procedure TMyObject.Store(var S: TStream);

begin
  S.Write(AString, SizeOf(AString));
end;

const
  RMyObject: TStreamRec = (
    ObjType: 100;
    VmtLink: Ofs(TypeOf(TMyObject)^);
    Load: @TMyObject.Load;
    Store: @TMyObject.Store);

var
  Rez: PResourceFile;
  TheStream: PBufStream;
  AObject, Obj: PMyObject;

begin
   { Register my object for streaming }
  RegisterType(RMyObject);
   { Create instace of my object }
  Obj := New(PMyObject, Init('Hello world'));
   { Create instance of a stream pointing to EXE file }

  TheStream := New(PBufStream, Init(ParamStr(0), stOpen, 1024));
   { was stream created okay? }
  if TheStream^.Status = stOk then begin
   { Crate instance of resource file }
    Rez := New(PResourceFile, Init(TheStream));
   { try to grab object from resource stream }
    AObject := PMyObject(Rez^.Get('My Object'));
    if AObject <> nil then
   {  if found, then write object's string to screen }
      writeln('The magic string is: ' + AObject^.AString)
    else

   { if not, then write object to resource }
      Rez^.Put(Obj, 'My Object');
  end;
   { clean up }
  Obj^.Free;
  Rez^.Free;
end.


