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

Вниз

Проблема со свойством 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
1-31348
Vint_XXX
2003-06-27 10:29
2003.07.10
ListView


6-31377
LOX
2003-05-04 08:42
2003.07.10
У IE есть журнал а как это замутить в TWebBrowser?


1-31237
region
2003-06-29 15:34
2003.07.10
List index out of bounds ...


1-31203
Dream
2003-06-28 12:43
2003.07.10
проблемы с memo ( смешно конечно но я по моему уже гоню )


1-31276
alxx
2003-06-26 13:37
2003.07.10
Фокус.