Вниз
Скачать: 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.029 c
3-1079020318
Дмитрий 2004
2004-03-11 18:51
2004.04.11
Распечатка нескольких значений строк в DBGrid


14-1082131239
Soft
2004-04-16 20:00
2004.04.11
Синдром выгорания как результат обыденных стрессов.


1-1082538504
M@X
2004-04-21 13:08
2004.04.11
Адресация порта Longint ?? Как?


6-1076129800
@ac
2004-02-07 07:56
2004.04.11
Как запретить TWebBrowser щелкать при переходе по ссылкам, и вооб


11-1068245737
nsvi
2003-11-08 01:55
2004.04.11
Вопросы по ToolBar




   Наверх