Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.012 c
1-98576
Аноним
2003-10-20 08:48
2003.10.30
Мышь в Pascal e


3-98502
explorer
2003-10-09 13:40
2003.10.30
Update данных


1-98564
arche
2003-10-20 10:28
2003.10.30
Как лучше написать код?


3-98470
Dim!S
2003-10-10 08:06
2003.10.30
Колонка в DBGrid


1-98716
AndreyG
2003-10-21 04:42
2003.10.30
Как добавить примечание в ячейку Excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский