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

Вниз

Проблема со свойством TForm.Visible   Найти похожие ветки 

 
Ученик   (2003-06-28 09:52) [0]

procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create("c:\test.dfm", fmCreate);
try
Stream.WriteComponent(Self)
finally
Stream.Free
end
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Stream: TFileStream;
Form2: TForm1;
begin
Stream := TFileStream.Create("c:\test.dfm", fmOpenRead);
try
Form2 := TForm1.CreateNew(Self);
try
Stream.ReadComponent(Form2);
Form2.ShowModal
finally
Form2.Free
end
finally
Stream.Free
end
end;

Сначала нажимаем на Button1, потом на Button2, ругается при Form2.ShowModal "Cannot make a visible window modal.", как решается проблема ?


 
MBo   (2003-06-28 10:03) [1]

Хм... Был же утром этот вопрос с ответом ЮЗ


 
Ученик   (2003-06-28 10:11) [2]

>MBo © (28.06.03 10:03)
Если не сложно и осталось, процитируйте


 
MBo   (2003-06-28 10:48) [3]

Увы, не сохранил. Что-то насчет Hide было


 
Юрий Зотов   (2003-06-28 10:51) [4]

Действительно, странно... исчез вопрос, а с ним и ответ. То ли глюк, то ли модераторы балуются... ну да ладно, повторим.

Причина в том, что форма сохраняется в видимом состоянии, поэтому в потоке будет сначала записано, а затем прочитано Visible = True. А в ShowModal написано:

if Visible ... then raise ...

Вот и получаем ошибку. Проверить это очень легко - если вместо Form2.ShowModal задержать выполнение Form2.Free явным способом:
while Form2.Visible do Application.ProcessMessages
то на экране все равно увидим Form2.

Ну и способ лечения тоже очевиден - перед Form2.ShowModal пишем Form2.Hide. Вот и все.


 
Ученик   (2003-06-28 11:06) [5]

>Юрий Зотов © (28.06.03 10:51)
Т.е. при определенных обстоятельствах форма будет мелкать или не будет ?


 
Юрий Зотов   (2003-06-28 11:56) [6]

> Ученик © (28.06.03 11:06)

При именно таком коде - теоретически может и мелькать, хотя практически вряд ли успеет. Во всяком случае, у меня не мелькала. Дык... а что же Вы хотите? Что записали - то и прочитали, куда от этого денешься?

Но никто же не мешает изменить код или ввести дополнительную обработку. Например, можно перекрыть Loaded и в нем выставить Visible = False. Тогда и никаких Hide не потребуется, и никаких мельканий не будет.


 
Ученик   (2003-06-28 19:57) [7]

>Юрий Зотов © (28.06.03 11:56)

>"..а что же Вы хотите?"

Что-то типо этого, не уверен был, что это самое простое решение

type
TFormAccess = class(TForm);

procedure TForm1.Button2Click(Sender: TObject);
var
Stream: TFileStream;
Form2: TForm1;
begin
Stream := TFileStream.Create("c:\test.dfm", fmOpenRead);
try
Form2 := TForm1.CreateNew(Self);
try
with TFormAccess(Form2) do begin
FFormState := FFormState + [fsCreating];
try
Stream.ReadComponent(Form2)
finally
FFormState := FFormState - [fsCreating]
end
end;
Form2.ShowModal
finally
Form2.Free
end
finally
Stream.Free
end
end;



 
Юрий Зотов   (2003-06-28 20:08) [8]

Если только ReadComponent сам не работает с флагами состояния. Нужно посмотреть по исходникам.



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

Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.009 c
7-31550
Алексей
2003-04-29 09:31
2003.07.10
Работа с чужими приложеними


7-31545
Michael_V
2003-04-21 13:39
2003.07.10
как запретить закрытие приложения по Alt+F4 и ........


14-31401
VEG
2003-06-25 13:09
2003.07.10
Нити в Си


1-31295
Smirnoff
2003-06-26 15:22
2003.07.10
Найти и заменить


3-31146
sergey32
2003-06-18 14:57
2003.07.10
Ошибка при открытии запроса через ADODataSet





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский