Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 байта)- тогда можно так кастить


Наверх

Титульная страница Поиск, карта сайта Написать письмо