Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > ShowWindow: не отображаются компоненты на форме


Автор: MyasNick 18.2.2009, 19:08
Довольно странная проблема: показываю форму (fsStayOnTop, bsNone) функцией 

 ShowWindow(frmForm.Handle, SW_SHOWNOACTIVATE);
 UpdateWindow(frmForm.Handle);

когда форма появляется, на ней не видно ни одного компонента, созданного в дизайнтайм, кроме шейп и бевел. Не отображаются ни панели, ни кнопки ни все остальное. Если сделать frmForm.Show все нормально. Подскажите, пожалуйста, куда копать.

Автор: MetalFan 18.2.2009, 19:56
а нельзя так с VCL контролами и формами поступать. они этого не простят)
хочешь WinApi - пиши окно на WinApi

Автор: MyasNick 18.2.2009, 20:24
Спасибо за такой подробный и содержательный ответ! ;)

Не то чтобы я сильно хотел голый WinAPI (если бы хотел, не пользовался бы Delphi), просто я не знаю другого способа показать окно не активируя его, кроме упомянутого ShowWindow в связке с  SW_SHOWNOACTIVATE. Если знаете, поделитесь, пожалуйста.

Автор: MetalFan 18.2.2009, 22:32
а если сначала вызывать Show (чтобы корректно отработала VCL часть) а потом ShowWindow с нужными параметрами?

Автор: bems 18.2.2009, 22:37
попробуй 
Код

RedrawWindow(frmForm.Handle,nil,0,RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN)

Автор: MyasNick 24.2.2009, 16:45
Цитата(MetalFan @ 18.2.2009,  22:32)
а если сначала вызывать Show (чтобы корректно отработала VCL часть) а потом ShowWindow с нужными параметрами?

Да, я сейчас так и делаю: Width/Height в ноль, затем Show и сразу Hide. Не красиво, конечно, но после этого ShowWindow работает нормально.

Добавлено через 49 секунд
Цитата(bems @ 18.2.2009,  22:37)
попробуй 
Код

RedrawWindow(frmForm.Handle,nil,0,RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN)

Спасибо, но, к сожалению, не помогает.

Автор: Rrader 24.2.2009, 18:03
Код

ShowWindow(frmForm.Handle, SW_SHOWNOACTIVATE);
frmForm.Visible := True;

Автор: MyasNick 24.2.2009, 18:24
Цитата(Rrader @ 24.2.2009,  18:03)
Код

ShowWindow(frmForm.Handle, SW_SHOWNOACTIVATE);
frmForm.Visible := True;

Все гениальное просто!
Помогло, спасибо большое.

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