Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 (на форме и на имэйдже, которое занимает всю форму), но фокус не пропадает!

Подскажите что мне сделать...  smile 


Автор: Snowy 20.5.2007, 11:20
1. У формы выставь ActiveControl.
2. Установи у контролов TabOrder в нужном порядке.

Автор: mrEvel 20.5.2007, 11:51
Цитата(Snowy @ 20.5.2007,  11:20)
1. У формы выставь ActiveControl.
2. Установи у контролов TabOrder в нужном порядке.

Сделал как ты написал. Ставил в TrackBar1.TabOrder и 0 и 1 и 2 и 354, но всё равно появляется... smile 

Автор: Sunvas 20.5.2007, 13:07
mrEvel, подмени оконную процедуру Тракбара и при получении сообщения активации просто передавай его дальше.

Автор: mrEvel 20.5.2007, 14:29
Цитата(Sunvas @ 20.5.2007,  13:07)
mrEvel, подмени оконную процедуру Тракбара и при получении сообщения активации просто передавай его дальше.

 smile   smile 

Автор: 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
Цитата(Sunvas @ 20.5.2007,  16:53)
mrEvel, возьми за основу: http://forum.vingrad.ru/index.php?showtopic=150061&view=findpost&p=1125535

Спасибо... буду ковырять. Как справлюсь с проблемой - обязательно отпишу.

Автор: pseud 22.5.2007, 09:48
Если они лежат на одном "родителе" (напр., TPanel), то:
Код

Memo1.TabOrder := 0;
TrackBar1.TabOrder := 1;


Если Memo1 лежит на Panel1, а TrackBar1 на Panel2, и Panel1 с Panel2 имеют одного "родителя", то:
Код

Panel1.TabOrder := 0;
Panel2.TabOrder := 1;


и т.д.
Сам проверил - все ОК. И просто в окне, и при переключении между приложениями.

Автор: Sunvas 22.5.2007, 14:11
pseud, 
Цитата(mrEvel @  20.5.2007,  11:51 Найти цитируемый пост)
 Ставил в TrackBar1.TabOrder и 0 и 1 и 2 и 354, но всё равно появляется... 



Автор: Misha_White 22.5.2007, 14:18
mrEvel, 
TabOrder меняй во время проектирования... Т.е. левой кнопкой на форме и т.д.

Автор: mrEvel 23.5.2007, 06:49
Цитата(Misha_White @ 22.5.2007,  14:18)
mrEvel, 
TabOrder меняй во время проектирования... Т.е. левой кнопкой на форме и т.д.

Я меняю TabOrder в левой панели параметров, т.е. при проектировании...

Добавлено через 13 минут и 30 секунд
Цитата(Sunvas @ 20.5.2007,  16:53)
mrEvel, возьми за основу: http://forum.vingrad.ru/index.php?showtopic=150061&view=findpost&p=1125535

По совету друга немного изменил предложенный метод обхода:

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;


Но все равно не пашет(((   При переключение на другое приложение и обратно фокус появляется. Мистика)

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