Главная страница
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.036 c
1-1082637756
killer
2004-04-22 16:42
2004.04.11
Столбцы в StringGrid


7-1079694074
amid
2004-03-19 14:01
2004.04.11
LPT (Windows 2000)


1-1082522563
CodVip
2004-04-21 08:42
2004.04.11
Не могу установить компонент


4-1075637281
8ung
2004-02-01 15:08
2004.04.11
Как сменить иконку у exe файла?


4-1075960900
Onyx
2004-02-05 09:01
2004.04.11
CreateProcess в Win2k