У меня есть заявка на получение формы VCL, состоящая из трех единиц. Блок 1 определяет форму и включает в себя множество экземпляров фрейма с несколькими компонентами Tlabel, который определен в блоке 2. Блок 3 объявляет различные общие константы и переменные, которые могут использоваться в программе.
Когда пользователь нажимает на один из фреймов, он устанавливает определенные значения для переменных в блоке 2 и должен уведомить форму, чтобы предпринять действия, влияющие на другие ячейки и компоненты в форме. Поскольку включение модуля 1 в предложение о пользовании модуля 3 создаст циклическую ссылку, я подумал, что отправка сообщения в форму будет лучшим вариантом для выполнения необходимых действий.
В первой попытке я настроил всеследующим образом:
Unit 1
Interface
Uses ..., Winapi.Messages, Unit2, Unit3;
Type
Form1 = Class(TForm);
//List of frames and components
...
private
...
{ Private declarations }
procedure OnDisplayMessage(var Msg: TMessage); message WM_MY_MESSAGE;
...
End;
Implementation
...
procedure TForm1.OnDisplayMessage(var Msg: TMessage);
begin
TakeAction (inputlist);
end;
Unit 2 //Common program constants and variables
Interface
const
WM_MY_MESSAGE = WM_USER + 100;
...
Unit 3 //Frame component definition
interface
Uses ...Winapi.Messages, Unit2;
Types
TCellFrame = class(TFrame)
Item1: TLabel;
Item2: TLabel;
Item3: TLabel;
Item4: TLabel;
Item5: TLabel;
Item6: TLabel;
Item7: TLabel;
Item8: TLabel;
Item9: TLabel;
procedure FrameClick(Sender: TObject);
Implementation
procedure TCellFrame.FrameClick(Sender: TObject);
begin
...
SendMessage(HWND_BROADCAST,WM_MY_MESSAGE,0,0);
...
end;
Хотя код скомпилирован, необходимые действия не были выполнены. Я предположил, что сообщение не было передано в форму, поэтому я попытался заменить метод Windows AppHookFunction ()
на OnDisplayMessage ()
следующим образом: Модуль 1
Interface
Uses ..., Winapi.Messages, Unit2, Unit3;
Type
Form1 = Class(Tform;)
//List of frames and components
...
private
...
{ Private declarations }
function AppHookFunc(var Message : TMessage) : Boolean;
...
End;
Implementation
...
function TForm1.AppHookFunc(var Message : TMessage) : Boolean;
begin
Result := False;
if Message.Msg = WM_MY_MESSAGE then begin
TakeAction (inputlist);
Result := True;
end;
end;
Unit 2 //Common program constants and variables
Interface
const
WM_MY_MESSAGE = WM_USER + 100;
...
Unit 3 //Frame component definition
interface
Uses ...Winapi.Messages, Unit2;
Types
TCellFrame = class(TFrame)
Item1: TLabel;
Item2: TLabel;
Item3: TLabel;
Item4: TLabel;
Item5: TLabel;
Item6: TLabel;
Item7: TLabel;
Item8: TLabel;
Item9: TLabel;
procedure FrameClick(Sender: TObject);
Implementation
procedure TCellFrame.FrameClick(Sender: TObject);
begin
...
SendMessage(HWND_BROADCAST,WM_MY_MESSAGE,0,0);
...
end;
Эта опция также не может отправитьсообщение. Основные действия при тестировании работают нормально, поэтому я уверен, что ошибка в передаче сообщения. Есть ли у меня неправильное понимание того, как сообщения должны передаваться из фрейма в форму, или есть другой подход для реализации действия в форме, генерируемой событием frame onclick?