home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue69 / System / DeskLayoutForm.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2001-03-22  |  4.3 KB  |  131 lines

  1. unit DeskLayoutForm;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   StdCtrls, ExtCtrls, DesktopManager;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     ScreenResLabel: TLabel;
  12.     SaveLayout: TButton;
  13.     Bevel1: TBevel;
  14.     RestoreLayout: TButton;
  15.     dm: TDesktopManager;
  16.     procedure FormCreate(Sender: TObject);
  17.     procedure SaveLayoutClick(Sender: TObject);
  18.     procedure RestoreLayoutClick(Sender: TObject);
  19.   private
  20.     { Private declarations }
  21.     LayoutFile: String;
  22.   public
  23.     { Public declarations }
  24.   end;
  25.  
  26. var
  27.   Form1: TForm1;
  28.  
  29. implementation
  30.  
  31. {$R *.DFM}
  32.  
  33. const
  34.     FileHeader: PChar = 'Delphi Desk Layout Manager 1.0' + #13 + #10 + #26;
  35.  
  36. procedure TForm1.FormCreate(Sender: TObject);
  37. begin
  38.     ScreenResLabel.Caption := Format (ScreenResLabel.Caption, [Screen.Width, Screen.Height]);
  39.     LayoutFile := ExtractFilePath (Application.ExeName) + Format ('%dx%d.desk', [Screen.Width, Screen.Height]);
  40.     RestoreLayout.Enabled := FileExists (LayoutFile);
  41. end;
  42.  
  43. procedure TForm1.SaveLayoutClick(Sender: TObject);
  44. var
  45.     Len: Byte;
  46.     fs: TFileStream;
  47.     ItemName: String;
  48.     ItemPos: TPoint;
  49.     Idx, ItemCount: Integer;
  50. begin
  51.     if (not RestoreLayout.Enabled) or (MessageDlg ('Overwrite existing file "' + LayoutFile + '" ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then begin
  52.         fs := TFileStream.Create (LayoutFile, fmCreate);
  53.         try
  54.             // Write file header & item count
  55.             fs.Write (FileHeader^, StrLen (FileHeader));
  56.             ItemCount := dm.ItemCount;
  57.             fs.Write (ItemCount, sizeof (ItemCount));
  58.             // Now write the individual items
  59.             dm.Active := True;
  60.             try
  61.                 for Idx := 0 to ItemCount - 1 do begin
  62.                     ItemName := dm.Caption [Idx];
  63.                     Len := Length (ItemName);
  64.                     fs.Write (Len, sizeof (Len));
  65.                     fs.Write (ItemName[1], Len);
  66.                     ItemPos := dm.Position [Idx];
  67.                     fs.Write (ItemPos, sizeof (ItemPos));
  68.                 end;
  69.             finally
  70.                 dm.Active := False;
  71.             end;
  72.         finally
  73.             fs.Free;
  74.         end;
  75.     end;
  76.  
  77.     RestoreLayout.Enabled := FileExists (LayoutFile);
  78. end;
  79.  
  80. procedure TForm1.RestoreLayoutClick(Sender: TObject);
  81. var
  82.     Len: Byte;
  83.     fs: TFileStream;
  84.     ItemName: String;
  85.     ItemPos: TPoint;
  86.     Names: TStringList;
  87.     NewIdx, Idx, FileCount: Integer;
  88.     szBuff: array [0..255] of Char;
  89. begin
  90.     if MessageDlg ('Restore desktop layout for this screen resolution?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
  91.         fs := TFileStream.Create (LayoutFile, fmOpenRead);
  92.         try
  93.             // Validate the input file
  94.             fs.Read (szBuff, StrLen (FileHeader));
  95.             if StrComp (szBuff, FileHeader) <> 0 then ShowMessage ('Layout file is invalid or wrong version') else begin
  96.                 fs.Read (FileCount, sizeof (FileCount));
  97.                 dm.Active := True;
  98.                 try
  99.                     Names := TStringList.Create;
  100.                     try
  101.                         // Get *current* desktop status for index mapping
  102.                         for Idx := 0 to dm.ItemCount - 1 do Names.Add (dm.Caption [Idx]);
  103.                         // Now do the biz
  104.                         for Idx := 0 to FileCount - 1 do begin
  105.                             // Read item name - pascal format
  106.                             fs.Read (Len, sizeof (Len));
  107.                             SetLength (ItemName, Len);
  108.                             fs.Read (ItemName [1], Len);
  109.                             fs.Read (ItemPos, sizeof (ItemPos));
  110.                             // Does this item still exist?
  111.                             NewIdx := Names.IndexOf (ItemName);
  112.                             if NewIdx <> -1 then
  113.                                 if (dm.Position [NewIdx].x <> ItemPos.x) or (dm.Position [NewIdx].y <> ItemPos.y) then
  114.                                     dm.Position [NewIdx] := ItemPos;
  115.                         end;
  116.                     finally
  117.                         Names.Free;
  118.                     end;
  119.                 finally
  120.                     dm.Active := False;
  121.                 end;
  122.             end;
  123.         finally
  124.             fs.Free;
  125.         end;
  126.     end;
  127. end;
  128.  
  129. end.
  130.  
  131.