Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

WM_ACTIVATE   Найти похожие ветки 

 
andriy   (2003-09-08 13:25) [0]

У меня проблемка.
Хочу чтобы при активизации окна, активизировалась
соответствующая панель (класс 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;

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


 
Hooch ©   (2003-09-08 13:39) [1]

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


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

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

???


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

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


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


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

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


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


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

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

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

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


 
andriy   (2003-09-09 15:25) [6]


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

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

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

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


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

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

Смысл следующий: объявляется сообщение
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);

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


 
SergeySEM ©   (2003-09-10 11:18) [8]

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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
1-41185
snake1977
2003-11-02 15:50
2003.11.13
два приложения


1-41336
Suharew
2003-10-30 22:12
2003.11.13
Командная строка


1-41599
Delphi5.01
2003-10-26 20:09
2003.11.13
Programno najat na knopku


6-41822
Rodin
2003-09-11 11:15
2003.11.13
ip by name


6-41846
TOL-12
2003-09-12 14:08
2003.11.13
Мой чат