В чём вопрос: как узнать, нажат ли сейчас именно нужный пункт меню? Чтобы я в таймере мог его опрашивать на состояние.

До тех пор, пока какая-то часть главного меню "выпала" (то есть нажат итем "Файл", и видны New, Open, Save etc.) нужно чёто делать раз в полсекунды. То есть надо отловить момент, когда это самое меню закроется, чтобы перестать чё-то делать.

 

1)Событие OnClick - срабатывает на пункте если мы по нему кликнули или если данный пункт имеет подменю(а точнее подпункты) и оно активировалось... как следствие - повесив обработчик на OnClick мы можем узнать что меню активировалось и какое енто меню, а также узнать информацию о подменю(и при необходимости что нить изменить  ).

 

2)Из ходя из 1 пункта мы знаем что меню... активно. Но нам надо знать что меню закрылось... для ентого ловим сообщение WM_CAPTURECHANGED или его не видно WM_UNINITMENUPOPUP.

 

Пример для первого и второго пункта:

Code:

unit Unit1;

{©Drkb v.3}

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, Menus, StdCtrls, ComCtrls;

 

type

TForm1 = class(TForm)

  MainMenu1: TMainMenu;

  N1231: TMenuItem; //Какой то пункт

  N23551: TMenuItem; //Какой то пункт

  N1231231: TMenuItem; //Какой то пункт

  N1231111: TMenuItem; //Какой то пункт

  Timer1: TTimer; //Какой то пункт

  N2341: TMenuItem; //Какой то пункт

  N2342: TMenuItem; //Какой то пункт

  N234541: TMenuItem; //Какой то пункт

  N23421: TMenuItem; //Какой то пункт

  ertert1: TMenuItem; //Какой то пункт

  N1: TMenuItem; //Какой то пункт

  N123121: TMenuItem; //Какой то пункт

  N1231232: TMenuItem; //Какой то пункт

  N2343: TMenuItem; //Какой то пункт

  procedure Timer1Timer(Sender: TObject);

  procedure WndProc(var Message: TMessage); override;

  procedure N1231Click(Sender: TObject);

private

  { Private declarations }

public

  { Public declarations }

end;

 

var

Form1: TForm1;

f:boolean=false; //флаг активности

 

implementation

 

{$R *.dfm}

 

procedure TForm1.WndProc(var Message: TMessage);

begin

if f then

begin

if (Message.Msg=WM_UNINITMENUPOPUP) then

  Caption:='Мдя... Че-то меня не видно! Но я активен!' else

  if (Message.Msg=WM_CAPTURECHANGED) then

   begin

    Caption:='Ёпс!... ты че вышел?';

    f:=false; //Сбрасываем флаг активности

   end else inherited;

end else inherited;

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

EndMenu; //закрываем меню

Timer1.Enabled:=false;

end;

 

procedure TForm1.N1231Click(Sender: TObject);

//Вешаем на все пункты меню :)

begin

Caption:=IntToStr(TMenuItem(Sender).MenuIndex);

if (TMenuItem(Sender).Count>0) then

begin

if f=false then

  begin

   Timer1.Interval:=10000; //Ставим таймер для автоматического закрытия

   Timer1.Enabled:=true;

   Timer1.OnTimer:=Timer1Timer;

  end;

f:=true; //меню активированно!

end;

end;

 

end.

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить