![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с памятью [D5, dBase, FoxPro, Paradox]
nikolo © (2002-08-07 18:00:00)Друзья, помогите! Не могу занести в память больше 100-120 строкиз select. У меня есть Query в нем около 100-120 строк из таблички, в которой всего-то 2 поля. Я хочу все это хозяйство занести в память (зачем не спрашивайте). Так вот, максимум до 150 строк без проблем заносятся, но если больше (а мне надо 2000-5000), то сразу Access violation. В чем проблема?
Код следующий:
type
TRec = record
Id: Integer;
Name: String[30];
end;
TARec = array of TRec;
TPRec = ^TARec;
var
P: TPRec;
ARec: TARec;
MaxRec: Integer;
procedure TfmMain.bbDoClick(Sender: TObject);
begin
qry.Open;
SetLength(ARec, qry.RecordCount);
GetMem(P, qry.RecordCount*SizeOf(TRec)+1);
MaxRec := 0;
while Not qry.Eof do begin
Inc(MaxRec);
P^[MaxRec].Id := qry.FieldByName("Id").AsInteger;
P^[MaxRec].Name := qry.FieldByName("Name").AsString;
qry.Next;
end;
Finalize(P);
FreeMem(P);
end;
dimis (2002-08-08 08:33:00) [1]проверь чему равен qry.RecordCount
скорее всего он и равен 100-150.
Когда начинает выполняться твой код данные все еще закачиваюся с сервера.
надо сначала зафетчить запрос, а уж помом вычислять размер массива или испоьзовать динамический массив.(TStringList например если не хочется заморачиваться) или самому написать класс.
Набережных С. (2002-08-07 21:30:00) [2]Еще это, сразу не заметил:
while Not qry.Eof do begin
ARec[MaxRec].Id := qry.FieldByName("Id").AsInteger;
ARec[MaxRec].Name := qry.FieldByName("Name").AsString;
Inc(MaxRec);
qry.Next;
end;
Набережных С. (2002-08-07 21:28:00) [3]Жуть.
type
TRec = record
Id: Integer;
Name: String[30];
end;
TARec = array of TRec;
// TPRec = ^TARec;
var
// P: TPRec;
ARec: TARec;
MaxRec: Integer;
procedure TfmMain.bbDoClick(Sender: TObject);
begin
qry.Open;
SetLength(ARec, qry.RecordCount);
// GetMem(P, qry.RecordCount*SizeOf(TRec)+1);
MaxRec := 0;
while Not qry.Eof do begin
Inc(MaxRec);
ARec[MaxRec].Id := qry.FieldByName("Id").AsInteger;
ARec[MaxRec].Name := qry.FieldByName("Name").AsString;
qry.Next;
end;
// Finalize(P);
// FreeMem(P);
end;
ZrenBy (2002-08-07 19:04:00) [4]Попробуй sizeof(TARec)
3JIA9I CyKA (2002-08-07 18:59:00) [5]КУ!
nikolo (2002-08-07 18:51:00) [6]Откликнетесь!