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
123
124
125
126
127
128
129
|
{
This demonstrates the usage of ICommand and ICommandHolder. They work
similar to Delphi's TAction classes
}
unit frm_main;
{$mode objfpc}{$H+}
interface
uses
SysUtils,
Classes,
fpg_base,
fpg_main,
fpg_form,
fpg_button,
fpg_memo,
fpg_menu;
type
TMainForm = class(TfpgForm)
private
{@VFD_HEAD_BEGIN: MainForm}
btnAdd: TfpgButton;
memName1: TfpgMemo;
btnQuit: TfpgButton;
MainMenu: TfpgMenuBar;
mnuFile: TfpgPopupMenu;
{@VFD_HEAD_END: MainForm}
miAdd: TfpgMenuItem;
procedure CommandHandler(Sender: TObject);
public
procedure AfterCreate; override;
end;
{@VFD_NEWFORM_DECL}
implementation
uses
fpg_command_intf,
commands;
{@VFD_NEWFORM_IMPL}
{ A single event handler that handles all Command based events. }
procedure TMainForm.CommandHandler(Sender: TObject);
var
cmd: ICommand;
holder: ICommandHolder;
begin
if Supports(Sender, ICommandHolder, holder) then
begin
cmd := holder.GetCommand;
cmd.Execute;
end;
end;
procedure TMainForm.AfterCreate;
begin
{@VFD_BODY_BEGIN: MainForm}
Name := 'MainForm';
SetPosition(293, 236, 284, 254);
WindowTitle := 'Command Interface Test';
WindowPosition := wpOneThirdDown;
btnAdd := TfpgButton.Create(self);
with btnAdd do
begin
Name := 'btnAdd';
SetPosition(204, 36, 75, 24);
Text := 'Add';
FontDesc := '#Label1';
ImageName := '';
OnClick := @CommandHandler;
end;
memName1 := TfpgMemo.Create(self);
with memName1 do
begin
Name := 'memName1';
SetPosition(8, 36, 188, 208);
FontDesc := '#Edit1';
end;
btnQuit := TfpgButton.Create(self);
with btnQuit do
begin
Name := 'btnQuit';
SetPosition(204, 220, 75, 24);
Text := 'Quit';
FontDesc := '#Label1';
ImageName := '';
OnClick := @CommandHandler;
end;
MainMenu := TfpgMenuBar.Create(self);
with MainMenu do
begin
Name := 'MainMenu';
SetPosition(0, 0, 284, 24);
Anchors := [anLeft,anRight,anTop];
end;
mnuFile := TfpgPopupMenu.Create(self);
with mnuFile do
begin
Name := 'mnuFile';
SetPosition(44, 72, 120, 20);
miAdd := AddMenuItem('Add Item', '', @CommandHandler);
AddMenuItem('Quit', '', @CommandHandler);
end;
{@VFD_BODY_END: MainForm}
MainMenu.AddMenuItem('File', nil).SubMenu := mnuFile;
// instantiate the Command classes
btnAdd.SetCommand(TAddCommand.Create(memName1));
btnQuit.SetCommand(TExitCommand.Create);
miAdd.SetCommand(btnAdd.GetCommand); // reuse exist command from btnAdd instance
// The menu item File|Quit shares the command of btnQuit
mnuFile.MenuItemByName('Quit').SetCommand(btnQuit.GetCommand);
end;
end.
|