Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Событие выбора компонентов на форме или панели 
V
    Опции темы
Akella
  Дата 3.10.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



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

Какой был бы наиболее простой и правильный метод определения активного компонента?

Это сообщение отредактировал(а) Akella - 3.10.2010, 22:41
PM MAIL   Вверх
okkonst
Дата 3.10.2010, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: 1
Всего: 1



Смотри на события TWinControl.OnEnter, TWinControl.OnExit ("активизация" и "деактивизация" контрола, всем можно один обработчик задать), свойство TCustomForm.ActiveControl
PM MAIL   Вверх
Akella
Дата 3.10.2010, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Ты не понял вопроса.

Добавлено через 1 минуту и 17 секунд
Есть на форме 100 компонентов. Как узнать, какой из них выбрал пользователь в момент выбора? Мне что, каждому компоненту прописывать код в событии, например, OnClick?

Добавлено через 2 минуты и 10 секунд
У некоторых компонентов уже есть код в свойстве, у некоторых появится в будущем.
PM MAIL   Вверх
Akella
Дата 4.10.2010, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Всё, решил проблему. Я использую компоненты Cindy для изменения размеров и положения компонентов. Там нашёл свойство  cyResizer1.LastMouseDownControl  smile 
PM MAIL   Вверх
okkonst
Дата 4.10.2010, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: 1
Всего: 1



Цитата

Есть на форме 100 компонентов. Как узнать, какой из них выбрал пользователь в момент выбора? Мне что, каждому компоненту прописывать код в событии, например, OnClick?


Во-первых, не onClick, а OnEnter (почитай-таки справку!). Во-вторых, им ВСЕМ можно установить ОДИН обработчик (сообщающий сендера твоему инспектору). Причем, программно. 2 строчки кода...

Цитата

Я использую компоненты Cindy для изменения размеров и положения компонентов. Там нашёл свойство  cyResizer1.LastMouseDownControl


А если я, такой поганец, не мышой а TABом?
PM MAIL   Вверх
Akella
Дата 4.10.2010, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(okkonst @  4.10.2010,  00:31 Найти цитируемый пост)
Во-вторых, им ВСЕМ можно установить ОДИН обработчик (сообщающий сендера твоему инспектору). Причем, программно. 2 строчки кода...


Цитата(Akella @  3.10.2010,  23:36 Найти цитируемый пост)
У некоторых компонентов уже есть код в свойстве, у некоторых появится в будущем.

А я возьму и заменю, да?

Добавлено через 1 минуту и 21 секунду
Цитата(okkonst @  4.10.2010,  00:31 Найти цитируемый пост)
А если я, такой поганец, не мышой а TABом? 

Tab не работает.
PM MAIL   Вверх
okkonst
Дата 4.10.2010, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: 1
Всего: 1



Цитата

Цитата(okkonst @  4.10.2010,  00:31 Найти цитируемый пост)
Во-вторых, им ВСЕМ можно установить ОДИН обработчик (сообщающий сендера твоему инспектору). Причем, программно. 2 строчки кода...


Цитата(Akella @  3.10.2010,  23:36 Найти цитируемый пост)
У некоторых компонентов уже есть код в свойстве, у некоторых появится в будущем.

А я возьму и заменю, да?


А в чем проблема сохранить имеющийся обработчик, скажем, в массив, заменить своим, из которого вызвать старый? Массив структур, одно поле - контрол, второе - метод.. Но, в принципе, если проблема решена - че говорить...

Цитата

Tab не работает.


:-\ не люблю я слишком мышастые интерфейсы, с ними медленно работать...

Добавлено через 1 минуту и 26 секунд
Потом. ты не говорил про код в OnEnter, только в OnClick, который тут не нужен
PM MAIL   Вверх
Akella
Дата 4.10.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(okkonst @  4.10.2010,  01:01 Найти цитируемый пост)
:-\ не люблю я слишком мышастые интерфейсы, с ними медленно работать... 

верю, я программу не для тебя пишу smile
PM MAIL   Вверх
okkonst
Дата 4.10.2010, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: 1
Всего: 1



Цитата

верю, я программу не для тебя пишу 


smile

Но, кстати, если серьезно (и не в тему smile ) - удобная организация чисто клавиатурного ввода ускоряет работу в несколько раз. Был у меня опыт создания проги (еще под DOS) по вводу анкет, с которой можно было работать вообще без монитора. Ни разу не видел ничего, хотя-бы отдаленно приближенного по скорости работы с ней; это объясняло, почему ей пользовались около 10 лет, хотя имелись гораздо более "навороченные"
PM MAIL   Вверх
Akella
Дата 4.10.2010, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(okkonst @  4.10.2010,  01:16 Найти цитируемый пост)
Но, кстати, если серьезно (и не в тему smile ) - удобная организация чисто клавиатурного ввода ускоряет работу в несколько раз. 

Это да, но не при выборе компонента для изменения его свойств.
PM MAIL   Вверх
cat512
Дата 4.10.2010, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Если, проблема ещё актуальна, то можно использовать: Screen.ActiveControl, или Screen.ActiveForm.ActiveControl

Добавлено через 1 минуту и 34 секунды
и не надо никаких OnEnter, OnClick
PM MAIL   Вверх
Akella
Дата 4.10.2010, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Можно сказать, что актуальна.
А в каком событии? Нужно же как-то централизовано... Узнать активный элемент не сложно. А вот узнать где щёлкнул пользователь или что он выбрал с помощью Tab сложновато. Ну для меня по крайне мере.
Хотя, используя KeyPreview можно отловить нажатие на клавишу без проблем через OnKeyDown. Жаль что нет такого события для мышки.
PM MAIL   Вверх
cat512
Дата 4.10.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Application.OnMessage - цепляешь код типа:
Код

var
  Control: TWinControl;

if (Msg in [WM_KEYFIRST..WM_KEYLAST]) or (Msg in [WM_LBUTTONDOWN, WM_RBUTTONDOWN, ...etc]) then
begin
  Handled := true;
  Control := Screen.ActiveControl;
 :-)
  Inspector.EatControl(Control);

end;

Код не проверял, возможно на множествах компилятор будет ругаться. Единственное, посмотри какого типа OnMessage, и создай процедуру соотв. типа. По идее должно работать.

PM MAIL   Вверх
cat512
Дата 4.10.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Как говорится, хорошие мысли приходят позже, лучше код получения ActiveControl, 
повесить на OnIdle. Тогда не надо тебе обрабатывать сообщения. Просто пишешь 
Код

procedure   Form1.GetControl (Sender: TObject; var Done: Boolean);
var
  Control: TWinControl;
begin
//Можно оптимизировать, что бы не выполнялось часто проверять флаг, например:
//if FNeedUpdate then
//begin
  Control := Screen.ActiveControl;
  Inspector.EatControl(Control);
//end;
end;



Это сообщение отредактировал(а) cat512 - 4.10.2010, 12:23
PM MAIL   Вверх
Akella
Дата 4.10.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(cat512 @  4.10.2010,  11:48 Найти цитируемый пост)
Application.OnMessage - цепляешь код типа:

угу, я так пробовал, вроде работает smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1145 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.