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

Вниз

Проблема с модальными окнами!   Найти похожие ветки 

 
kull ©   (2003-10-17 14:35) [0]

Есть главная форма, на ней кнопка, вот обработчик:

procedure TForm1.Button1Click(Sender: TObject);
begin
Sleep(20000);
Application.MessageBox("test","test",MB_OK);
end;


Если, после нажатия на эту кнопку попытаться свернуть главное окно, то после долгих усилий оно сворачивается.
Но когда появляется MessageBox, то он не модальный.
Причем это наблюдалось на WinXP и Win2000.

Если после долгой обработки чего-либо надо вывести модальное окно, то полная лажа получается.

Кто подскажет, как с этим бороться?


 
Song ©   (2003-10-17 14:46) [1]

А почему собственно окно после MessageBox() должно стать модальным ?


 
kull ©   (2003-10-17 15:09) [2]


> Song © (17.10.03 14:46) [1]

Где у меня слово "После"?

Не главное окно, а MessageBox не модальное!


 
Song ©   (2003-10-17 15:13) [3]

Читай хэлп, дорогой товарисч, там всё есть.


 
Wizard_Ex ©   (2003-10-17 15:20) [4]

Кстати, такая ерунда бывает в XP,
Такое бывает когда в XP включены визуальные стили и происходят длительные операции.
Такое впечатление диалог становиться модальным относительно чего-то другого или иногда он появляется, НО только под формой.

Как побороть не знаю


 
kull ©   (2003-10-17 15:26) [5]


> Song © (17.10.03 15:13) [3]

Или ты меня не понял "дорогой товарисч", или одно из двух.

Если не в лом, то попробуй примерчик:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Sleep(20000);//В это время пытаемся свернуть окно

//окно сообщения не модальное!
Application.MessageBox("test","test",MB_OK);
end;

end.


И ты будешь сильно удивлен...


 
Song ©   (2003-10-17 15:28) [6]

Ты мне скажи почему ты решил что в данном случае MessageBox() должен быть модельным ?


 
kull ©   (2003-10-17 15:37) [7]


> Song © (17.10.03 15:28) [6]

А если главная форма не может получить фокус пока не нажата кнопка Ok на MessageBox, и функиция MessageBox() не возвращает управления пока не нажата кнопка Ok, то какое по твоему окно сообщения?


 
Song ©   (2003-10-17 15:42) [8]

Ты не догоняешь.
А почему ты решил, что MessageBox должен быть модальнм ?

Модальным - по отношению к остальным окнам или по отношению к себе?

К остальным окнам - это когда не можешь перейти к другим окнам, в т.ч. к окнам других приложений пока не нажмёшь Ок. Модальным по отношению к себе - это когда выполнение программы не продолжится, пока не нажмёшь Ок. Какой вариант тебя интересует?
Если второй, то это получается что MessageBox() не вызывается вообще.


 
Василиск   (2003-10-17 15:44) [9]

MessageBox надо вызывать относительно формы, а не Application:

MessageBox(Form.Handle, .......);


 
kull ©   (2003-10-17 15:50) [10]


> Song © (17.10.03 15:42) [8]

Ну вот упрямые люди какие... Вы вообще заметили строку
Sleep(20000)?

Если без нее то MessageBox - почему-то модальное окно.

Я же не конкретно про MesageBox а вообще про модальные окна.

Следующий код приводит к аналогичному эффекту:

procedure TForm1.Button1Click(Sender: TObject);
begin
Sleep(20000);
With TForm1.Create(Application) do
begin
ShowModal;
Free;
end;
end;


Нус....


 
kull ©   (2003-10-17 15:52) [11]

Message Box - МОДАЛЬНОЕ ПО ОТНОШЕНИЮ К ГЛАВНОЙ ФОРМЕ ПРИЛОЖЕНИЯ (Form1 - если кто не понял).


 
kull ©   (2003-10-17 17:58) [12]

Все, решил проблему!

Василиск был близок к истине.

Просто в реализации метода Application.MessageBox в WinAPI-шную функцию MessageBox передается Application.Handle

А если вызвать
Windows.MessageBox(Handle, "test","test",0);

здесь Handle - это хэндл формы.

PS: И почему когда люди получают ярлычек мастера, они начинают думать что все знают?...


 
Mikhail ©   (2003-10-17 18:16) [13]

Ставлю всем пять :))


 
Song ©   (2003-10-19 23:03) [14]

2kull
Ну так ты бы объяснил чего да как, а то твой вопрос можно был понять, почему именно мой MessageBox и именно в этом месте программы немодален. Давно бы привёл пример с TForm и давно была бы помощь.



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

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

Наверх




Память: 0.5 MB
Время: 0.016 c
14-98874
Johnny Smith
2003-10-10 14:25
2003.10.30
Есть идея - универсальный спамер!


7-98893
Shaman
2003-08-13 14:24
2003.10.30
Как работать с ISA-шной железякой?


3-98431
Praco
2003-10-08 15:52
2003.10.30
ADO + DBF = ужасно медленно


7-98901
IGORYOK
2003-08-18 10:49
2003.10.30
Каким образом можно подсоединиться через номер к мобилке


11-98534
Фдучфтвук
2003-02-09 14:27
2003.10.30
[Delphi6] чтение секторов с дискеты