Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-52059
aVast
2003-11-21 15:32
2003.12.16
Виснет IBServer.


3-52093
V-A-V
2003-11-24 11:57
2003.12.16
Где взять MySQL ?


1-52170
DimaK
2003-12-03 15:54
2003.12.16
RichEdit


3-52094
Bless
2003-11-24 12:25
2003.12.16
Как посмотреть какие есть локальные переменные?


6-52331
Виноградов Алексей
2003-10-21 20:42
2003.12.16
Блокирующий tserversocket-не генерятся события отключения клиента





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский