Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Важное событие

4.2K
04 ноября 2003 года
Zahar
12 / / 01.11.2003
Нет повода выпить господа тут нет.
Проблема такая - э хочу чтоб при нежатии "O" у меня Менялся ButtonRadio

Но не писать же у каждого компанета OnKeyPress{func();}
Как сделать чтоб сразу у всех компанентов на форме вызывалась func() при KeyPress?
371
05 ноября 2003 года
Non_prog
193 / / 20.03.2000
Цитата:
Originally posted by Zahar
Нет повода выпить господа тут нет.
Проблема такая - э хочу чтоб при нежатии "O" у меня Менялся ButtonRadio

Но не писать же у каждого компанета OnKeyPress{func();}
Как сделать чтоб сразу у всех компанентов на форме вызывалась func() при KeyPress?


Опиши собитие OnKeyPress1 для одного элемента, а другим в это событие поставь вызов OnKeyPress1.
:)

293
05 ноября 2003 года
SEDEGOFF
586 / / 06.10.2002
А еще лучше используй ActionList
4.2K
05 ноября 2003 года
Zahar
12 / / 01.11.2003
2Non_prog
Ну это не преемлемо и глупа.
даже если не рукми а в цикле события вешать.

2SEDEGOFF поподробнее пожалуйста
460
05 ноября 2003 года
Berg
261 / / 27.03.2003
Цитата:
Originally posted by Zahar
2Non_prog
Ну это не преемлемо и глупа.
даже если не рукми а в цикле события вешать.

2SEDEGOFF поподробнее пожалуйста



2Zahar:
Сам дурак, если вопрос нормально задать не можешь...

Может быть тебе нужно Application->OnMessage или hook, речь о котором идет в соседнем посте? :-)

4.2K
05 ноября 2003 года
Zahar
12 / / 01.11.2003
2Berg зато я не хамил никому!!!!

Из вопроса:
Zahar:
Цитата:
Но не писать же у каждого компанета OnKeyPress{func();}


Non_prog:

Цитата:
Опиши собитие OnKeyPress1 для одного элемента, а другим в это событие поставь вызов OnKeyPress1.


^
|
Одно и тоже.

460
05 ноября 2003 года
Berg
261 / / 27.03.2003
Цитата:
Originally posted by Zahar
2Berg зато я не хамил никому!!!!


А это "Ну это не преемлемо и глупа." что?
Впрочем, я тоже еще не хамил...:-)

Цитата:
Originally posted by Zahar

Из вопроса:
Zahar:
Non_prog:
^
|
Одно и тоже.



Если написание обработчиков по числу компонент формы vs написать один обработчик, а остальным компонентам присвоить его адрес - это одно и то же, тогда - ДА.

4.2K
05 ноября 2003 года
Zahar
12 / / 01.11.2003
А про дурака?

Впринцепе одно и тоже всеровно коряво и долго - компонентов то не 10 и нет 50 даже - минимум 100 кликов.
362
06 ноября 2003 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by Zahar
А про дурака?

Впринцепе одно и тоже всеровно коряво и долго - компонентов то не 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);
}

4.2K
06 ноября 2003 года
Zahar
12 / / 01.11.2003
Вот способ к которому я пришел

for (int y=0;y<5;y++)
{
TEdit *edit = (TEdit*)FindComponent("Edit"+AnsiString(y));
edit->Text = "asd";
}

Но как орканиховать перехватчик событий? Без hook-а и DLL?
293
07 ноября 2003 года
SEDEGOFF
586 / / 06.10.2002
Кидаешь на форму ActionList
Создаешь там событие = настаиваешь событие и пишешь код
назначаешь событие все компонентам которым надо

Вот например я сделал так
Создал два события первое _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();
}

В результате переключение фокуса между компонентами осуществляеться стрелками
5.6K
11 ноября 2003 года
C3PO2
3 / / 11.11.2003
Это называется Superclassing

Принцип его следующий - каждый стандартный контрол Edit, Radiom имеет процедуру обработки событий - т.к. это автономный класс, процедура при создании этого контрола - стандартная, Windows её понимает. Далее с помощью функции GetClassInfoEx ты получаешь адрес процедуры, которая отвечает за обработку событий для стандартного контрола. Этой процедуре сваливаются ВСЕ события которые приходят от Windows. Ты запомниаешь адрес этой процедуры.

В коде программы у тебя есть свой обработчик событий (процедура), своя функция обработки событий. Ты записываешь адрес своей процедуры в то места где в классе записан адрес стандартного обработчика.

Итак теперь контрол, когда ему приходят события вызывают твою функцию обработки событий.

Всем стандартным элементам, надо при создании изменять процедуру обработки событий на свою.

Алгоритм работы своей процедуры обработки событий - простой, она скажем отлавливает нажатие клавиши Esc, и реагирует одинаково. Все события которые она не поддерживает она посылает обрабатывать стандартной процедуре обработки, адрес которой мы предварительно запомнили с помощью CallWindowProc


Не надо забывать что borland это wrapper к API

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

И вообще это универсальный и простой метод, один раз организовава свою программу таким образом ты можешь обрабатывать события от всех контролов в одной процедуре :-) если это нужно.

Таким же образом можно сделать чтобы у тебя скажем Edit воспринимал только цифры, ты переорпделяешь его стандартную процедуру, когда приходит события нажатия клваишы ты смотришь - если это цифра то ты вызываешь стандартный обработчик контрола если это буква то ты не вызываешь её. Эффект создается такой что буквы не вводятся.

Например маски все в Builder сделаны именно так.
Это называется Subclassing.

Я написал это для справки, тем кто ищет промышленных решений ;-)
6.0K
07 декабря 2003 года
Mitzn
5 / / 06.12.2003
а не проще все контролы сделать в массиве? а затем в единственной, для всех которые в массиве, процедуре написать то что тебе нужно.
по моему очень даже просто
у меня есть прога с 16х3 элементами, так я их в массив запихал и написал одной процедурой всё, а в ней есть парочка нужных ветвлений и всё
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог