来自delphi xe8的未知内存泄漏

时间:2016-03-07 07:35:16

标签: delphi memory-leaks firemonkey delphi-xe8

我在Tform1表单上创建了一个带有按钮的简单应用程序,用于创建另一个表单Tform2。 Form2包含一个工具栏,每个角上有2个按钮,下面有一个带tabcontrol的标签。我一直在下面记得这个内存泄漏。我确定我正确地创建和销毁了表格。

Screenshot of error

program Project1;

uses
  System.StartUpCopy,
  FMX.Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
   ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

这是创建form2的form1

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
        Hide;
        Application.CreateForm(TForm2, Form2);
        Form2.Show;
        Form2.WindowState := TWindowState.wsMaximized;
end;

end.

表单2,带有工具栏和tabcontrol

Form2 layout pic

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.TabControl, FMX.Controls.Presentation;

type
  TForm2 = class(TForm)
    ToolBar1: TToolBar;
    Button1: TButton;
    TabControl1: TTabControl;
    TabItem1: TTabItem;
    TabItem2: TTabItem;
    Label1: TLabel;
    Button2: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
  // ShowMessage('Form Freed now closing whole application') ;
  Application.MainForm.Close;
end;

end.

1 个答案:

答案 0 :(得分:1)

正如我在评论中所说,我无法使用您显示的代码重现内存泄漏报告。但也许你正在追逐错误的鹅,所以我会冒险尝试一下。

你从未解释过为什么要以{1}}的方式对待你,但我有一种奇怪的感觉,它可能是一种登录形式。如果是这种情况,我会按如下方式进行:

Project1.dpr

Form1

请注意,使用program Project1; uses System.StartUpCopy, FMX.Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}, System.UITypes; // for the modal result {$R *.res} begin ReportMemoryLeaksOnShutdown := True; Application.Initialize; Form1 := TForm1.Create(Application); try if Form1.ShowModal <> System.UITypes.mrOK then Exit; finally Form1.Free; end; Application.CreateForm(TForm2, Form2); Application.Run; end. 创建的Form1 。 原因是使用Application.CreateForm创建的 first 表单成为应用程序的主要形式,关闭它将关闭应用程序。相反,我们让主要用户界面所在的Application.CreateForm成为主要表单,以便我们可以释放Form2,这是登录后不需要的。

现在我们还需要设置登录表单(Form1)的模态结果(但是你想让它更安全):

Form1

请告诉我这是不是你要找的东西,我会删除。