Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 368

/ вопрос открыт /

Здравствуйте!
При показе или перед показом Hint кнопки на Toolbar все открытые формы уходят за главную.
Открыл все три формы. На двух из них есть ToolBar с одной кнопкой имеющей Hint. При наведении курсора мыши на кнопку в Toolbar, после вывода Hint все остальные формы становятся позади основной (Form1) и причём вывести их можно на передний план только по клику на заголовоке, а не на теле формы. Даже если на Form2 навести курсор на кнопку ToolBar, то после вывода Hint снова на переднем плане Form1. Что за баг такой? И почему при двух открытых формах (Form1, Form2) при нажатии на кнопку в Form2 при показе Form3, Form2 уходит на задний план за Form1 и Form3, Должно же быть так: поверх Form1 Form2, а поверх Form2 Form3?

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Shouldercannon Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Shouldercannon (статус: Посетитель)
Вопрос отправлен: 30 июня 2010, 14:19
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Мережников Андрей

Здравствуйте, Shouldercannon!
В DelphiWorld приведен такой пример кода (см. в приложении)

Приложение:
  1. type
  2. TForm = class(TForm)
  3. {...}
  4. protected
  5. procedure CreateParams(var Params: TCreateParams); override;
  6. end;
  7.  
  8. implementation
  9.  
  10. {...}
  11.  
  12. procedure TForm2.CreateParams(var Params: TCreateParams);
  13. begin
  14. inherited CreateParams(Params);
  15. Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  16. Params.WndParent := GetDesktopWindow;
  17. end;
  18.  


Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 30 июня 2010, 18:37


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 1 июля 2010, 13:20; участников в обсуждении: 2.
Shouldercannon

Shouldercannon (статус: Посетитель), 30 июня 2010, 18:09 [#1]:

Проблема заключалась в Params.WndParent := GetDesktopWindow;.
Убрав Params.WndParent := GetDesktopWindow; появилась новая проблема. Открыты две формы, каждая из них имеет кнопку на панели задач. Если свернуть вторую форму, то всё нормально как были две кнопки на панели задач так и остались, но если свернуть первую (основную), то на панели задач остаётся кнопка только главной формы, а второй нет. Может есть альтернатива Params.WndParent := GetDesktopWindow;, менее проблематичная?
Вадим К

Вадим К (статус: Академик), 30 июня 2010, 22:21 [#2]:

Delphi 2005 и младше?
И формы немодальные? если они не модальные, то они не могут оставаться поверх основной. Если хочется, что бы были - делайте модальными.
Галочка "подтверждения прочтения" - вселенское зло.
Shouldercannon

Shouldercannon (статус: Посетитель), 30 июня 2010, 23:15 [#3]:

Delphi 7. Не модальные. Нато и делалось, чтобы можно было открыть несколько Форм и свободно переключаться между ними.
Вадим К

Вадим К (статус: Академик), 1 июля 2010, 03:55 [#4]:

Дело в том, что в 7 делфи кнопка на панели задач это не кнопка главной формы. Это кнопка невидимого окна. Поэтому, когда ее сворачивают, то сворачивается и все другие формы. Что же делать? Попробовать в 2007 делфи и старше. Во вторых можно попробовать перепроектировать приложение (да, понимаю, это звучит дико и возможно рушит Ваши представления, но ... может там действительно плохой интерфейс?). В третьих, если нужно так, что бы три формы были независимы, но порядок соблюдался - это опять толчек к модальным формам. Если же формы "очень независимы", то может это три разных приложения? В виндовс не принято приложениям делать кнопки для всех своих окон, а просто сделать в меню "окна" список окон.
Галочка "подтверждения прочтения" - вселенское зло.
Shouldercannon

Shouldercannon (статус: Посетитель), 1 июля 2010, 13:20 [#5]:

Соблюдение парядка не требуется. CreatParams заменил на
procedure TForm2.FormCreate(Sender: TObject);
begin
  SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW);
end;
Теперь осталось решить проблему сворачивания всех форм при сворачивании основной.

P.S. А если использовать мультипоточность?

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:36
Выполнено за 0.03 сек.