juppy Опубликовано 5 августа, 2019 Поделиться Опубликовано 5 августа, 2019 (изменено) Всем привет! Помогите пожалуйста разобраться. Проблема следующая: Есть структура: 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.... Изменено 5 августа, 2019 пользователем juppy Цитата Ссылка на комментарий
0 Slym Опубликовано 6 августа, 2019 Поделиться Опубликовано 6 августа, 2019 (изменено) Под андроид идет опция 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 - оно само должно помереть если циклической ссылочности нет. Изменено 6 августа, 2019 пользователем Slym qz5 и Евгений Корепов 2 Цитата Ссылка на комментарий
0 krapotkin Опубликовано 6 августа, 2019 Поделиться Опубликовано 6 августа, 2019 Добавлю. Убить - это в данном случае именно Free. Для Windows это нужно, для ARC - не помешает. Кроме того, идет большая работа по отказу от ARC, чем кончится - неизвестно Нужно добиваться, чтобы работали встроенные механизмы. Если вы разрушите объект явно через DisposeOf, то в конце концов и система тоже пойдет его удалять, и вы схватите AV qz5 1 Цитата Ссылка на комментарий
0 juppy Опубликовано 6 августа, 2019 Автор Поделиться Опубликовано 6 августа, 2019 Ребят, спасибо огромное!!!! Все получилось. Цитата Ссылка на комментарий
Вопрос
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....
Ссылка на комментарий
3 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.