Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
ВнизTStrngList.AddObject..? Найти похожие ветки
← →
Дмитрий_ (2009-08-25 17:23) [0]Столкнулся с проблемой: как в 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 17:30) [1]type
TItem = packed record
..
end;
..
L.AddObject("1", TObject(@Item));
← →
Ухарь (2009-08-25 17:30) [2]размер передаваемых данных должен быть не больше, чем размер TObject (то есть 4 байта)- тогда можно так кастить
← →
Сергей М. © (2009-08-25 17:31) [3]
> размер TObject (то есть 4 байта)
Точнее SizeOf(Pointer)
← →
Дмитрий_ (2009-08-25 17:37) [4]Спасибо.
> TItem = packed record
а почему packed? потому что я явно не указываю размер для строковых полей записи?
← →
Сергей М. © (2009-08-25 17:46) [5]
> почему 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 packed to implement compressed data storage.
В данном случае это неактуально, но кто знает, поменяется ли у тебя структура в будущем..
Packed позволит хранить структурированные данные в компактном виде, без выравнивания полей на указанные границы, т.е. с мегьшими затратами на ресурсы памяти, но при этом может ухудшить показатели производительности доступа к невыравненным полям.
← →
Дмитрий_ (2009-08-25 17:54) [6]и еще последний вопрос: если вместо записи передавать класс=TObject будет ли это правильным подходом или же использовать класс в данном случае будет неуместно.
← →
Медвежонок Пятачок © (2009-08-25 18:06) [7]уместно или нет - будет сильно зависеть от фаз луны и влажности воздуха.
← →
Жорж (2009-08-25 20:31) [8]
> сли вместо записи передавать класс=TObject будет ли это
> правильным подходом или же использовать класс в данном случае
> будет неуместно.
>
Это нормально
Можно просто обернуть запись классом:
TMyObject = class
public
Item: TItem;
end;
var
MyObject: TMyObject ;
begin
MyObject := TMyObject.Create;
MyObject.Item.A :=2;
L.AddObject("1", MyObject);
А можно заменить запись на класс
а можно оставить запись, только выделять под нее память руками и запоминать ссылку - вариантов масса
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.138 c