![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк с отображением вкладок PageControl'a [D7, XP]
dj kondakov © (2010-03-13 08:50:00)Доброго времени суток! Натолкнулся на странный глюк и не знаю, как от него избавиться.
На главной форме приложения расположен PageControl с тремя вкладками. Есть отключаемая возможность запуска в свернутом состоянии и сворачивания в трей, тоже отключаемая. Проблема вот в чем. Если включены обе возможности (то есть приложение при запуске минимизируется в трей), то при его восстановлении оттуда PageControl показывает только активную вкладку, сколько ни переключай его на другие. В других случаях (запуск просто свернутым, сворачивание в трей и восстановление при ручном запуске) все нормально.
Тексты:
Процедура восстановления приложения
procedure TForm1.RestoreMainForm;
var
i, j: integer;
begin
Application.ShowMainForm:=true;
ShowWindow(Application.Handle, SW_RESTORE);
ShowWindow(Application.MainForm.Handle, SW_RESTORE);
if not ShownOnce then begin
for I := 0 to Application.MainForm.ComponentCount -1 do
if Application.MainForm.Components[I] is TWinControl then
with Application.MainForm.Components[I] as TWinControl do
if Visible then begin
ShowWindow(Handle, SW_SHOWDEFAULT);
for J := 0 to ComponentCount -1 do
if Components[J] is TWinControl then
ShowWindow((Components[J] as TWinControl).Handle, SW_SHOWDEFAULT);
end;
ShownOnce := True;
end;
end;
Процедура сворачивания приложения
procedure TForm1.HideMainForm;
begin
Application.ShowMainForm:=false;
ShowWindow(Application.Handle, SW_HIDE);
ShowWindow(Application.MainForm.Handle, SW_HIDE);
end;
Код из файла проекта, отвечающий за сворачивание при запуске:
Application.CreateForm(TForm1, Form1);
if Form1.CheckBox2.Checked then begin
if Form1.CheckBox3.Checked then begin
Form1.HideMainForm;
Form1.CreateTrayIcon;
end else
Application.Minimize;
end;
Application.Run;
Я сам подозреваю процедуру восстановления. Но в чем проблема, понять не могу. Помогите, плиз!
dj kondakov (2010-03-13 10:33:00) [1]Мда... Закомментил цикл и заменил вызовы ShowWindow коротеньким Form1.Show;. Все заработало как надо! Ну и напишут же бред иногда в умных книжках...
Вася, спасибо!
Вася (2010-03-13 10:23:00) [2]тут какая то адская смесь из управления видимостью через свойство Visible и прямым применением API, что само по себе может привести к противоречиям, так как контролы состояние запоминают в приватном поле FVisible.
> при создании формы в свернутом состоянии все компоненты
> на ней будут невидимы, и поэтому их надо показывать каждый
> по отдельности
Это неверно.
Убери цикл по компонентам, и убери вызовы API, работай через свойства объектов
dj kondakov (2010-03-13 10:01:00) [3]Насколько я понял при чтении книги, откуда взят этот код, при создании формы в свернутом состоянии все компоненты на ней будут невидимы, и поэтому их надо показывать каждый по отдельности.
Вася (2010-03-13 09:52:00) [4]А зачем цикл по компонентам и прямой вызов API-функций в процедуре восстановления? Для чего так написано?