Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.16;
Скачать: CL | DM;

Вниз

Как отловить смену контрола на форме ?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
4-52443
Sfagnum
2003-10-23 15:01
2003.12.16
Непонятки с EM_LINELENGTH в RichEdit


3-52079
_юзер_
2003-11-24 17:10
2003.12.16
и UPPER


1-52277
Michail Fedorov
2003-12-03 13:06
2003.12.16
Список шрифтов в Combobox


3-52078
alienka
2003-11-24 16:20
2003.12.16
помогите, пожалуйста, разобраться...


4-52447
Zhirnov Maxim
2003-10-23 13:30
2003.12.16
Как открыть нужный раздел в *.chm файле?