Форум: "Основная";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];
ВнизКак отловить смену контрола на форме ? Найти похожие ветки
← →
ThreeDHead (2003-12-03 18:58) [0]При смене фокуса контрола на форме, необходимо подсветить новый контрол с фокусом, для удобства пользователей.
Как отловить смену фокуса контрола ?
WM_NEXTDLGCTL приходит, при условии, что я сам его посылаю.
← →
Семен Сорокин (2003-12-03 19:00) [1]попробуй ловить WM_SETFOCUS
← →
Vlad (2003-12-03 19:02) [2]Не проще у контролов нужный TabOrder расставить ?
← →
ThreeDHead (2003-12-03 19:38) [3]Есть форма, на ней ~20 TDBEDit"ов и им подобных ДБ-контролов.
Все эти контролы белого цвета (как и положено).
Задача: Подсветить, допустим желтым цветом, контрол с фокусом ввода ! Для того, чтобы взгляд пользователя, бросался сразу на этот контрол.
Решение: Пробежаться по всем контролам формы, если у какого-либо цвет желтый - заменить его на белый, а если контрол имеет фокус ввода - окрасить его желтым цветом. Вроде всё ОК.
Но где взять событие смены фокуса ввода ?
Не вешать же таймер на проверку ActiveControl"а, - глупо как-то выглядит :)
И ещё: Вариант с отловом событий OnEnter / OnExit этих контролов не устраивает в принципе.
Семен Сорокин
попробуй ловить WM_SETFOCUS
Так мне его самому-себе посылать что-ли ?
Vlad
Не проще у контролов нужный TabOrder расставить ?
Дело то не в TabOrder"ах.
← →
Юрий Зотов (2003-12-03 19:40) [4]Просто обработчики OnEnter/OnExit - общие для всех контролов.
type
TFriendControl = class(TControl);
procedure TForm1.AnyControlEnter(Sender: TObject);
begin
TFriendControl(Sender).Color := clBlue
end;
procedure TForm1.AnyControlExit(Sender: TObject);
begin
TFriendControl(Sender).Color := clWindow
end;
← →
ThreeDHead (2003-12-03 19:44) [5]Юрий Зотов
Просто обработчики OnEnter/OnExit - общие для всех контролов.
Повторюсь: Вариант с отловом событий OnEnter / OnExit этих контролов не устраивает в принципе.
А если контролов 100 ? А таких форм 20 ?
Нужен универсальный вариант.
← →
Тимохов (2003-12-03 19:53) [6]Что значит "не устраивает в принципе"? В чем принцип?
И что тебе мешает один и то же обработчик повесить на 100 контролов в 20 формах. При этом для форм сделать предка (для обработчиков).
← →
Юрий Зотов (2003-12-03 19:57) [7]> ThreeDHead © (03.12.03 19:44) [5]
> Вариант с отловом событий OnEnter / OnExit этих контролов не
> устраивает в принципе.
Думаю, здесь Вы ошибаетесь. Сейчас увидите, почему.
> А если контролов 100?
Хоть миллион. Я же написал - ОБЩИЙ обработчик. ОДИН для всех. Сколько бы их ни было.
> А таких форм 20?
Сделайте одну-единственную базовую форму. Отнаследуйте ее от TForm и введите в нее те 2 метода, что я привел выше. Поместите эту форму в репозиторий и все остальные Ваши формы наследуйте от нее. Хоть 20, хоть 2000. И назначайте всем контролам на этих формах ОБЩИЕ обработчики из базовой формы. Не написав больше ни одной строчки кода. И все.
> Нужен универсальный вариант.
Вот он.
← →
ThreeDHead (2003-12-03 20:13) [8]Тимохов Что значит "не устраивает в принципе"? В чем принцип?
Принцип в том, что я хочу бросить на форму компонент, и не задумываться более ни о чем. Этот компонент сам будет следить за фокусом ввода, и раскрашивать контролы которые подходят по тем или иным критериям.
Юрий Зотов
Хоть миллион. Я же написал - ОБЩИЙ обработчик. ОДИН для всех. Сколько бы их ни было.
И вот я как последний идиот буду просваивать этот обработчик всем контролам - "Хоть миллиону".
Конечно, этот процесс можно автоматизировать, но у некоторых контролов, в силу их специфики есть свои OnEnter / OnExit - а автоматизация сдесь сиграет злую шутку.
Как-бы скептически мои ответы не выглядели - я принимаю этот вариант ! И этот вариант имеет свое место.
Я ищу вариант попроще для разработчика - минимум действий - максимум эффективности.
← →
Тимохов (2003-12-03 20:14) [9]Пиши своего потомка для TEdit
← →
Тимохов (2003-12-03 20:16) [10]Вариант для разработчка (ой, не бейте любители дельфи) - не пользоваться вообще дизайн-таймом - в принципе.
Если уж очень хочется автоматизировать процесс подкраски контрола - пиши потомков.
← →
ThreeDHead (2003-12-03 20:27) [11]Тимохов
Пиши своего потомка для TEdit
Тяжелая артилерия - по воробьям.
Вариант для разработчка - не пользоваться вообще дизайн-таймом - в принципе.
Я надеюсь вы понимаете очем говорите. Т.к. никто не запрещает эти-же компоненты создавать и в рантайме.
ой, не бейте любители дельфи
По моему домен форума носит им delphimaster - и попрошу не флеймить понапрасну в этом топике - т.к. Вы уводите тему в сторону.
← →
Тимохов (2003-12-03 20:30) [12]
> Я ищу вариант попроще для разработчика - минимум действий
> - максимум эффективности
Я так понимаю, что вы хотите бросил и забыл? Если так, то компонент написать проще простого - 10 мин. от силы.
← →
Юрий Зотов (2003-12-03 21:04) [13]Ох-х-х...
:о)
Значит, так.
Делаете базовую форму, как я написал в [7]. В ней дополнительно замещаете метод Notification.
type
TBaseForm = class(TForm)
procedure AnyControlEnter(Sender: TObject);
procedure AnyControlExit(Sender: TObject);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
end;
procedure TBaseForm.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (Operation = opInsert) and (AComponent is TWinControl) then
with TWinControl(AComponent) do
begin
OnEnter := AnyControlEnter;
OnExit := AnyControlExit
end
end;
После этого Вы избавляетесь от ручного назначения обработчиков - при броске на любую форму-потомок TBaseForm любого оконного контрола обработчики будут назначаться этому контролу автоматически. Осталось только решить вопрос с тем, что у контролов на формах-потомках могут быть индивидуальные обработчики. Решается он очень просто.
Любой индивидуальный обработчик делаете и назначаете самым обычным образом - точно так же, как Вы это делали и раньше (он автоматически заместит собой обработчик, назначенный в Notification). А в самом индивидуальном обработчике, дополнительно к тому коду, который в нем уже есть, пишете единственную строку (всегда одну и ту же):
AnyControlEnter(Sender); // Для обработчиков OnEnter
AnyControlExit(Sender); // Для обработчиков OnExit
Эта строка вызовет унаследованный метод, который и перекрасит контрол. Все.
← →
Юрий Зотов (2003-12-03 21:32) [14]Забыл добавить очень важную вещь - из модуля с классом TBaseForm нужно удалить директиву $R, поместить этот модуль в design-time пакет, добавить в него стандартную процедуру Register, а в ней написать:
RegisterCustomModule(TCustomModule, TBaseForm);
← →
ThreeDHead (2003-12-03 21:52) [15]Юрий Зотов
Спасибо за исчерпывающий ответ ! Вариант с "OnEnter / OnExit" и так был ясен :) Все равно спасибо.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c