Форум: "Основная";
Текущий архив: 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.007 c