Форум: "WinAPI";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.033 c