![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблемы с модальной формой
Эли © (2005-03-05 09:10:00)try Form5:=TForm5.Create(Self); except end;
Form5.ShowModal;
try Form5.Destroy; except end;
.......
После открытия модальной формы, юзер выбирает опции, что запоминаются в глобальных переменных.
Что-то тут не так? Почему второй раз не удается создать форму? Почему после закрытия приложения после этой процедуры Виндоуз докладывает об ошибках? Третий день с багом разобраться не могу!
HSolo (2005-03-05 11:10:00) [1]>evvcom © (05.03.05 10:36) [6]
>если внутри with приличный кусок кода с множеством пропертей и т.п., то я не использую with
Я тоже. Но в вопросе значится код, который именно "настолько прост", что "можно и так сделать"
evvcom (2005-03-05 10:36:00) [2]
> HSolo © (05.03.05 10:24) [5]
> with TForm5.Create(self) do
Если код настолько прост, то можно и так сделать. Но если внутри with приличный кусок кода с множеством пропертей и т.п., то я не использую with по нескольким причинам:
1. Код сложнее читать, начинаешь путаться а к какому объекту относится эта проперть (особенно, если эти with каскадно наставлены)
2. В редакторе под отладчиком уже не посмотришь значение этой проперти простым наведением мыши.
3. Собственно от этого with мы ничего не экономим. Компилятор все равно в стеке выделяет 4 байта для созданного объекта и кладет туда результат работы конструктора.
Возможно, это не полный список недостатков, а вот достоинств этого вообще придумать не могу.
HSolo (2005-03-05 10:24:00) [3]with TForm5.Create(self) do
try
ShowModal;
finally
Free;
end;
XP (2005-03-05 09:43:00) [4]Попробуйте:
var
ModForm: TForm5;
begin
ModForm := TForm5.Create(Self);
try
ModForm.ShowModal;
finally
ModForm.Free;
end;
end;
Хотя, это телепатия какая-то.
evvcom (2005-03-05 09:39:00) [5]Ошибка локализована? Если закомментарить от Create до Destroy ошибка исчезает?
Create в try здесь помещать не надо затем, чтобы, если возникнет там исключение, то не работать с несуществующим объектом Form5. Если уж какие-то исключения могут возникнуть при работе с классом, то пишут примерно так:
MyObject := TMyObject.Create(AOwner);
try
MyObject.MyMethod; // Здесь может быть exception
finally
MyObject.Free;
end;
Эли (2005-03-05 09:30:00) [6]а Free ничего не меняет - я и это пробовал
и try except ничего не меняет - просто еще более странным оказывается поведение программы при закрытии приложения
evvcom (2005-03-05 09:17:00) [7]Сам то понял, что написал?
Зачем Form5:=TForm5.Create(Self); в try заключил? Т.е. пытаться работать непонятно с чем, если вдруг конструктор отработал с исключением? Отсюда и баги.
И вообще-то принято вызывать не деструктор напрямую, а Free.