Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Уход модальных форм на задний план


Sam Stone ©   (2006-12-25 19:10:00) 

Немного корявенькое название, но все же ) Периодически вылезает такой глюк - модальная формочка или ShowMessage "проваливается" за форму. Возникает предположительно при больших тормозах компа в общем (пример: нажатие на кнопку б1 на форме Ф1 вызывает модальное окно Ф2. Нажимаем на кнопку и тут же тыкаем по Ф1 и при наличии тормозов модальная форма может уйти "назад", в результате Ф1 задисейблена и ничего сделать нельзя), и если программа чего-нибудь много считает :). Вытащить форму/сообщение можно альт-табом на другую программу - по возвращении модал.форма вылезает наверх. Собсна как бы такой гадости избежать?


Sam Stone   (2006-12-28 14:04:00) [1]

> [13] easy ©   (28.12.06 12:43)

это получается надо делать PostMessage перед ShowMessage?


easy   (2006-12-28 12:43:00) [2]

возможно, так вылечится -
procedure TForm1.msgBoxShow(var msg: TMessage);
var
 msgbHandle: HWND;
begin
 msgbHandle := GetActiveWindow;
 if msgbHandle <> 0 then
   SetForegroundWindow(msgbHandle);
end;


easy   (2006-12-28 12:42:00) [3]

воспроизведение глюка
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
const
WM_MSGBOX  = WM_USER + 1;
type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
   procedure msgBoxShow(var msg: TMessage); message WM_MSGBOX;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 PostMessage(handle, WM_MSGBOX, 0, 0);
 showmessage('modal');
end;

procedure TForm1.msgBoxShow(var msg: TMessage);
begin
 SetForegroundWindow(handle);
end;

end.


Yozch1   (2006-12-27 22:02:00) [4]

+1
Мдас,  тоже хотелось бы просечь в чем-таки фишка....


Sam Stone   (2006-12-27 18:45:00) [5]

> [7] EvChul ©   (27.12.06 11:39)

Ага...
Заказчик: а че это форма недоступна/где диалоговое окошко?
Программист: да это глюк, модальная форма провалилась, вы альт-табнитесь на другое окно, потом обратно - и вам будет счастье.


Правильный Вася   (2006-12-27 15:24:00) [6]

cr3at0r   (27.12.06 14:46) [8]
И где ты это вопхнешь в MessageDlg?


cr3at0r   (2006-12-27 14:46:00) [7]

Не проверял, но думается должно помочь


procedure TfrmModal.FormShow(Sender: TObject);
begin
   BringToFront;
end;  


EvChul   (2006-12-27 11:39:00) [8]

> [6] Darvin ©   (27.12.06 10:59)

Зачем перезапуск? Alt + Tab и все дела.


Darvin   (2006-12-27 10:59:00) [9]

Иногда бывает такое. Обычно перезапуск программы спасает.


EvChul   (2006-12-27 09:55:00) [10]

Вдобавок, похоже, что в момент глюка, поверх этих форм должно находится окно другого приложения. Глюк редкий и трудновоспроизводимый.

Кац предлагает сдаться (с)


ors_archangel   (2006-12-26 19:32:00) [11]

Не получилось повторить, но может

 enabled := false;
 showmessage('modal');
 enabled := true;

поможет, скажите, если да


Sam Stone   (2006-12-26 18:46:00) [12]

коллективным разумом на работе решили, что это багоглюка вцл ) Но лечить все-таки надо )


novill   (2006-12-26 16:30:00) [13]

+1
похоже никто не знает (


Правильный Вася   (2006-12-26 15:27:00) [14]

у меня та же фигня
как ее бороть?


Наверх

Титульная страница Поиск, карта сайта Написать письмо