Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

PopupMenu   Найти похожие ветки 

 
Handle   (2006-08-13 23:51) [0]

Доброго времени суток, помогите пожалуйста вот в чём.

Есть пукт PopupMenu у которого enabled = false, как определить что по нему кликнули ?


 
Anatoly Podgoretsky ©   (2006-08-13 23:55) [1]

enabled = True


 
Loginov Dmitry ©   (2006-08-14 08:10) [2]

> enabled = false, как определить что по нему кликнули


А зачем?????


 
KilkennyCat ©   (2006-08-14 09:28) [3]

- А хотите, я его кликну? Он станет фиолетовым, в крапинку! (с) т3п


 
Ketmar ©   (2006-08-14 10:09) [4]

> [2] Loginov Dmitry ©   (14.08.06 08:10)
это новое слово в интерфейсостроительстве. чтобы юзеру не было скучно, делается "угадайка" -- "угадай, какие пункты меню рабочие". флаг Enabled расставляется случайным образом при запуске программы. ноу-хау!


 
Handle   (2006-08-14 10:10) [5]


> Anatoly Podgoretsky ©   (13.08.06 23:55) [1]


Item1.Enabled:= true;

или

PopupMenu1.Items.Items[0].Enabled:= true;

Ничего не проиходит


> KilkennyCat ©   (14.08.06 09:28) [3]


Нет, ему будет больно, он всё понимает просто ничего не говорит, лучше я отдам его кому нибудь.


 
Handle   (2006-08-14 10:18) [6]


> Ketmar ©   (14.08.06 10:09) [4]


Спасибо вам большое я бы не смог ответить лучше.


 
begin...end ©   (2006-08-27 18:30) [7]

Понятно, что уведомление WM_COMMAND родительскому окну при клике на отключённом пункте меню не посылается.

Однако, как известно, на время показа PopupMenu система крутит свой собственный цикл выборки, трансляции и диспетчеризации сообщений, анализируя их, и (что важно) вызывая при этом внутри цикла CallMsgFilter -- эта функция передаёт сообщения в ловушки типа WH_MSGFILTER, если они установлены. Поэтому одним из возможных решений будет, на мой взгляд, установка такой ловушки.

Итак, форме назначено PopupMenu. А код такой:

type
 TForm1 = class(TForm)
   PopupMenu1: TPopupMenu;
   N11: TMenuItem;
   N21: TMenuItem;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   Hook: HHOOK;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function MsgFilterHookProc(Code: Integer; WParam: Longint; var Msg: TMsg): Longint; stdcall;
var
 P: TPoint;
 I: Integer;
begin
 if Code = MSGF_MENU then
   if (Msg.hwnd = PopupList.Window) and (Msg.message = WM_LBUTTONDOWN) then
   begin
     P := SmallPointToPoint(TSmallPoint(Msg.lParam));
     I := Integer(MenuItemFromPoint(0, Form1.PopupMenu1.Handle, P));
     if I <> -1 then
       if not Form1.PopupMenu1.Items[I].Enabled then
         Form1.Caption := Format("Кликнут отключённый элемент меню! Его номер: %d", [I]);
   end;
 Result := CallNextHookEx(0, Code, WParam, Longint(@Msg));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Hook := SetWindowsHookEx(WH_MSGFILTER, @MsgFilterHookProc, HInstance, GetCurrentThreadId);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 UnhookWindowsHookEx(Hook);
end;


Код очень сырой -- например, он не будет работать для вложенных элементов меню, да и много ещё всяких недочётов, но, тем не менее, идею он показывает.

Если кто-нибудь предложит другое решение, выслушаю с интересом.

P.S. Кстати, в D7 MenuItemFromPoint объявлена неверно: результат имеет тип LongBool (!).


 
Handle ©   (2006-08-27 21:00) [8]


> begin...end ©   (27.08.06 18:30) [7]


Спасибо



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.044 c
15-1156505558
АК
2006-08-25 15:32
2006.09.17
глючный сканер


2-1157053744
СамМохамедАлиКручеВсехБрюсЛи
2006-08-31 23:49
2006.09.17
Jet and Access


15-1156741216
begin...end
2006-08-28 09:00
2006.09.17
28 августа. С Днём рождения!


15-1155678234
Караед
2006-08-16 01:43
2006.09.17
Домофон!


2-1156749072
shake
2006-08-28 11:11
2006.09.17
выборка из dbgrid