-
Помогите, пожалуйста с PStrListEx. Пытаюсь добавить в него объекты, унаследованные от TObject, и ничего не получается. Вот максимально упрощённый код:
program A; uses KOL;
type PMyItem = ^TMyItem; TMyItem = class public sField: string; end;
var List: PStrListEx;
procedure NewItem; var Item: TMyItem; begin Item := TMyItem.Create; Item.sField := '123'; List.AddObject('345', Cardinal(@Item)); end; // NewItem
begin List := NewStrListEx; NewItem; ShowMessage(PMyItem(List.Objects[0]).sField); end.
На последней строке возникает ошибка. Пробовал и PMyItem^, и Cardinal(Item), и всё равно не получается. Эксперимент показал, что, видимо, дело в том, что Item - локальная переменная, и после выхода из процедуры она освобождается. Но как правильно переписать приведенный фрагмент, так и не смог понять. (Желательно обойтись без замены TObject на PObj). Помогите, пожалуйста.
-
procedure NewItem;
var Item: PMyItem;
begin
New(Item);
Item^ := TMyItem.Create;
Item.sField := '123';
List.AddObject('345', Cardinal(Item));
end;
-
Спасибо, сработало!
Если я правильно понял Ваш код, надо в деструкторе дописать: for i := 0 to List.Count - 1 do begin PMyItem(List.Objects[i]).Free; Dispose(PMyItem(List.Objects[i])); end;
-
Насколько я сам понимаю, да.
|