Как управлять памятью в TObjectDictionary в Delphi - PullRequest
1 голос
/ 04 ноября 2019

Я хочу знать, как правильно управлять памятью, когда у меня есть TObjectDictionary в Delphi.

Я хочу создать один ObjectDictionary из TShapes, чтобы рисовать круги в Timage, но положение и количествокруги меняют каждую клеточку.

Я не хочу утечек памяти. В закрытой форме я буду делать FShapes.Free, но я не уверен, что каждый раз, когда я делаю FShapes.Clear, что происходит с памятью.

Я прочитал, что я должен сделать это на OnValueNotify, ноЯ не уверен, как это сделать.

private
FShapes: TObjectDictionary<Integer, TShape>;

procedure TFRemote_Layout.FormCreate(Sender: TObject);
begin
  FShapes := TObjectDictionary<Integer, TShape>.Create([doOwnsValues]);
  FShapes.OnValueNotify := VNotify;
end;

procedure TFRemote_Layout.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FShapes.Free;
end;

procedure TFRemote_Layout.InsertShape(i, x, y: Integer);
var
  AShape: TShape;
begin
  try
    AShape := TShape.Create(nil);
    AShape.Top := x;
    AShape.Left := y;
    FShapes.Add(i, AShape);
  finally
    //Free AShape??
  end;
end;

procedure TFRemote_Layout.ClearDictionary();
begin
  FShapes.Clear; //This clear frees all the memory for the next cycle?
end;


//I was reading in embarcadero something like this, but not sure 
procedure TFRemote_Layout.VNotify(Sender: TObject; const Item: TShape; Action: TCollectionNotification);
begin
 Item.Free;
end;

1 Ответ

3 голосов
/ 04 ноября 2019

Очистка TObjectDictionary (путем вызова метода Clear) удаляет все элементы из коллекции. Владение, указанное в параметре конструктора, затем определяет, будут ли ключи и / или значения освобождены при удалении элементов.

В вашем случае, если у вас есть значения, вызов Clear освобождает всесодержащиеся TShape объекты без необходимости какого-либо дополнительного прослушивателя уведомлений (для события OnValueNotify).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...