Как да проверите състоянието на менюто, DelphiSite
Най-четени
Как да проверя състоянието на менюто?
Какъв е въпросът: как да разбера дали в момента е натиснат правилният елемент от менюто? Че аз в таймера мога да го разпитам за статус. Докато някоя част от главното меню не "изпадне" (т.е. елементът "Файл" е натиснат и се виждат Нов, Отваряне, Запазване и т.н.), трябва да правите нещо на всеки половин секунда. Тоест, трябва да хванете момента, в който това меню се затваря, за да спрете да правите нещо. 1) Събитие OnClick - задейства върху елемент, ако щракнем върху него или ако този елемент има подменю (или по-скоро поделементи) и то е активирано. в резултат на това - като окачим манипулатора на OnClick, можем да разберем дали менюто е активирано и кое меню, както и да разберем информация за подменюто (и, ако е необходимо, какво да променим в нишката). 2) От стъпка 1 знаем какво е менюто. активно. Но трябва да знаем, че менюто е затворено. за това хващаме съобщението WM_CAPTURECHANGED или то не се вижда WM_UNINITMENUPOPUP. Пример за първия и втория параграф:
Windows, съобщения, SysUtils, варианти, класове, графики, контроли, формуляри,
Диалогови прозорци, ExtCtrl, менюта, StdCtrl, ComCtrl;
TForm1 = клас (TForm)
N1231: TMenuItem; // Някаква точка
N23551: TMenuItem; // Някаква точка
N1231231: TMenuItem; // Някаква точка
N1231111: TMenuItem; // Някаква точка
Таймер1: TTimer; // Някаква точка
N2341: TMenuItem; // Някаква точка
N2342: TMenuItem; // Някаква точка
N234541: TMenuItem; // Някаква точка
N23421: TMenuItem; // Някаква точка
ertert1: TMenuItem; // Някаква точка
N1: TMenuItem; // Някаква точка
N123121: TMenuItem; // Някаква точка
N1231232: TMenuItem; // Някаква точка
N2343: TMenuItem; // Някаква точка
процедураTimer1Timer(Подател: TObject);
процедура WndProc ( var Message: TMessage ); отмяна;
процедура N1231Click ( Подател: TObject ) ;
f: boolean = false; // флаг за активност
процедура TForm1. WndProc ( var Message: TMessage ) ;
if ( Message. Msg =WM_UNINITMENUPOPUP ) тогава
Надпис: = 'Хм. Не можеш да ме видиш! Но аз съм активен!' друго
if ( Message. Msg =WM_CAPTURECHANGED ) тогава
Надпис: = 'Упс. навън ли си?' ;
f:= невярно; //Нулирайте флага за активност
end else inherited;
end else inherited;
процедура TForm1. Timer1Timer(Подател: TObject);
EndMenu; // затворете менюто
Таймер1. Активирано := невярно ;
процедура TForm1. N1231Click (Подател: TObject) ;
// Задържаме всички елементи от менюто :)
Caption:= IntToStr ( TMenuItem ( Sender ) . MenuIndex ) ;
if ( TMenuItem ( Sender ) . Count > 0 ) then
ако f= невярно тогава
Таймер1. Интервал := 10000 ; // Задаване на таймер за автоматично затваряне