home *** CD-ROM | disk | FTP | other *** search
- unit DeskLayoutForm;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls, ExtCtrls, DesktopManager;
-
- type
- TForm1 = class(TForm)
- ScreenResLabel: TLabel;
- SaveLayout: TButton;
- Bevel1: TBevel;
- RestoreLayout: TButton;
- dm: TDesktopManager;
- procedure FormCreate(Sender: TObject);
- procedure SaveLayoutClick(Sender: TObject);
- procedure RestoreLayoutClick(Sender: TObject);
- private
- { Private declarations }
- LayoutFile: String;
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.DFM}
-
- const
- FileHeader: PChar = 'Delphi Desk Layout Manager 1.0' + #13 + #10 + #26;
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- ScreenResLabel.Caption := Format (ScreenResLabel.Caption, [Screen.Width, Screen.Height]);
- LayoutFile := ExtractFilePath (Application.ExeName) + Format ('%dx%d.desk', [Screen.Width, Screen.Height]);
- RestoreLayout.Enabled := FileExists (LayoutFile);
- end;
-
- procedure TForm1.SaveLayoutClick(Sender: TObject);
- var
- Len: Byte;
- fs: TFileStream;
- ItemName: String;
- ItemPos: TPoint;
- Idx, ItemCount: Integer;
- begin
- if (not RestoreLayout.Enabled) or (MessageDlg ('Overwrite existing file "' + LayoutFile + '" ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then begin
- fs := TFileStream.Create (LayoutFile, fmCreate);
- try
- // Write file header & item count
- fs.Write (FileHeader^, StrLen (FileHeader));
- ItemCount := dm.ItemCount;
- fs.Write (ItemCount, sizeof (ItemCount));
- // Now write the individual items
- dm.Active := True;
- try
- for Idx := 0 to ItemCount - 1 do begin
- ItemName := dm.Caption [Idx];
- Len := Length (ItemName);
- fs.Write (Len, sizeof (Len));
- fs.Write (ItemName[1], Len);
- ItemPos := dm.Position [Idx];
- fs.Write (ItemPos, sizeof (ItemPos));
- end;
- finally
- dm.Active := False;
- end;
- finally
- fs.Free;
- end;
- end;
-
- RestoreLayout.Enabled := FileExists (LayoutFile);
- end;
-
- procedure TForm1.RestoreLayoutClick(Sender: TObject);
- var
- Len: Byte;
- fs: TFileStream;
- ItemName: String;
- ItemPos: TPoint;
- Names: TStringList;
- NewIdx, Idx, FileCount: Integer;
- szBuff: array [0..255] of Char;
- begin
- if MessageDlg ('Restore desktop layout for this screen resolution?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
- fs := TFileStream.Create (LayoutFile, fmOpenRead);
- try
- // Validate the input file
- fs.Read (szBuff, StrLen (FileHeader));
- if StrComp (szBuff, FileHeader) <> 0 then ShowMessage ('Layout file is invalid or wrong version') else begin
- fs.Read (FileCount, sizeof (FileCount));
- dm.Active := True;
- try
- Names := TStringList.Create;
- try
- // Get *current* desktop status for index mapping
- for Idx := 0 to dm.ItemCount - 1 do Names.Add (dm.Caption [Idx]);
- // Now do the biz
- for Idx := 0 to FileCount - 1 do begin
- // Read item name - pascal format
- fs.Read (Len, sizeof (Len));
- SetLength (ItemName, Len);
- fs.Read (ItemName [1], Len);
- fs.Read (ItemPos, sizeof (ItemPos));
- // Does this item still exist?
- NewIdx := Names.IndexOf (ItemName);
- if NewIdx <> -1 then
- if (dm.Position [NewIdx].x <> ItemPos.x) or (dm.Position [NewIdx].y <> ItemPos.y) then
- dm.Position [NewIdx] := ItemPos;
- end;
- finally
- Names.Free;
- end;
- finally
- dm.Active := False;
- end;
- end;
- finally
- fs.Free;
- end;
- end;
- end;
-
- end.
-
-