-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathmsWatchedObject.mixin.pas
122 lines (94 loc) · 3.51 KB
/
msWatchedObject.mixin.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
113
114
115
116
117
118
119
120
121
122
{$IfNDef TmsWatchedObject_uses_intf}
// interface
{$Define TmsWatchedObject_uses_intf}
// uses
{$Include msObjectWrap.mixin.pas}
,
msCoreObjects
{$Else TmsWatchedObject_uses_intf}
{$IfNDef TmsWatchedObject}
// http://programmingmindstream.blogspot.ru/2014/12/generic-2.html
{$Define TmsWatchedObject}
TmsObjectWrapParent = TmsWatchedObjectParent;
{$Include msObjectWrap.mixin.pas}
TmsWatchedObjectPrim = class abstract(TmsObjectWrap)
protected
procedure Cleanup; virtual;
// - функция для очистки состояния объекта. Её надо перекрывать ВМЕСТО Destroy.
procedure InstanceAllocated; virtual;
// - функция для инициализации объекта СРАЗУ после его создания. Ещё ДО конструктора.
procedure InstanceWillBeDestroyed; virtual;
// - функция вызываемая ПОСЛЕ деструктора, но ПЕРЕД реальным освобождением объекта
public
class function NewInstance: TObject; override; final;
// ms-help://embarcadero.rs_xe7/libraries/System.TObject.NewInstance.html
procedure FreeInstance; override; final;
// ms-help://embarcadero.rs_xe7/libraries/System.TObject.FreeInstance.html
destructor Destroy; override; final;
end;//TmsWatchedObjectPrim
TmsWatchedObject = class abstract(TmsWatchedObjectPrim)
// - Класс, который умеет контроллировать создание/уничтожение своих экземпляров
public
procedure NewInstance(var aDummy); reintroduce;
// ms-help://embarcadero.rs_xe7/libraries/System.TObject.NewInstance.html
procedure FreeInstance(var aDummy); reintroduce;
// ms-help://embarcadero.rs_xe7/libraries/System.TObject.FreeInstance.html
procedure Destroy(var aDummy); reintroduce;
procedure Free(var aDummy); reintroduce;
end;//TmsWatchedObject
{$Else TmsWatchedObject}
// implementation
{$IfNDef TmsWatchedObject_uses_impl}
// uses
{$Include msObjectWrap.mixin.pas}
SysUtils
{$Define TmsWatchedObject_uses_impl}
{$Else TmsWatchedObject_uses_impl}
{$Include msObjectWrap.mixin.pas}
procedure TmsWatchedObjectPrim.Cleanup;
begin
// - Ничего не делаем
end;
destructor TmsWatchedObjectPrim.Destroy;
begin
Cleanup;
inherited;
end;
procedure TmsWatchedObjectPrim.InstanceAllocated;
begin
// - Ничего не делаем
end;
procedure TmsWatchedObjectPrim.InstanceWillBeDestroyed;
begin
// - Ничего не делаем
end;
class function TmsWatchedObjectPrim.NewInstance: TObject;
begin
TmsObjectsWatcher.CreateObject(Self, Result);
TmsWatchedObjectPrim(Result).InstanceAllocated
end;
procedure TmsWatchedObjectPrim.FreeInstance;
begin
Self.InstanceWillBeDestroyed;
TmsObjectsWatcher.DestroyObject(Self);
end;
// TmsWatchedObject
procedure TmsWatchedObject.Destroy(var aDummy);
begin
raise Exception.Create('Надо использовать FreeAndNil, а не Destroy');
end;
procedure TmsWatchedObject.Free(var aDummy);
begin
raise Exception.Create('Надо использовать FreeAndNil, а не Free');
end;
procedure TmsWatchedObject.NewInstance(var aDummy);
begin
raise Exception.Create('Нельзя ни перекрывать, ни вызывать NewInstance');
end;
procedure TmsWatchedObject.FreeInstance(var aDummy);
begin
raise Exception.Create('Нельзя ни перекрывать, ни вызывать FreeInstance');
end;
{$EndIf TmsWatchedObject_uses_impl}
{$EndIf TmsWatchedObject}
{$EndIf TmsWatchedObject_uses_intf}