Перейти к содержанию
Fire Monkey от А до Я
  • 0

ListBoxItem.Data - под Windows все работает под Android выдает ошибку.


juppy

Вопрос

Всем привет!

Помогите пожалуйста разобраться. Проблема следующая:

Есть структура:

type
  PTreeItem = ^TTreeItem;
  TTreeItem = record
     FType:integer; // 0 - Group, 1 - Item
     FCode: String;
     FParent: String;
     FDescription: string;
     FChildCount: string;
     FExpanded:boolean;
     FTradeMark:string;
     FBUOM:string;
     FUPP:Double;
  end;

Мне нужно ее сохранить в LisBox-е, чтобы обрабатывать вместе с итемеми лисбокса

 

Есть вот такая конструкция при заполнении листбокса:

var

  TreeItem:PTreeItem;
  LBI:TListBoxItem;
 

begin

      New(TreeItem);
      TreeItem.FType := 0;
      TreeItem.FCode := ClientDataSet1.FieldByName('CategoryNo').AsString;
      TreeItem.FParent := ClientDataSet1.FieldByName('ParentCategoryNo').AsString;
      TreeItem.FDescription := ClientDataSet1.FieldByName('Description').AsString;
      TreeItem.FExpanded := false;
      TreeItem.FChildCount := ClientModule1.ClientDataSet1.FieldByName('ChildCount').AsString;

      LBI := TListBoxItem.Create(self);
      LBI.Data := TObject(TreeItem);    <<<<<<------------------------- вот здесь под Android вылетает ошибка.
      LBI.Text := TreeItem.FDescription;
      LBI.Parent := lbItemTree;

Помогите разобраться что я делаю не так?

Ошибка: Access violation at address....

 

 

 

Изменено пользователем juppy
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Под андроид идет опция AUTOREFCOUNT - все объекты имеют счетчик ссылок...
любое присваивание - это +/- ссылки, даже Free не честное:
procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;
т.е. Free ничего не делает!!!  - экземпляр остается в зомбирежиме (ты его убил а оно ходит) пока счетчик до 0 не до тикает.
TObject(TreeItem);  - пытается найти методы подсчета ссылок (Это же объект!) и не находит т.к. это не объект вовсе.
TTreeItem = record меняем на TTreeItem = class, честно создаем и не забываем убить, хотя под AUTOREFCOUNT - оно само должно помереть если циклической ссылочности нет.

Изменено пользователем Slym
Ссылка на комментарий
  • 0

Добавлю. Убить - это в данном случае именно Free. Для Windows это нужно, для ARC - не помешает. Кроме того, идет большая работа по отказу от ARC, чем кончится - неизвестно

Нужно добиваться, чтобы работали встроенные механизмы. Если вы разрушите объект явно через DisposeOf, то в конце концов и система тоже пойдет его удалять, и вы схватите AV

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...