[Back to STREAMS SWAG index] [Back to Main SWAG index] [Original]

    {
    This program example will demonstrate how to save your
    desktop using a stream.  It will give you the ability
    to insert windows on the destop and save the state in a
    .DSK file and load them from the file to restore its'
    state.  Streams REQURE registration of decendant object
    types.  Many fall folly to using objects in a stream
    that have not been registered.

    }

    Program Simple_Stream;

    Uses Objects, Drivers, Views, Menus, App;

    Type
      PMyApp = ^MyApp;
      MyApp = Object(TApplication)
         Constructor Init;
         Procedure InitStatusLine; Virtual;
         Procedure InitMenuBar; Virtual;
         Procedure HandleEvent(var Event: TEvent); Virtual;
         Procedure NewWindow;
         Destructor Done; Virtual;
      End;

      PMyWindow = ^TMyWindow;
      TMyWindow = Object(TWindow)
         Constructor Init(Bounds: TRect; WinTitle: String; WindowNo: Word);
      End;

      PMyDeskTop = ^TMyDeskTop;
      TMyDeskTop = object(TDeskTop)
         Windw: PMyWindow;
         Constructor Load(var S:TBufStream);
         Procedure Store(var S: TBufStream); Virtual;
      End;

    Const
      cmNewWin   = 101;
      cmSaveDesk = 102;
      cmLoadDesk = 103;

      RMyDeskTop: TstreamRec = (
         ObjType : 1001;
         VmtLink : Ofs(TypeOf(TMyDeskTop)^);
         Load    : @TMyDeskTop.Load;
         Store   : @TMyDeskTop.Store
      );

      RMyWindow: TstreamRec = (
         ObjType : 1002;
         VmtLink : Ofs(TypeOf(TMyWindow)^);
         Load    : @TMyWindow.Load;
         Store   : @TMyWindow.Store
      );

    Procedure SaveDeskStream;
    Var
      SaveFile:TBufStream;
    Begin
      SaveFile.Init('Rdesk.dsk',stCreate,1024);
      SaveFile.Put(DeskTop);
      If Savefile.Status <>0 then
        write('Bad Save',Savefile.Status);
      SaveFile.Done;
    End;

    Procedure LoadDeskStream;
    Var
      SaveFile:TBufStream;
    Begin
      SaveFile.Init('Rdesk.dsk',stOpen,1024);
      DeskTop^.insert(PMyDeskTop(SaveFile.Get));
      If Savefile.Status <>0 then
        write('Bad Load',Savefile.Status)
      else
        DeskTop^.ReDraw;
      SaveFile.Done;
    End;

    { ** MyApp **}
    Constructor MyApp.Init;
    Begin
      TApplication.Init;
      RegisterType(RMyDesktop);
      RegisterType(RDesktop);
      RegisterType(Rwindow);
      RegisterType(RMywindow);
      RegisterType(RFrame);
      RegisterType(RMenuBar);
      RegisterType(RStatusLine);
      RegisterType(RBackground);
    End;

    Destructor MyApp.Done;
    Begin
      TApplication.Done;
    End;

    Procedure MyApp.InitMenuBar;
    Var
      R: TRect;
    Begin
      GetExtent(R);
      R.B.Y := R.A.Y + 1;
      MenuBar := New(PMenuBar, Init(R, NewMenu(
        NewSubMenu('~F~ile', hcNoContext, NewMenu(
        NewItem('~N~ew', 'F4', kbF4, cmNewWin, hcNoContext,
        NewLine(
           NewItem('E~x~it', 'Alt-X', kbAltX, cmQuit, hcNoContext,
           Nil)))),
        NewSubMenu('~D~eskTop', hcNoContext, NewMenu(
           NewItem('~S~ave Desktop','',kbF2,cmSaveDesk,hcNoContext,
           NewItem('~L~oad Desktop','',kbF3,cmLoadDesk,hcNoContext,
        nil))),nil)))));
    End;

    Procedure MyApp.InitStatusLine;
    Var
      R: TRect;
    Begin
      GetExtent(R);
      R.A.Y := R.B.Y - 1;
      StatusLine := New(PStatusLine, Init(R,
      NewStatusDef(0, $FFFF,
        NewStatusKey('', kbF10, cmMenu,
        NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit,
        NewStatusKey('~F4~ New', kbF4, cmNewWin,
        NewStatusKey('~Alt-F3~ Close', kbAltF3, cmClose,
        nil)))),
      nil)));
    End;

    Procedure MyApp.HandleEvent(var Event: TEvent);
    Begin
      TApplication.HandleEvent(Event);
      if Event.What = evCommand then
        Begin
          Case Event.Command of
            cmNewWin: NewWindow;
            cmSaveDesk:SaveDeskStream;
            cmLoadDesk:LoadDeskStream;
          else
            Exit;
          End;
          ClearEvent(Event);
        End;
    End;

    Procedure MyApp.NewWindow;
    Var
      Window:PMyWindow;
      R: TRect;
    Begin
      R.Assign(0, 0, 24, 7);
      R.Move(Random(55), Random(16));
      Window := New(PMyWindow, Init(R, 'Demo Window', 1));
      DeskTop^.Insert(Window);
    End;

    { ** MyDeskTop **}
    Constructor TMyDeskTop.Load(Var S: TBufStream);
    Begin
      TDeskTop.Load(S);
      GetSubViewPtr(S,Windw);
    End;

    Procedure TMyDeskTop.Store(Var S: TBufStream);
    Begin
      TDeskTop.Store(S);
      PutSubViewPtr(S,Windw);
    End;

    { ** MyWindow **}
    Constructor TMyWindow.Init(Bounds: TRect; WinTitle: String; WindowNo: Word);
    Begin
      TWindow.init(Bounds,WinTitle,WindowNo);
    End;

    { Main Program }
    Var
      MyTApp:MyApp;

    Begin
      MyTApp.Init;
      MyTApp.Run;
      MyTApp.Done;
    End.

[Back to STREAMS SWAG index] [Back to Main SWAG index] [Original]