Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос о выделении памяти для программы, Что собственно происходит? 
V
    Опции темы
AlexLogos
Дата 16.3.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



Уважаемые форумчане, есто у меня вопрос теоретический и не очень критический, но Бог его знает, где может аукнуться.
Так вот пишу некую програмулину для работы с базой данных. Ну и как заведено в таких случаях програмулина эта позволяет ввод данных в базу. И че-то мне захотелось чтоб она подстраивалась под количество полей таблицы с которой работает, а таблиц много... Ввод буду производить последствием запроса Insert к базе (не надо мне в форум по базам, это предисловие). Так как в таблицах есть поля которые будет заполнять математика программы то нужно выводить на форму только те Edit'и которые будет заполнять пользователь. И вот я подумал что не плохо было бы записать те поля которые требуют ввода в ini-файл и соответственно читать и создавать их оттуда.

Так вот, я создал рекорд и масив этих рекордов типа:
Код

type RTableField = record
     Lab:TLabel;
     Ed:TEdit;
     field_name:string[20];
     description:string[50];
     field_type:string[20];
end;
 

И вот я пишу процеруру которая собственно малюет Лейблы и Едиты там где мне надо:
Код

procedure TableInputForm(InputParent:TWinControl; Section:string);
var
sections:TStringList;
st:string;
res:widestring;
i,p:cardinal;
begin
 try
// ShowMessage(inttostr(AllocMemSize));
  IniFile:=TIniFile.Create(ExtractFilePath(paramstr(0))+'ini\setup.ini');
  with IniFile do
   begin
    if SectionExists(Section+'_OUT') then
     begin
      try
       sections:=TStringList.Create;
       ReadSectionValues(Section+'_OUT',sections);
       SetLength(TableFields,sections.Count);
     //  res:='';
       InputParent.Height:=25*sections.Count+80;
       for i:=0 to sections.Count-1 do
        begin
         st:=sections.Strings[i];
         p:=pos('=',st);
         TableFields[i].field_name:=copy(st,1,p-1);
         TableFields[i].Ed:=TEdit.Create(InputParent);
         TableFields[i].Ed.Name:=TableFields[i].field_name;
         TableFields[i].Ed.Width:=100;
         TableFields[i].Ed.Height:=20;
         TableFields[i].Ed.Text:=IntToStr(i);
         TableFields[i].Ed.Left:=200;
         TableFields[i].Ed.Top:=25*(i+2);
         TableFields[i].Ed.Parent:=InputParent;
         TableFields[i].Ed.Visible:=true;

         delete(st,1,p);
         p:=pos('^',st);
         TableFields[i].description:=copy(st,1,p-1);
         TableFields[i].Lab:=TLabel.Create(InputParent);
         TableFields[i].Lab.Name:='Lab_'+TableFields[i].field_name;
         TableFields[i].Lab.Width:=150;
         TableFields[i].Lab.Height:=20;
         TableFields[i].Lab.Caption:=TableFields[i].description;
         TableFields[i].Lab.Left:=30;
         TableFields[i].Lab.Top:=25*(i+2);
         TableFields[i].Lab.Parent:=InputParent;
         TableFields[i].Lab.Visible:=true;

         TableFields[i].field_type:=copy(st,p+1,Length(st)-(p));
       //  res:=res+'"'+ TableFields[i].name+'"'+TableFields[i].description+'"'+TableFields[i].field_type+chr(13)+chr(10);
        end;

      finally
      sections.Free;
     //  ShowMessage(res);
      end;
     end;
   end;
 finally
  IniFile.Free;
 end;
end;
 

Все отлично работает - выводит на экран (где суть вопроса?! (летят тапки...))

Пришел момент освободить форму ввода для одной таблицы и намалевать ее для другой, и я пишу процедуру
Код

procedure TableInputFormNil;
var ArrParent:TWinControl;
i:cardinal;
begin
//ShowMessage(inttostr(AllocMemSize));
if Length(TableFields)>0 then
 begin
  ArrParent:=TableFields[0].Ed.Parent;
  for i := 0 to Length(TableFields) - 1 do
   begin
    ArrParent.FindComponent(TableFields[i].Ed.Name).Free;
    ArrParent.FindComponent(TableFields[i].Lab.Name).Free;
    TableFields[i].field_name:='';
    TableFields[i].description:='';
    TableFields[i].field_type:='';
   end;
  Finalize(TableFields);
 end;
ShowMessage(inttostr(AllocMemSize));
end;


Собственно ничего особенного не происходит - форма очищается. Ни ошибок ни вылетаний, все окай. НО! Смотрю я в диспетчер задач и что я вижу: нажимаю я на создания формы - прога забирает память, нажимаю на кнопку очистки - отдает. Все казалось бы неплохо, но каждый раз при создании формы прога забирает на 8-16 больше (в зависимости от сеанса), и меньше отдает, короче растет мое дите))) Я как бы этого не планировал. Ладно она сейчас забирает 5-7Мб (тоже не ясно почему такой разброс), но потом когда проект вырастет где взять памяти на его апетиты(купить не предлагать)? 

Что я не так сделал, куда девается память, какие принципы ее выделения? Я уже прошу извенения, знаю что тема по памяти очень обширна, поэтому хотелось бы получить краткую консультацию по вопросу правильного убиения созданных мною обьектов. Заранее спасибо. 
PM MAIL   Вверх
RomanEEP
Дата 16.3.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



Тема памяти для прикладных программ сводится только к двум процедурам ДатьПамять() и УдалитьПамять()
И их количество вызовов по завершению программы должно быть одинаково. Для автоматизации проверки этого условия для Delphi есть отличный менеджер памяти FastMM кот к тому же свободен от проблем фрагментации памяти.

Еще не понял такого финта ушами
Код

   ArrParent.FindComponent(TableFields[i].Ed.Name).Free;
    ArrParent.FindComponent(TableFields[i].Lab.Name).Free;

почему нельзя
Код

  TableFields[i].Ed.Free;
  TableFields[i].Lab.Free;

а еще гораздо лучше RTableField сделать классом, кот сам уничтожает объекты метка и едит. А вместо массива рекордов использовать TObjectList
И немного философский вопрос - зачем создавать столько компонентов, когда можно использовать StringGrid?
PM MAIL   Вверх
CodeMonkey
Дата 17.3.2010, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89





--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
AlexLogos
Дата 17.3.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



Спасибо, товарищи.
Цитата

Бывалый

И немного философский вопрос - зачем создавать столько компонентов, когда можно использовать StringGrid?

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

Классная статья, Эксперт.

Это сообщение отредактировал(а) AlexLogos - 17.3.2010, 10:25
PM MAIL   Вверх
AlexLogos
Дата 17.3.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 23.4.2009

Репутация: нет
Всего: 1



Всем спасибо. Тема закрыта.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.