我在Tform1表单上创建了一个带有按钮的简单应用程序,用于创建另一个表单Tform2。 Form2包含一个工具栏,每个角上有2个按钮,下面有一个带tabcontrol的标签。我一直在下面记得这个内存泄漏。我确定我正确地创建和销毁了表格。
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
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.
答案 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
请告诉我这是不是你要找的东西,我会删除。