Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: 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 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.041 c
8-1076153125
FOZI
2004-02-07 14:25
2004.04.11
Пересечение полигонов (наложение многоугольников)


1-1082562482
Ivolg
2004-04-21 19:48
2004.04.11
Изобоажение


1-1080234637
__test__
2004-03-25 20:10
2004.04.11
Движение картинки по координатам (круг)


1-1079952301
dimon_programmer
2004-03-22 13:45
2004.04.11
Указали на динамические массивы


3-1081423941
AlexPal
2004-04-08 15:32
2004.04.11
Проблемы с Русским шрифтом