Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2009, 13:51   #21
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

есть еще такая возможность убивать объекты - FreeAndNil(имя_объекта)
но формы лучше всего дестроить именно Release

если форма используется многократно, то может имеет смысл ее не убивать, а создать при первом вызове, а дальше только хайдить и при необходимости снова показывать?!
soleil@mmc вне форума Ответить с цитированием
Старый 22.03.2009, 19:32   #22
chandrasecar
Форумчанин
 
Аватар для chandrasecar
 
Регистрация: 03.10.2008
Сообщений: 180
По умолчанию

Все описанное выше - правильно. Но кто нибудь проверял диспетчером задач свое приложение, сколько оно места занимает? Понакидайте на форму, которую создаем как "доступную", побольше разных компонентов (ListView). Coздайте две кнопочки: одна будет создавать форму, другая уничтожать. Обратите внимание, сколько ваша программа занимает. Проделайте десяток процедур по созданию-уничтожению формы, и сравните занимаемую память с начальной величиной. Так что получается, что не в программе дело а в виндоусе, который не хочет сразу освобождать память. Возможно он и освобождает, но она числится как используемая.
лучший подарок женщине-программисту
chandrasecar вне форума Ответить с цитированием
Старый 22.03.2009, 21:48   #23
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

резервирование памяти...то есть винда оставляет память за приложением(а вдруг понадобится ему)...поидее если недостаток памяти она должна её перераспределить...а на практике хрен знает
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.03.2009, 11:34   #24
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Набросал небольшой тест ( на Delphi 7 )
Вложение 9817
(правда там модальная форма пока пустая - можете продолжить с разным заполнением).

Поправлю немного Antony41
Assigned(const P) - не проверяет "существует ли объект"
Цитата:
Tests for a nil (unassigned) pointer or procedural variable.
Она проверяет на Nil переменную
Код:
procedure TMainForm.actFreeCheckAssignedExecute(Sender: TObject);
var
  form: TModalDialog;
begin
  form := TModalDialog.Create(Self);
  try
    //........
  finally
    form.Free;
  end;
  CheckAssigned(form);// 'Форма существует'
  form := nil;
  CheckAssigned(form);// 'Форма НЕ существует'
end;

procedure TMainForm.CheckAssigned(Sender: TObject);
begin
  if Assigned(Sender) then
    mLogs.Lines.Add('Форма существует')
  else mLogs.Lines.Add('Форма НЕ существует');
end;
(в тесте есть кнопочка)
Или можно сделать так:
Код:
procedure TMainForm.actFreeCheckAssignedExecute(Sender: TObject);
var
  form: TModalDialog;
begin
  form := TModalDialog.Create(Self);
  form.Show;
  form := nil;
  CheckAssigned(form);// 'Форма НЕ существует'
end;
(форма живет но "потерялась" )

Далее:
- Компоненты (и думаю в менеджере памяти) используют TList, TStrings и их наследники (например Owner хранит список своих подчиненных)
А у этих объектов есть свойство Capacity, которое не уменьшается при удалении элемента.
- Некоторые присоединяемые модули (особенно компонентов-оболочек над ActiveX виндов) создают у себя объекты уничтожаемые при завершении программы.

Но в общем-то это (по моему) не должно увеличивать память каждый раз.
И недавно прочитал про AQTime (посмотрите через Google) - инструменте для обнаружения утечек памяти и не только, совместимого с Delphi, но пока не пробовал.
s.Creator вне форума Ответить с цитированием
Старый 22.07.2013, 22:28   #25
Downloads
Пользователь
 
Аватар для Downloads
 
Регистрация: 25.06.2012
Сообщений: 39
По умолчанию

что делать, если не помогает?!

Код:
begin
if Assigned(Form2) then Form2 := nil; 

 with TForm2.Create(Application) do
  try
    if ShowModal = mrOK then
      with fRect do
      begin
      if (Right > Left) and (Bottom > Top) then
      begin
        // задача
      end
      else
      begin
       // ошибка
        Exit;
      end; {If}
    end; {fRect}
  finally {ShowModal}
    Free;
  end;
end;
Downloads вне форума Ответить с цитированием
Старый 22.07.2013, 22:36   #26
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
if Assigned(Form2) then Form2 := nil;
Этот код не освободит форму. Используй FreeAndNil(Form2)
Код:
with TForm2.Create(Application) do
Этот код форму создаст, но в переменную Form2 указатель на неё не поместит. Нужно иметь ввиду, если предполагается использование в дальнейшем переменной Form2
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.07.2013, 22:55   #27
Downloads
Пользователь
 
Аватар для Downloads
 
Регистрация: 25.06.2012
Сообщений: 39
По умолчанию

Аватар, так как лучше? Уничтожение модальной формы
весь свой код я выложил (направьте)

Последний раз редактировалось Downloads; 22.07.2013 в 23:17.
Downloads вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уничтожение потока SNUPY Общие вопросы Delphi 2 11.02.2009 22:47
Автоматическое уничтожение объекта mutabor Общие вопросы Delphi 6 25.06.2008 22:25
Создание/уничтожение объектов nimf Общие вопросы Delphi 10 14.04.2008 10:54
Уничтожение окна Kashp Win Api 20 07.09.2007 14:15