-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathusersavr.pas
112 lines (96 loc) · 2.36 KB
/
usersavr.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
{$I STDEFINE.INC}
unit UserSavr;
interface
uses
Views, Objects2
;
type
PUserSaver = ^TUserSaver;
TUserSaver = object(TView)
Screen: Pointer;
SSize, SWidth: AInt;
CShape, CPos: AWord;
CheckIO: Boolean;
isValid: Boolean;
constructor Init(ACheck: Boolean);
destructor Done; virtual;
constructor Load(var S: TStream);
procedure Store(var S: TStream);
function Valid(Command: Word): Boolean; virtual;
end;
procedure InsertUserSaver(ACheck: Boolean);
implementation
uses
Memory, Drivers, DNUtil, Messages, Commands, DNApp
;
{ ------------------------------------------------------------------------- }
constructor TUserSaver.Init;
var
R: TRect;
begin
R.Assign(0, 0, 0, 0);
inherited Init(R);
CheckIO := ACheck;
SetState(sfVisible, False);
isValid := True;
Screen := MemAlloc(UserScreenSize);
if Screen = nil then
Fail;
Move(UserScreen^, Screen^, UserScreenSize);
CLSAct := False;
SSize := UserScreenSize;
SWidth := UserScreenWidth;
CShape := OldCursorShape;
CPos := OldCursorPos;
end;
function TUserSaver.Valid;
begin
Valid := isValid
end;
constructor TUserSaver.Load;
var
I: Byte;
begin
inherited Load(S);
DataSaver := @Self;
S.Read(SSize, 4*SizeOf(AInt)+SizeOf(Boolean));
if UserScreen <> nil then
FreeMem(UserScreen, UserScreenSize);
UserScreenSize := SSize;
UserScreenWidth := SWidth;
UserScreen := MemAlloc(SSize);
OldCursorShape := CShape;
OldCursorPos := CPos;
S.Read(UserScreen^, SSize);
Screen := nil;
isValid := False;
I := 0;
if I <> 0 then
Msg(dlErrorsOccurred, nil, mfWarning+mfOKButton);
end;
destructor TUserSaver.Done;
begin
if Screen <> nil then
FreeMem(Screen, SSize);
inherited Done;
end;
procedure TUserSaver.Store;
begin
inherited Store(S);
S.Write(SSize, 4*SizeOf(AInt)+SizeOf(Boolean));
S.Write(Screen^, SSize);
end;
procedure InsertUserSaver;
begin
Desktop^.Insert(New(PUserSaver, Init(ACheck)));
FreeMem(UserScreen, UserScreenSize);
UserScreenSize := ScreenWidth*ScreenHeight*2;
UserScreenWidth := ScreenWidth;
OldCursorPos := 0;
OldCursorShape := $FFFF;
HideMouse;
GetMem(UserScreen, UserScreenSize);
System.Move(ScreenBuffer^, UserScreen^, UserScreenSize);
ShowMouse;
end;
end.