Конференция "KOL" » Вопрос по PStrListEx
 
  • BMouradov (20.02.09 13:00) [0]
    Помогите, пожалуйста с 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). Помогите, пожалуйста.
  • Дмитрий К © (20.02.09 13:16) [1]
    procedure NewItem;
    var Item: PMyItem;
    begin
     New(Item);
     Item^ := TMyItem.Create;
     Item.sField := '123';
     List.AddObject('345', Cardinal(Item));
    end; // NewItem

  • BMouradov (20.02.09 13:29) [2]
    Спасибо, сработало!

    Если я правильно понял Ваш код, надо в деструкторе дописать:
     for i := 0 to List.Count - 1 do begin
       PMyItem(List.Objects[i]).Free;
       Dispose(PMyItem(List.Objects[i]));
     end;
  • Дмитрий К © (20.02.09 13:50) [3]
    Насколько я сам понимаю, да.
 
Конференция "KOL" » Вопрос по PStrListEx
Есть новые Нет новых   [134431   +15][b:0][p:0.001]