Hint от ToolBar выводит на передний план Form1

VCL, KOL, CLX и др. Свои компоненты
Ответить
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

30 июн 2010, 14:24

Открыл все три формы. На двух из них есть ToolBar с одной кнопкой имеющей Hint. При наведении курсора мыши на кнопку в Toolbar, после вывода Hint все остальные формы становятся позади основной (Form1) и причём вывести их можно на передний план только по клику на заголовоке, а не на теле формы. Даже если на Form2 навести курсор на кнопку ToolBar, то после вывода Hint снова на переднем плане Form1. Что за баг такой? И почему при двух открытых формах (Form1, Form2) при нажатии на кнопку в Form2 при показе Form3, Form2 уходит на задний план за Form1 и Form3, Должно же быть так: поверх Form1 Form2, а поверх Form2 Form3?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

30 июн 2010, 16:03

У тебя в Unit2 есть такой код:

Код: Выделить всё

Params.WndParent := GetDesktopWindow;
После него Form2 принадлежит десктопу и тем самым рушит правильный наследственный порядок отображения окон. Причем происходит это после показа самой формы - как только она ловит Repaint (а это происходит и при выводе хинта и при нажатии на кнопку). Желательно бы этой форме дать основное окно в качестве Parent или не менять параметр вообще
It's a long way to the top if you wanna rock'n'roll
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

30 июн 2010, 17:12

Желательно бы этой форме дать основное окно в качестве Parent или не менять параметр вообще
Прошу прощения это как?
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

30 июн 2010, 17:38

Хотя бы просто перед этой строчкой поставь // пометив ее как коментарий или удали. И тогда 99.9% все будет в норме
It's a long way to the top if you wanna rock'n'roll
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

30 июн 2010, 17:59

Убрав Params.WndParent := GetDesktopWindow; появилась новая проблема. Открыты две формы, каждая из них имеет кнопку на панели задач. Если свернуть вторую форму, то всё нормально как были две кнопки на панели задач так и остались, но если свернуть первую (основную), то на панели задач остаётся кнопка только главной формы, а второй нет.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

30 июн 2010, 22:13

Значит убирай Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW из Unit2, а лучше целиком CreateParams
It's a long way to the top if you wanna rock'n'roll
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

30 июн 2010, 23:12

Нельзя, формы должны быть как "независимые приложения".
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

30 июн 2010, 23:21

Присутствие на таскбаре не делает форму независимым приложением... ;) вообще постановка фразы некорректна, форма - это форма, а приложение - это приложение. Не надо их под одну гребенку. Значит надо начинать сначала - выяснять что вообще требуется
It's a long way to the top if you wanna rock'n'roll
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

30 июн 2010, 23:27

Все формы должны стать "свободными". Чтобы при сворачивании основной не сворачивались все остальные и чтобы каждая из форм имела кнопку на панели задач.

Пересмотрим систему. Убираем procedure CreateParams(var Params: TCreateParams); override; и переходим на
Код:

Код: Выделить всё

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

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