Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как узнать у кого был фокус


Автор: ShadeSt 9.8.2005, 14:19
На форме есть несколько TEdit'ов, в какой-то момент времени один из них получает фокус, можно ли узнать какой компонент на форме был активным до него?
Можно в событии OnExit запоминать Sender'а, а есть ли какой нибудь другой способ??

Автор: AntonSaburov 9.8.2005, 14:30
Посмотри свойство ActiveControl - и тебе будет счастье.

Автор: ShadeSt 9.8.2005, 15:05
ActiveControl - содержит элемент, который в данный момент имеет фокус. А мне хотелось бы узнать у кого был фокус до него.
т.е. например. на форме два edit'a один из них активен, нажимаем таб, переходим в следующий (например в editNN), в событии OnEnter ( editNNEnter(Sender...) ) хотелось бы знать от кого пришел фокус.

Автор: Snowy 9.8.2005, 15:10
Для этого заведи себе глобальную переменную - указатель.
А в OnEnter и проверяй.
Если он nil, значит первый.
Если нет, то имеешь указатель.
После этого сразу присваивай указателю себя.

Автор: Girder 9.8.2005, 15:18
WM_SETFOCUS

Автор: ShadeSt 9.8.2005, 15:18
В том то и дело что сейчас так и работает, просто почему-то кажется что это неправильно как-то и хотелось узнать есть ли др. способы.

Автор: Snowy 9.8.2005, 15:27
Цитата(ShadeSt @ 9.8.2005, 15:18)
В том то и дело что сейчас так и работает, просто почему-то кажется что это неправильно как-то и хотелось узнать есть ли др. способы.

Другие способы есть, но, думаю, этот самый логичный.
Если только ты не делаешь отдельный OnEnter для каждого едита.

Автор: ShadeSt 9.8.2005, 15:32
Для всех Edit'ов один обработчик. А другие способы это только сообщениями windows?

Автор: Snowy 9.8.2005, 15:52
Вот способ еще проще:
На OnExit можно узнать:
Form.ActiveControl - контрол, который стал активен.
Sender - контрол, который был активен до этого.

Автор: Song 9.8.2005, 22:34
Код
FindNextControl(ActiveControl,False,True,False);

Автор: p0s0l 9.8.2005, 22:43
Song, фокус передаваться может не только по порядку TabOrder-ов... Например, если щелкнули мышкой по какому-либо контролу...

Автор: Song 9.8.2005, 23:21
:yes:

Тогда только запоминать предыдущий TWinControl

Автор: Romikgy 10.8.2005, 09:57
WM_ACTIVATE
fActive = LOWORD(wParam); // activation flag
fMinimized = (BOOL) HIWORD(wParam); // minimized flag
hwndPrevious = (HWND) lParam; // window handle

hwndPrevious

Value of lParam. Identifies the window being activated or deactivated, depending on the value of the fActive parameter. If the value of fActive is WA_INACTIVE, hwndPrevious is the handle of the window being activated. If the value of fActive is WA_ACTIVE or WA_CLICKACTIVE, hwndPrevious is the handle of the window being deactivated. This handle can be NULL.

Кажется это должно те подойти smile

Автор: Snowy 10.8.2005, 10:00
Цитата(Romikgy @ 10.8.2005, 09:57)
WM_ACTIVATE

А это здесь причем?
Здесь вот:
Цитата(Girder @ 9.8.2005, 15:18)
WM_SETFOCUS

Цитата(Romikgy @ 10.8.2005, 09:57)
Кажется это должно те подойти

Нет.

Автор: Romikgy 10.8.2005, 10:07
А разве при получении фокуса окно не становиться активным?

Автор: Snowy 10.8.2005, 10:13
Цитата(Romikgy @ 10.8.2005, 10:07)
А разве при получении фокуса окно не становиться активным?

Окно да. Но речь о Едитах.

Автор: Romikgy 10.8.2005, 11:10
Цитата(Snowy @ 9.8.2005, 15:10)
Для этого заведи себе глобальную переменную - указатель.
А в OnEnter и проверяй.
Если он nil, значит первый.
Если нет, то имеешь указатель.
После этого сразу присваивай указателю себя.

Можно делать тоже только перехватывая wm_setfocus smile

Автор: Snowy 10.8.2005, 11:26
Цитата(Romikgy @ 10.8.2005, 11:10)
Можно делать тоже только перехватывая wm_setfocus

Можно. Как вариант...
Однако с запоминанием более просто.
К тому же без запоминания мы не узнаем какой был последний едит, если фокус был передан не едиту.
Пример:
Фокус на едит1.
Перешли на едит2 - был едит1
Перешли на Едит4 - был едит2
Перешли на Мемо1
Перешли на Едит3 - был едит4.
Вот тут без запоминания едит3 никогда не узнает, что до него был едит4

Автор: ShadeSt 10.8.2005, 16:10
Всем спасибо. Буду запоминать у кого был фокус и не заморачиваться.

Автор: Romikgy 10.8.2005, 16:26
Цитата(Snowy @ 10.8.2005, 10:13)
Окно да. Но речь о Едитах.

Я могу и ошибатся, но насколько я знаю , либой контрол является окном smile

Автор: Song 11.8.2005, 09:04
Смотря что понимать под словом "контрол".

Автор: Rennigth 11.8.2005, 09:09
Romikgy
тотже TLabel не окно.

Автор: Romikgy 11.8.2005, 16:21
Цитата(Song @ 11.8.2005, 09:04)
Смотря что понимать под словом "контрол".

Уточняю все классы типа TWinControl smile
Добавлено @ 16:24
Цитата(Rennigth @ 11.8.2005, 09:09)
тотже TLabel не окно.

Да это не окно , это картинка /производная от класс TGraphicControl = class(TControl)
/, а спрашивали про эдит smile

Автор: Song 11.8.2005, 16:28
Ну я под контролами например понимаю любой элемент интерфейса. Так что...
Добавлено @ 16:28
в котором что-то вводится или выводится

Автор: Romikgy 12.8.2005, 08:29
Цитата(Song @ 11.8.2005, 16:28)
Ну я под контролами например понимаю любой элемент интерфейса. Так что...
Добавлено @ 16:28
в котором что-то вводится или выводится

Софистикой будем заниматся smile
Или тему обсуждать ? smile

Автор: Song 12.8.2005, 11:23
Я имел ввиду, что нет никакого исключающего правила на слово "контрол", поэтому говорить
Цитата(Romikgy @ 10.8.2005, 17:26)
либой контрол является окном

по меньшей мере неправильно. Или добавить "в моём понимании".

Автор: Romikgy 12.8.2005, 12:25
Извени , забыл добавить
Цитата(Song @ 12.8.2005, 11:23)
"в моём понимании".

smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)