Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.47 MB
Время: 0.057 c
15-1250985135
DillerXX
2009-08-23 03:52
2009.10.25
Не пойму с поведением SQL


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


15-1250752659
Павел Калугин
2009-08-20 11:17
2009.10.25
Методика тестирования програмного обеспечения


15-1251061394
syte_ser78
2009-08-24 01:03
2009.10.25
программы как в сериале "Сеть"


2-1251020827
EXEcER
2009-08-23 13:47
2009.10.25
Рэндом в Label





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский