Вниз
Скачать: CL | DM;

Использование TStrnLst.Objects   Найти похожие ветки [i]

 
YT   (2004-03-22 04:49) [0]

Мастера подскажите такой момент. Мне нужно записывать дополнительную информацию(число)
в одно из свойств TStringList в конкретном случае чтобы не писать свое свойство с
типом Byte(что то типа Tag) выбрано свойство Objects(пример ниже),
так вот вопрос в записи использованной
ниже FStList.Objects[I]:=TObject(I); что будет находится реально в памяти, т.е.
сколько памяти будет выделено для каждого Iго числа(как для типа Byte или же более),
и еще при использовании данного свойства для хранения числа память как либо
необходимо освобождать или нет имеется в виду до уничтожения самого TStringList.
Написал сумбурно но думаю вы меня поняли.
var
 Form1: TForm1;
 FStList:TStringList;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
I:Byte;
begin
If  FStList=nil Then FStList:=TStringList.Create;
for I:=0 To 100 Do begin
FStList.Add(IntToStr(I));
FStList.Objects[I]:=TObject(I);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
I:Byte;
begin
If  FStList<>nil Then
for I:=0 To 100 Do
Caption:=Caption+IntToStr(Byte(FStList.Objects[I]));
end;


 
Юрий Зотов ©   (2004-03-22 05:43) [1]

1. Код верный, но в первом методе проще использовать AddObject, а во втором безопаснее Count-1.

2. Objects[i] - это дополнительное поле, связанное с i-строкой по индексу. Размер этого поля определяется размером указателя и в Win32 составляет 4 байта. В Вашем варианте можно считать, что это массив целых чисел, элементы которого автоматически добавляются и уничтожаются, когда добавляются и уничтожаются строки.

3. Отсюда вытекают ответы на Ваши вопросы:

> что будет находится реально в памяти

Число. В Вашем случае (в 16-ричном виде) - 000000XX, где XX - значение I. Правда, платформа i86 проинвертирует порядок байт и поэтому реально в памяти будет сидеть XX000000, но в данном случае нам этого учитывать не нужно.

> сколько памяти будет выделено для каждого Iго числа

Столько, сколько требуется для хранения указателя. То есть, 4 байта.

> память как либо необходимо освобождать или нет

Не надо.


 
Defunct ©   (2004-03-22 05:47) [2]

> procedure TForm1.Button1Click(Sender: TObject);
> ...
> FStList.Objects[I]:=TObject(I);

> procedure TForm1.Button2Click(Sender: TObject);
> ...
> Caption:=Caption+IntToStr(Byte(FStList.Objects[I]));

Вы присваюваете ссылке значение байта..
Будет занимать 4 байта на каждый байт. По сути вы используете поле Objects как массив, где каждый элемент занимает статически 4 байта (накая дополнительная память не выделяется, соответственно и освобождать нечего).


 
YT   (2004-03-22 07:20) [3]

Спасибо.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.027 c
14-1079296999
Gero
2004-03-14 23:43
2004.04.11
Написание Shell


14-1078597165
Marser
2004-03-06 21:19
2004.04.11
Только что Луну рассматривал в трубу


3-1081428440
Mishenka
2004-04-08 16:47
2004.04.11
Поле типа Memo?


1-1082618636
Alex*
2004-04-22 11:23
2004.04.11
Как превести в PWideChar или как работает функция StringToWideCh


14-1081925575
Мараканец
2004-04-14 10:52
2004.04.11
Блокировка данных....




   Наверх