| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Фокус: " I'll be back... " |
| Автор: mrEvel 20.5.2007, 06:40 |
| Всем доброго времени суток! Во-первых, хотел выразить благодарность этому форуму, его основателям и постоянным участникам) Это один из самых лучших форумов, в котором не только быстро и по делу отвечают, но который и отличается красотой и удобством. Вот! Что-то настроение сегодня хорошее)) Теперь по делу. В моей программе есть два элемента, которые могут взять фокус - TrackBar и Memo. Когда я запускаю прогу, то автоматом фокус на себя берет TrackBar. Мне это очень резало глаз, поэтому я решил избавиться от этого дела. Почитал топик: http://forum.vingrad.ru/topic-64670.html#st_0_view_0 Сделал как там, а именно: procedure TForm1.FormCreate(Sender: TObject); begin form1.TrackBar1.ControlState:=[csFocusing]; form1.Memo1.ControlState:=[csFocusing]; end; Все замечательно, но когда переключаешься на другое приложение и обратно, то фокус появляется на TrackBar'е. Я попытался добавить эти же строчки в процедуры FormActivate, OnMouseMove (на форме и на имэйдже, которое занимает всю форму), но фокус не пропадает! Подскажите что мне сделать... |
| Автор: Snowy 20.5.2007, 11:20 |
| 1. У формы выставь ActiveControl. 2. Установи у контролов TabOrder в нужном порядке. |
| Автор: mrEvel 20.5.2007, 11:51 | ||
Сделал как ты написал. Ставил в TrackBar1.TabOrder и 0 и 1 и 2 и 354, но всё равно появляется... |
| Автор: Sunvas 20.5.2007, 13:07 |
| mrEvel, подмени оконную процедуру Тракбара и при получении сообщения активации просто передавай его дальше. |
| Автор: mrEvel 20.5.2007, 14:29 | ||
|
| Автор: Sunvas 20.5.2007, 16:53 |
| mrEvel, возьми за основу: http://forum.vingrad.ru/index.php?showtopic=150061&view=findpost&p=1125535 |
| Автор: mrEvel 20.5.2007, 19:29 | ||
Спасибо... буду ковырять. Как справлюсь с проблемой - обязательно отпишу. |
| Автор: pseud 22.5.2007, 09:48 | ||||
Если они лежат на одном "родителе" (напр., TPanel), то:
Если Memo1 лежит на Panel1, а TrackBar1 на Panel2, и Panel1 с Panel2 имеют одного "родителя", то:
и т.д. Сам проверил - все ОК. И просто в окне, и при переключении между приложениями. |
| Автор: Sunvas 22.5.2007, 14:11 | ||
pseud,
|
| Автор: Misha_White 22.5.2007, 14:18 |
| mrEvel, TabOrder меняй во время проектирования... Т.е. левой кнопкой на форме и т.д. |
| Автор: mrEvel 23.5.2007, 06:49 | ||||
Я меняю TabOrder в левой панели параметров, т.е. при проектировании... Добавлено через 13 минут и 30 секунд
По совету друга немного изменил предложенный метод обхода: procedure TForm1.FormCreate(Sender: TObject); begin OldWndproc := SetWindowLong(TrackBar1.Handle,GWL_WNDPROC,LPARAM(@NewWinProc)); ... function NewWinProc(wnd:HWND; uMsg:UINT; wParam:WPARAM; lParam:LPARAM):integer; stdcall; begin if (umsg=WM_SETFOCUS) then exit else Result := CallWindowProc(Pointer(OldWndProc),wnd,uMsg,wParam,lParam); end; Но все равно не пашет((( При переключение на другое приложение и обратно фокус появляется. Мистика) |