![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 - активная форма