-
Notifications
You must be signed in to change notification settings - Fork 6
/
v8addingui.pas
115 lines (88 loc) · 1.89 KB
/
v8addingui.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
unit V8AddInGUI;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Interfaces, InterfaceBase, Forms;
type
{ TGUIThread }
TGUIThread = class (TThread)
procedure Execute; override;
procedure Synchronize(AMethod: TThreadMethod);
end;
function GUIThread: TGUIThread;
implementation
type
{ TFormController }
TFormController = class
Form: TForm;
FormClass: TFormClass;
procedure CreateForm;
procedure FreeForm;
procedure ShowForm;
procedure HideForm;
end;
var
GUICriticalSection: TRTLCriticalSection;
FGUIThread: TGUIThread;
FakeMainForm: TForm;
function GUIThread: TGUIThread;
begin
if FGUIThread = nil then
begin
EnterCriticalsection(GUICriticalSection);
try
Application.Initialize;
if FGUIThread = nil then
FGUIThread := TGUIThread.Create(False);
finally
LeaveCriticalSection(GUICriticalSection);
end;
Result := FGUIThread;
end
else
Result := FGUIThread;
end;
{ TFormController }
procedure TFormController.CreateForm;
begin
Form := FormClass.Create(nil);
end;
procedure TFormController.FreeForm;
begin
FreeAndNil(Form);
end;
procedure TFormController.ShowForm;
begin
Form.Show;
end;
procedure TFormController.HideForm;
begin
Form.Hide;
end;
{ TGUIThread }
procedure TGUIThread.Execute;
begin
Application.ShowMainForm := False;
Application.CreateForm(TForm, FakeMainForm);
repeat
WidgetSet.AppProcessMessages;
if not Terminated then
begin
Application.Idle(False);
Sleep(100);
end;
until Terminated;
FakeMainForm.Free;
end;
procedure TGUIThread.Synchronize(AMethod: TThreadMethod);
begin
TThread.Synchronize(Self, AMethod);
end;
initialization
InitCriticalSection(GUICriticalSection);
FGUIThread := nil;
finalization
if FGUIThread <> nil then
FGUIThread.Free;
DoneCriticalSection(GUICriticalSection);
end.