![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TStrngList.AddObject..?
Дмитрий_ © (2009-08-25 17:23:00)Столкнулся с проблемой: как в TStringList.AddObject передать значение моего типа, т.е. к примеру:
procedure TForm1.Button1Click(Sender: TObject);
type
TItem = record
A: Integer;
B: string;
C: string;
end;
var
Item: TItem;
L: TStrings;
begin
L := TStringList.Create;
try
{ ... }
L.AddObject('1', TObject(Item));
{ ... }
finally
L.Free;
end;
end;
Жорж (2009-08-25 20:31:00) [1]
> сли вместо записи передавать класс=TObject будет ли это
> правильным подходом или же использовать класс в данном случае
> будет неуместно.
>
Это нормально
Можно просто обернуть запись классом:
TMyObject = class
public
Item: TItem;
end;
var
MyObject: TMyObject ;
begin
MyObject := TMyObject.Create;
MyObject.Item.A :=2;
L.AddObject('1', MyObject);
А можно заменить запись на класс
а можно оставить запись, только выделять под нее память руками и запоминать ссылку - вариантов масса
Медвежонок Пятачок (2009-08-25 18:06:00) [2]уместно или нет - будет сильно зависеть от фаз луны и влажности воздуха.
Дмитрий_ (2009-08-25 17:54:00) [3]и еще последний вопрос: если вместо записи передавать класс=TObject будет ли это правильным подходом или же использовать класс в данном случае будет неуместно.
Сергей М. (2009-08-25 17:46:00) [4]
> почему packed?
By default, the values in a structured type are aligned on word or double-word boundaries for faster access. When you declare a structured type, you can include the reserved word packedto implement compressed data storage.
В данном случае это неактуально, но кто знает, поменяется ли у тебя структура в будущем..
Packed позволит хранить структурированные данные в компактном виде, без выравнивания полей на указанные границы, т.е. с мегьшими затратами на ресурсы памяти, но при этом может ухудшить показатели производительности доступа к невыравненным полям.
Дмитрий_ (2009-08-25 17:37:00) [5]Спасибо.
> TItem = packed record
а почему packed? потому что я явно не указываю размер для строковых полей записи?
Сергей М. (2009-08-25 17:31:00) [6]
> размер TObject (то есть 4байта)
Точнее SizeOf(Pointer)
Сергей М. (2009-08-25 17:30:00) [7]type
TItem = packedrecord
..
end;
..
L.AddObject('1', TObject(@Item));
Ухарь (2009-08-25 17:30:00) [8]размер передаваемых данных должен быть не больше, чем размер TObject (то есть 4 байта)- тогда можно так кастить