В моём приложении несколько форм.
На одной из них, вызываемой по нажатию на главной форме кнопки "Графики"
и разворачивающейся во весь экран, расположен Chart с множеством Series.
Данные для графиков берутся из простого текстового файла.
Нужно ли каждый раз по нажатию кнопки "Графики" создавать Форму, а при её закрытии
и возвращению к главной форме приложения - уничтожать? Или при закрытии её делать невидимой,
а при вызове видимой?
Работает-то, конечно и так, и сяк, но хотелось бы знать как обычно поступают в таких случаях.
Или всё зависит только от того что особо критично: занимаемая память(not Form.Visible) или время(Form.Create)?
А может ещё от чего-то?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
08-01-2008 10:24 | Комментарий к предыдущим ответам
А теперь - внимание, вопрос: "Он придерживает память от системы, чтобы отдать её кому?" :)
Чтобы отдать ее вновь создаваемому обьекту, если такое происходит сразу после разрушения предыдущего. Получается эдакий кеш свободной оперативки, который значительно ускоряет работу программы т. к. процедура получения у системы оперативы относительно продолжительная.
>>> 1. Поменять везде "должны" на "рекомендуется" :)
Нуу... Я привёл свои собственные правила, которым следую достаточно жёстко, но привёл их именно в качестве рекомендаций автору вопроса... :)
>>> 2. Приведенный код работает только для модальных форм, а это не всегда удобно.
Это понятно... Я просто хотел показать, что наличие не только глобальной, но даже и локальной переменной не является обязательным. Я не стал говорить о немодальном режиме, поскольку не хотелось слишком углубляться в дебри...
07-01-2008 18:43 | Комментарий к предыдущим ответам
я попытаюсь сформулировать несколько рекомендаций, с которыми, думаю, большинство всё-таки согласится.
Согласится можно...
Но с серьезными оговорками.
1. Поменять везде "должны" на "рекомендуется" :)
2. Приведенный код работает только для модальных форм, а это не всегда удобно.
По существу вопроса: справочную форму с графиками можно и держать в памяти и создавать при вызове, разница настолько несущественна, что это дело вкуса и стиля.
>>> Если форма вызывается часто, то лучше ее прятать а не создавать.
Не буду говорить категоричное "всё", но многое познаётся в сравнении и в условиях доведения до абсурда...
1. Если форма должна показываться и убираться 10 раз в секунду, то каждый раз её уничтожать и создавать заново было бы явным перебором...
2. Если в проекте 500 форм, то держать их все в памяти - ещё больший перебор, если не сказать больше... (говорить не буду, т.к. из слов, которые не вызовут претензий со стороны модераторов, там только предлоги :)
Тем более, что после каждого освобождения обьекта диспетчер памяти не сразу возвращает эту память системе, а выжидает некоторое время. Так что никакой экономии может и не получится.
А теперь - внимание, вопрос: "Он придерживает память от системы, чтобы отдать её кому?" :)
Или всё зависит только от того что особо критично: занимаемая память(not Form.Visible) или время(Form.Create)?
А может ещё от чего-то?
Я думаю, что основным критерием являются правила приличия, отходить от которых следует только при наличии достаточно серьёзных причин... А такие причины появляются (или, по крайней мере, должны появляться) достаточно редко... Исходя из этих правил приличия, я попытаюсь сформулировать несколько рекомендаций, с которыми, думаю, большинство всё-таки согласится.
1. В проекте должна быть только одна автосоздаваемая форма - главная. Автосоздаваемыми также могут быть дата-модули (что обычно и делается).
2. Автоматически вставляемые объявления в модулях вновь создаваемых форм вроде:
var
Form2: TForm2;
должны немедленно и безжалостно удаляться, дабы, во-первых, не было соблазна использовать глобальные переменные, а во-вторых - сразу обнаруживать факт того, что форма зачислена в автосоздаваемые (при этом будет возникать ошибка при компиляции). Отсюда - ещё одна рекомендация - сразу снять в опциях дизайнера галочку "Auto create forms & data modules". Дата-модулей обычно немного и их автосоздаваемость легко можно проставить вручную.
3. Формы должны создаваться путём вызова конструктора, а не Application.CreateForm
4. Формы должны создаваться непосредственно перед тем, как они понадобятся.
5. Формы должны уничтожаться сразу после того, как надобность в них отпала.
Хотел бы заметить, что для создания формы и работы с ней даже не обязательно объявлять переменную её типа (это которая указатель). Например, для работы в модальном режиме достаточно характерным является такой способ:
procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(Application) do
begin
//...
ShowModal;
Free;
end;
end;
P.S.
Нужно ли каждый раз по нажатию кнопки "Графики" создавать Форму, а при её закрытии и возвращению к главной форме приложения - уничтожать?
Несомненно... Если поступать иначе нет действительно серьёзных причин. Даже повторное чтение файла через короткий промежуток времени быстрее всего даже не вызовет обращения к диску, т.к. данные будут взяты из кэша.
Если форма вызывается часто, то лучше ее прятать а не создавать. Тем более, что после каждого освобождения обьекта диспетчер памяти не сразу возвращает эту память системе, а выжидает некоторое время. Так что никакой экономии может и не получится.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.