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

Вниз

FormStyle - fsStayOnTop и fsNormal   Найти похожие ветки 

 
azl ©   (2006-12-21 12:00) [0]

Добрый день, глубокоуважаемые мастера. Возникла некоторая проблема. Вроде бы и детская, но что-то не могу разобраться.
Есть 2 формы. На первой форме кнопка, которая вызывает вторую форму.
procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2.ShowModal;
end;

На второй форме CheckBox и кнопка, по нажатию на которую, первой форме присваивается FormStyle.

procedure TForm2.Button1Click(Sender: TObject);
begin
 if CheckBox1.Checked then
    Form1.FormStyle := fsStayOnTop
 else
    Form1.FormStyle := fsNormal;
 Close;
end;

Так вот, если CheckBox1 отмечен птичкой, и я нажимаю на кнопку, первая форма становится поверх всех окон. Если после этого я снова вызываю вторую форму, убираю птичку и нажимаю кнопку, форма 1 все-равно остается поверх всех окон, а должна вернуться в fsNormal. Почему?
Если CheckBox поместить на первую форму и по нажатию кнопки на первой форме устанавливать FormStyle, то все работает нормально.

Как с этим бороться?
Спасибо.


 
ProgRAMmer Dimonych ©   (2006-12-21 12:09) [1]

Всё должно работать нормально. Просто StayOnTop означает, что когда активным будет делаться другое окно, StayOnTop"ное всё равно будет видно полностью. Когда Normal, то последнее окно, оказавшееся активным, будет наверху. Запусти другую программу, потом свою. Сделай StayOnTop=True, переключись на ту самую "другую программу". Теперь выключай StayOnTop и снова переключайся. Разницу видишь?


 
azl ©   (2006-12-21 13:48) [2]

Спасибо. Смысл понял. Разницу вижу. Только не пойму, какую "другую программу"?


 
azl ©   (2006-12-21 17:15) [3]

Может есть еще у кого-нибудь мысли по этому поводу?


 
ProgRAMmer Dimonych ©   (2006-12-21 22:44) [4]

> Только не пойму, какую "другую программу"?
Другую программу - это любую, которая позволит увидеть эту самую разницу. Всё работает так, как должно. Т.е. при отключённом StayOnTop окно остаётся поверх остальных потому, что оно активно.


 
Developerr ©   (2006-12-21 22:55) [5]

Ну, это понятно. Но даже если щелкаю на другом окне мое окно все-равно остается StayOnTop, вот в чем беда. Сделай этот пример и поймешь в чем дело.


 
azl ©   (2006-12-21 22:56) [6]

Вот вот. Я о том же.


 
ProgRAMmer Dimonych ©   (2006-12-21 23:00) [7]

Кхе, нифига себе. Всё сделал, скомпилировал, запустил - пашет. D7, Win98SE.

Что за программа, над которой оказывается fsNormal"ное окно? Нет ли на форме посторонних компонентов? Код, приведённый выше - полный?


 
ProgRAMmer Dimonych ©   (2006-12-21 23:01) [8]

Ой, как Вас много :)


 
azl ©   (2006-12-21 23:05) [9]

Нет никаких компонентов лишних. У меня Delphi 2006. Только что нашел выход из этой ситуации. Нужно проверять OnFormPaint первой формы, тогда работает.
А на кнопке второй формы писать просто Close;


 
azl ©   (2006-12-21 23:07) [10]

Кстати, в справке написано:
Note: It is not advisable to change FormStyle at runtime.
Т.е. не рекомендуется менять FormStyle at runtime. Интересно почему?


 
ProgRAMmer Dimonych ©   (2006-12-21 23:08) [11]

> Нужно проверять OnFormPaint первой формы, тогда работает.
> А на кнопке второй формы писать просто Close;
Поподробнее для голодающих умственно ProgRAmmer"ов Dimonych"ей можно? Интересно просто разобраться...


 
ProgRAMmer Dimonych ©   (2006-12-21 23:09) [12]

> Note: It is not advisable to change FormStyle at runtime.
> Т.е. не рекомендуется менять FormStyle at runtime. Интересно
> почему?
А Windows какая? 2000/XP?


 
ProgRAMmer Dimonych ©   (2006-12-21 23:10) [13]

Собственно, если 8-ая на 98 не запускается, то 2006 - точно под 2000/XP. В этих ОС"ях много чего нельзя и не рекомендуется. Например, отключить Ctrl+Alt+Del - висельное дело (56489 строк кода вместо 1-ой под Win98). Это, вроде как, для безопасности. Сомнительно, однако...


 
azl ©   (2006-12-21 23:20) [14]

2000 я же указал в вопросе.


 
ProgRAMmer Dimonych ©   (2006-12-22 00:10) [15]

> azl ©   (21.12.06 23:20) [14]
Тьфу, а я и не посмотрел даже... :)

Никогда этому пункту внимания не уделял, т.к. сам им не пользуюсь (можно потенциальных помощников потерять).


 
antonn (work)   (2006-12-22 13:45) [16]


> Т.е. не рекомендуется менять FormStyle at runtime. Интересно
> почему?

где-то проскакивало, что при этом форма пересоздается...


> Например, отключить Ctrl+Alt+Del - висельное дело

Потому что безопасность важнее, чем чьи то шутки. Для неадминистраторов по этой комбинации можно вывести урезанное функционально окно. А список процесссов имеет право видеть каждый пользователь.


 
MetalFan ©   (2006-12-22 15:02) [17]

смотри генофонд - SetFormStyle...
в разных версиях делфы по разному реализовано.
в 6х:
procedure TCustomForm.SetFormStyle(Value: TFormStyle);
var
 OldStyle: TFormStyle;
begin
 if FFormStyle <> Value then
 begin
   if (Value = fsMDIChild) and (Position = poDesigned) then
     Position := poDefault;
   if not (csDesigning in ComponentState) then DestroyHandle;
   OldStyle := FFormStyle;
   FFormStyle := Value;
   if ((Value = fsMDIForm) or (OldStyle = fsMDIForm)) and not Ctl3d then
     Color := NormalColor;
   if not (csDesigning in ComponentState) then UpdateControlState;
   if Value = fsMDIChild then Visible := True;
 end;
end;


в BDS2006
procedure TCustomForm.SetFormStyle(Value: TFormStyle);
const
 HWND_STYLE: array[Boolean] of HWND = (HWND_NOTOPMOST, HWND_TOPMOST);
var
 OldStyle: TFormStyle;
 LRecreate: Boolean;
begin
 if FFormStyle <> Value then
 begin
   if ((Value = fsNormal) and (FFormStyle = fsStayOnTop)) or
      ((Value = fsStayOnTop) and (FFormStyle = fsNormal)) then
   begin
     FFormStyle := Value;
     if not (csDesigning in ComponentState) and HandleAllocated then
       SetWindowPos(Handle, HWND_STYLE[FFormStyle = fsStayOnTop], 0, 0, 0, 0,
         SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOOWNERZORDER);
   end
   else
   begin
     if (Value = fsMDIChild) and (Position = poDesigned) then
       Position := poDefault;
     LRecreate := not (csDesigning in ComponentState);
     if LRecreate then
       UpdateRecreatingFlag(True);
     try
       if LRecreate then DestroyHandle;
       OldStyle := FFormStyle;
       FFormStyle := Value;
       if ((Value = fsMDIForm) or (OldStyle = fsMDIForm)) and not Ctl3d then
         Color := NormalColor;
       if LRecreate then UpdateControlState;
       if Value = fsMDIChild then Visible := True;
     finally
       if LRecreate then
         UpdateRecreatingFlag(False);
     end;
   end;
 end;
end;


в итоге всеравно вызывается
SetWindowPos
скорее всего в эту сторону стоит копать)

з.ы. проверил в D6/WinXP - такого косяка, как в [0], не наблюдается



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

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

Наверх




Память: 0.52 MB
Время: 0.07 c
6-1155736414
цыц
2006-08-16 17:53
2007.01.14
TWSocket разбор принятых пакетов


15-1166717314
kaZaNoVa
2006-12-21 19:08
2007.01.14
Чем лучше всего распознать фотки документов?


2-1166795194
DelphiLexx
2006-12-22 16:46
2007.01.14
OnCalcFields


2-1167082382
Delphi4aynik
2006-12-26 00:33
2007.01.14
Combobox


15-1166373226
Tolik
2006-12-17 19:33
2007.01.14
Защита структур и алгоритмов