Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WM_ACTIVATE


andriy ©   (2003-09-08 13:25:00) 

У меня проблемка.
Хочу чтобы при активизации окна, активизировалась
соответствующая панель (класс TTabControl).
Для этого я написал процедуру на отловку сообщений для приложения:

procedure TfrmMain.AppOnMessage(var Msg: TMsg; var Handled: Boolean);
var Buffer: array [0..127] of Char;
begin
inherited;
GetClassName(Msg.hwnd,Buffer,SizeOf(Buffer));
if Msg.message = WM_ACTIVATE then
begin
if Buffer="TForm" then
tbcWindows.TabIndex:=tbcWindows.Tabs.IndexOfObject(TObject(Msg.hwnd));
end;
end;

Но она, конечно, не работает!
:)
В чём ошибка ламера? Или может кто подскажет иное решение проблемы?


andriy   (2003-09-11 10:33:00) [1]


> Игорь Шевченко © (09.09.03 15:43) [7]

Большое спасибо. Мне это оченьпомогло.
Я создал родительскую форму и это на нее бросил.
Работает как часики.


SergeySEM   (2003-09-10 11:18:00) [2]

Удалено модератором
Примечание: Offtopic


Игорь Шевченко   (2003-09-09 15:43:00) [3]

Раз проблема решена иным способом, зачем нужен код ? :)

Смысл следующий: объявляется сообщение
const
UM_WINDOWACTIVATED = WM_USER + 666;

в главной форме объявляется его обработчик:
type
TfrmMain = ...

private
procedure UMWindowActivated (var Message : TMessage); message UM_WINDOWACTIVATED;
....
end;

в тексте обработчика активизируется нужная панель

procedure TfrmMain.UMWindowActivated (var Message : TMessage);
begin
tbcWindows.TabIndex:=tbcWindows.Tabs.IndexOfObject(TObject(Message.wParam));
end;

В любом создаваемом окне на событие FormActivate добавляется код

PostMessage(Application.MainForm.Handle, UM_WINDOWACTIVATED, Handle, 0);

Примерно так...


andriy   (2003-09-09 15:25:00) [4]


> Hooch © (08.09.03 13:39) [1]

Большое спасибо, работает!

> Игорь Шевченко © (08.09.03 15:42) [5]

Я верю, что это работает, но уменя не выходит.
Если можно, маленький но информативный примерчик привести, пожалуйста!


Игорь Шевченко   (2003-09-08 15:42:00) [5]


> Я создаю разные окна (не MDI), тоесть делаю Show.

В создаваемом окне скажи PostMessage (tFrmMain.Handle,
WM_USER+что-то свое, Self.Handle, 0);

> а наоборот не выходит. Хочу, чтобы при активизации n-го
> окна сменивался TabIndex на "его".

А в главное форме в обработчике этого сообщения ищи TabIndex по значению wParam - IndexOfObject(TObject(Message.wParam)) и будет тебе счастье


andriy   (2003-09-08 15:37:00) [6]


> Игорь Шевченко © (08.09.03 14:49) [3]

Вы не поняли! Мне не нужно это на активизацию frmMainForm.
Я создаю разные окна (не MDI), тоесть делаю Show.
После этого создается закладка на tbcWindows (Как в Делфи компоненты размещены). Так вот, когда я делаю Change закладки, то соответсвующее окно нахожу (в Obgect заганяю Handle окна), а наоборот не выходит. Хочу, чтобы при активизации n-го окна сменивался TabIndex на "его". А ето WM_ACTIVATE что-то не канает!
Кажется описал как есть. Теперь жду ваших ответов!


Игорь Шевченко   (2003-09-08 14:49:00) [7]

ActiveControl := надо убрать, это по ошибке набилось :)


Игорь Шевченко   (2003-09-08 14:33:00) [8]

TfrmMain.OnActivate (Sender : TObject);
begin
ActiveControl := tbcWindows.TabIndex:=tbcWindows.Tabs.IndexOfObject(TObject(Handle));
end;

???


Hooch   (2003-09-08 13:39:00) [9]

можно завестится на событие Screen.OnActiveFormChange, соответсвенно Screen.ActiveForm - активная форма


Наверх

Титульная страница Поиск, карта сайта Написать письмо