| imho.ws | 
|  |   | 
|  08.05.2005, 18:34 | # 1 | 
| Member Регистрация: 03.07.2003 Адрес: Voronezh, RussiaПол: Male 
					Сообщения: 294
				    |  Delphi. Программа постепенно сжирает всю память. 
			
			Программа работает с MSSQL через BDE. Используются TDataBase, TQuery. Подозреваю вот эту процедурку(выполняется неоднократно): Код: procedure TMainForm.GetShortcuts;
var
  i:integer;
begin
  //Чистим иконки
  ShortcutIcons.Clear;
  //Получаем установленные ярлычки
  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Add('SELECT a.AppName, a.AppDescription, ca.AppPath FROM T_Clients_Apps as ca, T_Applications as a WHERE ((ca.App_ID=a.App_ID) AND (ca.ClientNumber='+IntToStr(CompNum)+')) order by a.AppName');
  //Пихаем в массив
  Query.Open;
  SetLength(Shortcuts,0);
  i:=0;
  Query.First;
  while (not Query.Eof) do
  begin
    SetLength(Shortcuts, Length(Shortcuts)+1);
    Shortcuts[i].Name:=Query.FieldByName('AppName').AsString;
    Shortcuts[i].Path:=Query.FieldByName('AppPath').AsString;
    Shortcuts[i].Description:=Query.FieldByName('AppDescription').AsString;
    inc(i);
    Query.Next;
  end;
  //Перерисовываем
  for i:=0 to High(Shortcuts) do
  begin
    GetIcon(Shortcuts[i].Path, 0, ShortcutIcons);
    VShortcuts.AddItem(Shortcuts[i].Name,nil);
    VShortcuts.Items[VShortcuts.Items.Count-1].ImageIndex:=i;
  end;
  VShortcuts.Refresh;
end;Shortcuts - TShortcuts. ShortcutIcons - TImageList. Код: TPrice = array of record
    TimeStart, TimeEnd: TDateTime;
    Price30, Price60, Price90, Price120, PriceInf: Real;
  end;
  TShortcuts = array of record
    ID : Integer;
    Name: string;
    Path: string;
    Description: string;
    Comp: integer;
    Price: TPrice;
  end;Спасибо. 
				__________________ Это жжжж неспроста... | 
|   | 
|  09.05.2005, 20:02 | # 2 | 
| Advanced Member Регистрация: 09.03.2004 Адрес: толстозадая Москва 
					Сообщения: 498
				     | 
			
			а какие симптомы у больного? .... edited: пардон... не заметил, по поводу массива... ну ессесно он будет у тебя жрать памяти... тыж в динамический массив засовываешь стринги из запроса... а там небось записей тыщ 10... а если не 10к, то на каждый вызов процедуры ты реалок памяти для массива делаешь, так что если записей мало, но процедура вызывается очень часто, то это вот как раз и есть  Можно по советовать сделать массив не динамический а статический с каким-нить заранее известным и большим размером - он хоть и будет память жрать, зато не будет так систему напрягать постоянными реалоками... а зачем ты еще раз запихиваешь данные из запроса в массив? если уж приперло именно в массив писать - можно поступить вот так: Код: PShortcut = ^TShortcuts;
TShortcuts = record
    ID : Integer;
    Name: string;
    Path: string;
    Description: string;
    Comp: integer;
    Price: TPrice;
end;
и хранить только указатели...
чтото типа 
var
p: PShortcut;
list : TList;
...
в процессе итерирования
p := new (PShortcut);
заполняем поля...
list.add(p);
а итерироваться лучше вот так
while (Query.FindNext)
  begin
    ....
    тут мы уже стоим на следующей строке и можем прямо сразу брать нужное и запыхивать куда нада... массив тут не нужен ИМХО
  end;
				__________________ В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах Последний раз редактировалось /7y3uK; 10.05.2005 в 02:12. | 
|   | 
|  10.05.2005, 22:27 | # 6 | |
| Junior Member Регистрация: 31.03.2003 Адрес: СПб 
					Сообщения: 162
				    | 
			
			В ошибке как раз и говорится, что недостаточно памяти. Её и массив может заср...ть. Цитата: 
 А по поводу массива - /7y3uK тему говорит, только не забывай dispose элементам списка делать. 
				__________________ 640Kbytes should be enough for everything! (c) Bill Gates, 1981. Все "спасибо" в репутацию   | |
|   | 
|  11.05.2005, 12:32 | # 8 | 
| Advanced Member Регистрация: 09.03.2004 Адрес: толстозадая Москва 
					Сообщения: 498
				     |     повторяю - тебе массив твой пакостит - тут вполне можно без него обходиться... BDE тут не при чем... не веришь - попробуй тоже самое, но через ADO сделать... 
				__________________ В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах | 
|   | 
|  15.05.2005, 20:40 | # 11 | 
| Member Регистрация: 03.07.2003 Адрес: Voronezh, RussiaПол: Male 
					Сообщения: 294
				    | 
			
			Willow Даже не знаю... Попробовал как советовал /7y3uK. Памяти расходуется меньше, но съедается по прежнему. Как-то мне говорили, что какой-то из компонентов delphi ест память. 
				__________________ Это жжжж неспроста... | 
|   | 
|  16.05.2005, 01:06 | # 12 | 
| Junior Member Регистрация: 23.12.2003 Адрес: Киев 
					Сообщения: 118
				     | 
			
			Думаю это поможет: http://v.mahon.free.fr/pro/freeware/memcheck/ | 
|   | 
|  16.05.2005, 20:24 | # 13 | 
| Advanced Member Регистрация: 09.03.2004 Адрес: толстозадая Москва 
					Сообщения: 498
				     | 
			
			хм... прямо не знаю что еще посоветовать.... делать запрос динамически перед выполнением его создавать а в конце процедуры убивать его... это раз... если не поможет - попробуй таки ADO...
		 
				__________________ В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах | 
|   | 
|  17.05.2005, 01:38 | # 14 | 
| Junior Member Регистрация: 23.12.2003 Адрес: Киев 
					Сообщения: 118
				     | 
			
			Вообще с MSSQL действительно лучше работать через ADO. А что касается утечки памяти, то это здесь не причём. В Delphi 7 я не замечал, что бы кто-то ел память, а в Delphi 6 было, но настолько не значительно, что заметно только с помощью того, что я дал в ссылке в 12 посту. | 
|   | 
|  18.05.2005, 01:57 | # 15 | 
| Member Регистрация: 03.07.2003 Адрес: Voronezh, RussiaПол: Male 
					Сообщения: 294
				    | 
			
			Уже не знаю где это может быть... В какой-то версии spinedit сжирал всё, но у меня его нет. Может есть ещё какая гадость. Willow Спасибо за ссылку, почитаю. 
				__________________ Это жжжж неспроста... | 
|   | 
|  18.05.2005, 14:56 | # 16 | 
| Advanced Member Регистрация: 09.03.2004 Адрес: толстозадая Москва 
					Сообщения: 498
				     | 
			
			не слышал.... вооще то патчи можно по скачивать для дельфи и заплатки всякие на VCL с офф сайта... обычно там пишут что чего и где... у меня не возьникало таких проблем ни разу если честно... правда я в основном ADO пользуюсь...
		 
				__________________ В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах | 
|   |