TObjectList Remove - wyskakuje błąd pamięci

0

Cześć, napisałem taki kawałek kodu:

type
  XStdObj = class(TObject)
  protected
    { Protected declarations }
    cloneList: TObjectList<XStdObj>;
  private
    { Private declarations }
  public
    { Public declarations }
    constructor Create;
    procedure AddToCloneList(handler: XStdObj); virtual;
  end;

implementation

  constructor XStdObj.Create;
  begin
    inherited;

    Self.isClone := False;
    Self.cloneList := TObjectList<XStdObj>.Create();
  end;

  procedure XStdObj.AddToCloneList(handler: XStdObj);
  var text: PWideChar;
  begin
    cloneList.Add(handler);
     StringToWideChar(cloneList.Count.ToString, text, 100);
     MessageBox(0, text, 'Test', 0);
    cloneList.Remove(handler);
     StringToWideChar(cloneList.Count.ToString, text, 100);
     MessageBox(0, text, 'Test', 0);;
  end;

end.

A wywołuję go tak:

procedure TForm2.Button1Click(Sender: TObject);
var x, y: XStdObj;
begin
  x := XStdObj.Create;
  y := XStdObj.Create;

  x.AddToCloneList(y);
end;

Po naciśnięciu przycisku, wyskakuje okienko z wartością jeden, a później błąd pamięci Access violation at address ...

0

P.S. To isClone miało być usunięte.

0
cloneList.Count.ToString

nie kompiluje się , i w związku z tym zmieniłem kod na poniższy, który kompiluje się i prawidłowo działa

procedure XStdObj.AddToCloneList(handler: XStdObj);
begin
  cloneList.Add(handler);
  showmessage(inttostr(cloneList.Count));
  cloneList.Remove(handler);
  showmessage(inttostr(cloneList.Count));
end;

przypuszczam że w swoim kodzie użyłeś poniższej składni

StringToWideChar(cloneList.ToString, text, 100);

i błąd jest w tylko tworzeniu komunikatu, a dokładniej w cloneList.ToString , a sama lista działa prawidłowo

0

Rozumiem, że jest to powiązane z wartością zero?

Czyżby **Count **dla zera zwracał np null?

0
Edward Nowy napisał(a):

Rozumiem, że jest to powiązane z wartością zero?

Czyżby **Count **dla zera zwracał np null?

count zwraca prawidłową wartość typu Integer, problem masz w konwersji stringa na PWideChar przy pomocy funkcji StringToWideChar

============================================
już wiem, w kodzie brakuje

new(text);

oraz do kompletu

dispose(text);
procedure XStdObj.AddToCloneList(handler: XStdObj);
var
  text: pwidechar;
begin
  New(text);
 ////
 ////
  dispose(text);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1