Главная страница
    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.46 MB
Время: 0.049 c
1-1219750806
_REA_
2008-08-26 15:40
2009.10.25
Word Preview


15-1250967890
@!!ex
2009-08-22 23:04
2009.10.25
Linux -это всегда OpenSource?


2-1250844434
cyber-pilot
2009-08-21 12:47
2009.10.25
Изменение объекта


1-1220967073
stas
2008-09-09 17:31
2009.10.25
Работа с функциями GetWindowLong, SetWindowLong


15-1251178540
Andy BitOff
2009-08-25 09:35
2009.10.25
Что думают знатоки по поводу такой конфигурации?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский