| imho.ws |
![]() |
|
|
|
# 1 |
|
Member
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294
![]() ![]() ![]() |
Программа работает с 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;
Спасибо.
__________________
Это жжжж неспроста... |
|
|
|
|
# 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. |
|
|
|
|
# 6 | |
|
Junior Member
Регистрация: 31.03.2003
Адрес: СПб
Сообщения: 162
![]() ![]() ![]() |
В ошибке как раз и говорится, что недостаточно памяти. Её и массив может заср...ть.
Цитата:
А по поводу массива - /7y3uK тему говорит, только не забывай dispose элементам списка делать.
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981. Все "спасибо" в репутацию
|
|
|
|
|
|
# 8 |
|
Advanced Member
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498
![]() ![]() ![]() ![]() |
повторяю - тебе массив твой пакостит - тут вполне можно без него обходиться... BDE тут не при чем... не веришь - попробуй тоже самое, но через ADO сделать...
__________________
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|
|
|
|
# 11 |
|
Member
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294
![]() ![]() ![]() |
Willow
Даже не знаю... Попробовал как советовал /7y3uK. Памяти расходуется меньше, но съедается по прежнему. Как-то мне говорили, что какой-то из компонентов delphi ест память.
__________________
Это жжжж неспроста... |
|
|
|
|
# 12 |
|
Junior Member
Регистрация: 23.12.2003
Адрес: Киев
Сообщения: 118
![]() ![]() ![]() ![]() |
Думаю это поможет:
http://v.mahon.free.fr/pro/freeware/memcheck/ |
|
|
|
|
# 13 |
|
Advanced Member
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498
![]() ![]() ![]() ![]() |
хм... прямо не знаю что еще посоветовать.... делать запрос динамически перед выполнением его создавать а в конце процедуры убивать его... это раз... если не поможет - попробуй таки ADO...
__________________
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|
|
|
|
# 14 |
|
Junior Member
Регистрация: 23.12.2003
Адрес: Киев
Сообщения: 118
![]() ![]() ![]() ![]() |
Вообще с MSSQL действительно лучше работать через ADO. А что касается утечки памяти, то это здесь не причём.
В Delphi 7 я не замечал, что бы кто-то ел память, а в Delphi 6 было, но настолько не значительно, что заметно только с помощью того, что я дал в ссылке в 12 посту. |
|
|
|
|
# 15 |
|
Member
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294
![]() ![]() ![]() |
Уже не знаю где это может быть...
В какой-то версии spinedit сжирал всё, но у меня его нет. Может есть ещё какая гадость. Willow Спасибо за ссылку, почитаю.
__________________
Это жжжж неспроста... |
|
|
|
|
# 16 |
|
Advanced Member
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498
![]() ![]() ![]() ![]() |
не слышал.... вооще то патчи можно по скачивать для дельфи и заплатки всякие на VCL с офф сайта... обычно там пишут что чего и где... у меня не возьникало таких проблем ни разу если честно... правда я в основном ADO пользуюсь...
__________________
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
|
|