Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  00:36[Войти] | [Зарегистрироваться]
Ответ на вопрос № 58245

05-01-2008 08:21
В моём приложении несколько форм.
На одной из них, вызываемой по нажатию на главной форме кнопки "Графики"
и разворачивающейся во весь экран, расположен Chart с множеством Series.
Данные для графиков берутся из простого текстового файла.
Нужно ли каждый раз по нажатию кнопки "Графики" создавать Форму, а при её закрытии
и возвращению к главной форме приложения - уничтожать? Или при закрытии её делать невидимой,
а при вызове видимой?
Работает-то, конечно и так, и сяк, но хотелось бы знать как обычно поступают в таких случаях.
Или всё зависит только от того что особо критично: занимаемая память(not Form.Visible) или время(Form.Create)?
А может ещё от чего-то?

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

08-01-2008 10:24 | Комментарий к предыдущим ответам
А теперь - внимание, вопрос: "Он придерживает память от системы, чтобы отдать её кому?" :)
Чтобы отдать ее вновь создаваемому обьекту, если такое происходит сразу после разрушения предыдущего. Получается эдакий кеш свободной оперативки, который значительно ускоряет работу программы т. к. процедура получения у системы оперативы относительно продолжительная.

08-01-2008 03:17
>>> 1. Поменять везде "должны" на "рекомендуется" :)

Нуу... Я привёл свои собственные правила, которым следую достаточно жёстко, но привёл их именно в качестве рекомендаций автору вопроса... :)

>>> 2. Приведенный код работает только для модальных форм, а это не всегда удобно.

Это понятно... Я просто хотел показать, что наличие не только глобальной, но даже и локальной переменной не является обязательным. Я не стал говорить о немодальном режиме, поскольку не хотелось слишком углубляться в дебри...

07-01-2008 18:43 | Комментарий к предыдущим ответам
я попытаюсь сформулировать несколько рекомендаций, с которыми, думаю, большинство всё-таки согласится.
Согласится можно...
Но с серьезными оговорками.
1. Поменять везде "должны" на "рекомендуется" :)
2. Приведенный код работает только для модальных форм, а это не всегда удобно.

По существу вопроса: справочную форму с графиками можно и держать в памяти и создавать при вызове, разница настолько несущественна, что это дело вкуса и стиля.

07-01-2008 14:04
>>> Если форма вызывается часто, то лучше ее прятать а не создавать.

Не буду говорить категоричное "всё", но многое познаётся в сравнении и в условиях доведения до абсурда...
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.
Нужно ли каждый раз по нажатию кнопки "Графики" создавать Форму, а при её закрытии и возвращению к главной форме приложения - уничтожать?

Несомненно... Если поступать иначе нет действительно серьёзных причин. Даже повторное чтение файла через короткий промежуток времени быстрее всего даже не вызовет обращения к диску, т.к. данные будут взяты из кэша.

05-01-2008 13:50
Если форма вызывается часто, то лучше ее прятать а не создавать. Тем более, что после каждого освобождения обьекта диспетчер памяти не сразу возвращает эту память системе, а выжидает некоторое время. Так что никакой экономии может и не получится.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
"Мы с тобой одной крови — ты и я!". Чьи это заветные слова?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования