Firemonkey - проблема с памятью TPopUp - PullRequest
0 голосов
/ 15 октября 2018

У меня странная проблема.У меня есть набор кнопок на панели, и я хочу показать всплывающую подсказку для каждой кнопки.Для этого я использую TPopUp, но всякий раз, когда мышь входит, я вижу, что память увеличивается для приложения.Но если я прокомментирую события ввода мыши и ухода мыши, память не увеличивается.Я что-то пропустил?

Всякий раз, когда мышь входит в кнопку, я вижу увеличение 0.3MB в моем диспетчере задач.

TfrmEncode = class(TForm)    
    pnlTop: TPanel;
    btnSaveToJSON: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnSaveToJSONMouseEnter(Sender: TObject);
    procedure btnSaveToJSONMouseLeave(Sender: TObject);
  private
    { Private declarations }
    pop : TPopup;
    cb : TColorBox;
    labelText: TLabel;
  public
    { Public declarations }
  end;

implementation

{$R *.fmx}

procedure TfrmEncode.btnSaveToJSONMouseEnter(Sender: TObject);
begin
  Pop.IsOpen := True;
end;

procedure TfrmEncode.btnSaveToJSONMouseLeave(Sender: TObject);
begin
  Pop.IsOpen := False;
end;

procedure TfrmEncode.FormCreate(Sender: TObject);
begin
  try
    pop := TPopup.Create(self);
    pop.Parent:= self;
    pop.Width:=200;

    cb := TColorBox.Create(pop);
    cb.Align := TAlignLayout.Client;
    cb.Color := TAlphaColors.White;
    pop.AddObject(cb);

    labelText := TLabel.Create(pop);
    labelText.Align  :=TAlignLayout.alClient;
    labelText.Parent := pop;
    labelText.Text := 'This is the hint This is the hint This is the hint This is the hint This is the hint This is the hint This is the hint This is the hint This is the hint This is the hint';
    pop.AddObject(labelText);

    pop.PlacementTarget := btnSaveToJSON;
    pop.Placement:=TPlacement.BottomCenter;
  finally
  end;

end;

procedure TfrmEncode.FormDestroy(Sender: TObject);
begin
  FreeAndNil(pop);
end;

1 Ответ

0 голосов
/ 16 октября 2018

В контроле TPopup есть ошибка.Сообщается как RSP-21438

TPopup, внутренне создает новый TCustomPopupForm при каждом открытии всплывающего окна.Однако эта форма не освобождается, когда всплывающее окно закрывается (как и должно быть), а только тогда, когда сам всплывающий элемент управления разрушен.

Существует несколько обходных путей

1.Создать новый элемент управления TPopup при открытии и освободить его при закрытии

2.Исправьте FMX.Controls и FMX.Forms

Ошибка может быть исправлена ​​в разделе реализации вышеуказанных модулей.Это означает, что вы можете скопировать FMX.Controls и FMX.Forms в папку вашего проекта, и Delphi будет использовать эти фиксированные единицы вместо единиц по умолчанию.

Исправить следующий код:

FMX.Controls - изменить параметр конструктора с False на True - это означает, что всплывающая форма будет автоматически освобождена при закрытии.

function TPopup.CreatePopupForm: TFmxObject;
...
    NewForm := TCustomPopupForm.Create(Self, NewStyle, PlacementTarget, True);

FMX. Формы - назначить AutoFreeпараметр в поле.

constructor TCustomPopupForm.Create(AOwner: TComponent; AStyleBook: TStyleBook = nil; APlacementTarget: TControl = nil;
  AutoFree: Boolean = True);
var
  NewStyleBook: TStyleBook;
begin
  FAutoFree := AutoFree;
....
...