Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.25;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
9-1182962956
Dib@zol
2007-06-27 20:49
2009.10.25
Многоугольник


2-1251440566
kiki
2009-08-28 10:22
2009.10.25
Как сделать рандом значения от -20 до +20?


2-1251201731
Andy BitOff
2009-08-25 16:02
2009.10.25
Почему не срабатывает ShellExecute и чем это заменить?


15-1250873584
blackman
2009-08-21 20:53
2009.10.25
Российский программист: ничего особенного


2-1251374237
cyber-pilot
2009-08-27 15:57
2009.10.25
Пропадают вкладки в PageControl е