Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.028 c
2-1157013854
worldmen
2006-08-31 12:44
2006.09.17
Компонент RX 2.75


2-1156628488
vain
2006-08-27 01:41
2006.09.17
column в ListView


1-1154624425
ISK(CMEPTb)
2006-08-03 21:00
2006.09.17
Вставка объектов в текстовый редактор


3-1152273434
antoxa2005
2006-07-07 15:57
2006.09.17
FB работать ч-з ODBC+ADO или IBX?


2-1157025359
Neket
2006-08-31 15:55
2006.09.17
Скрытие программы от посторонних глаз





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский