Отправка сообщения из фрейма в основную форму - PullRequest
0 голосов
/ 06 октября 2019

У меня есть заявка на получение формы 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...