Важное событие
Проблема такая - э хочу чтоб при нежатии "O" у меня Менялся ButtonRadio
Но не писать же у каждого компанета OnKeyPress{func();}
Как сделать чтоб сразу у всех компанентов на форме вызывалась func() при KeyPress?
Нет повода выпить господа тут нет.
Проблема такая - э хочу чтоб при нежатии "O" у меня Менялся ButtonRadio
Но не писать же у каждого компанета OnKeyPress{func();}
Как сделать чтоб сразу у всех компанентов на форме вызывалась func() при KeyPress?
Опиши собитие OnKeyPress1 для одного элемента, а другим в это событие поставь вызов OnKeyPress1.
:)
Ну это не преемлемо и глупа.
даже если не рукми а в цикле события вешать.
2SEDEGOFF поподробнее пожалуйста
2Non_prog
Ну это не преемлемо и глупа.
даже если не рукми а в цикле события вешать.
2SEDEGOFF поподробнее пожалуйста
2Zahar:
Сам дурак, если вопрос нормально задать не можешь...
Может быть тебе нужно Application->OnMessage или hook, речь о котором идет в соседнем посте? :-)
Из вопроса:
Zahar:
Non_prog:
^
|
Одно и тоже.
2Berg зато я не хамил никому!!!!
А это "Ну это не преемлемо и глупа." что?
Впрочем, я тоже еще не хамил...:-)
Из вопроса:
Zahar:
Non_prog:
^
|
Одно и тоже.
Если написание обработчиков по числу компонент формы vs написать один обработчик, а остальным компонентам присвоить его адрес - это одно и то же, тогда - ДА.
Впринцепе одно и тоже всеровно коряво и долго - компонентов то не 10 и нет 50 даже - минимум 100 кликов.
А про дурака?
Впринцепе одно и тоже всеровно коряво и долго - компонентов то не 10 и нет 50 даже - минимум 100 кликов.
По-моему тебе заняться нечем, если ты сто компонентов долбишь на форму из среды. Такое количество обычно (у меня по крайней мере :-)) создается динамически в несколько строк кода. А в коде уже каждому созданному компоненту присваеваешь одно и тоже событие OnClick (нужно одно и тоже, я правильно понял)
for(int i - 0; i < 1000000000; i++)
{
TRadioButton *rb = new...
rb->OnClick = rbOnClick...
rb->Tag = i;
}
void __fastcall rnOnClick(TObject *Sender)
{
MessageBox(0, String(((TControl*)Sender)->Tag).c_str(), "Я кнопка по номером таким-то", 0);
}
for (int y=0;y<5;y++)
{
TEdit *edit = (TEdit*)FindComponent("Edit"+AnsiString(y));
edit->Text = "asd";
}
Но как орканиховать перехватчик событий? Без hook-а и DLL?
Создаешь там событие = настаиваешь событие и пишешь код
назначаешь событие все компонентам которым надо
Вот например я сделал так
Создал два события первое _UP и второе _DOWN
назначил соответственно горячие клавиши VK_UP и VK_DOWN и создал обработчики
void __fastcall TForm70::_UPExecute(TObject *Sender)
{
FindNextControl(ActiveControl,false,true,false)->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm70::_DOWNExecute(TObject *Sender)
{
calculate((TObject *)ActiveControl);//
//это те дейсвия которые должны выполняться при переключении фокуса
FindNextControl(ActiveControl,true,true,false)->SetFocus();
}
В результате переключение фокуса между компонентами осуществляеться стрелками
Принцип его следующий - каждый стандартный контрол Edit, Radiom имеет процедуру обработки событий - т.к. это автономный класс, процедура при создании этого контрола - стандартная, Windows её понимает. Далее с помощью функции GetClassInfoEx ты получаешь адрес процедуры, которая отвечает за обработку событий для стандартного контрола. Этой процедуре сваливаются ВСЕ события которые приходят от Windows. Ты запомниаешь адрес этой процедуры.
В коде программы у тебя есть свой обработчик событий (процедура), своя функция обработки событий. Ты записываешь адрес своей процедуры в то места где в классе записан адрес стандартного обработчика.
Итак теперь контрол, когда ему приходят события вызывают твою функцию обработки событий.
Всем стандартным элементам, надо при создании изменять процедуру обработки событий на свою.
Алгоритм работы своей процедуры обработки событий - простой, она скажем отлавливает нажатие клавиши Esc, и реагирует одинаково. Все события которые она не поддерживает она посылает обрабатывать стандартной процедуре обработки, адрес которой мы предварительно запомнили с помощью CallWindowProc
Не надо забывать что borland это wrapper к API
Я думаю что он предоставляет более простые способы. Но, если бы ты содавал программу на masm32 то пришлось бы делать именно так.
И вообще это универсальный и простой метод, один раз организовава свою программу таким образом ты можешь обрабатывать события от всех контролов в одной процедуре :-) если это нужно.
Таким же образом можно сделать чтобы у тебя скажем Edit воспринимал только цифры, ты переорпделяешь его стандартную процедуру, когда приходит события нажатия клваишы ты смотришь - если это цифра то ты вызываешь стандартный обработчик контрола если это буква то ты не вызываешь её. Эффект создается такой что буквы не вводятся.
Например маски все в Builder сделаны именно так.
Это называется Subclassing.
Я написал это для справки, тем кто ищет промышленных решений ;-)
по моему очень даже просто
у меня есть прога с 16х3 элементами, так я их в массив запихал и написал одной процедурой всё, а в ней есть парочка нужных ветвлений и всё