如何在主TForm上创建(当我想显示它时)和销毁(当我想隐藏它时)框架?框架的align = alClient。
我尝试了这个:
格式:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, uFrame1, uFrame2;
type
TFormMain = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
f1: TFrame1;
f2: TFrame2;
end;
var
FormMain: TFormMain;
implementation
{$R *.dfm}
procedure TFormMain.FormCreate(Sender: TObject);
begin
f1 := TFrame1.Create(Self);
f1.Parent := Self;
end;
end.
第一帧:
unit uFrame1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TFrame1 = class(TFrame)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
{$R *.dfm}
uses main, uFrame2;
procedure TFrame1.btn1Click(Sender: TObject);
begin
Self.Free;
FormMain.f2 := TFrame2.Create(FormMain);
FormMain.f2.Parent := FormMain;
end;
end.
第二帧:
unit uFrame2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TFrame2 = class(TFrame)
lbl1: TLabel;
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
{$R *.dfm}
uses main, uFrame1;
procedure TFrame2.btn1Click(Sender: TObject);
begin
Self.Free;
FormMain.f1 := TFrame1.Create(FormMain);
FormMain.f1.Parent := FormMain;
end;
end.
但是当我单击FrameStart或Frame1上的按钮时,它会因访问错误而崩溃(TForm FormCreate可以正常工作,即它创建并显示FrameStart)。
德尔福7。
最佳答案
您无法在这些事件处理程序中调用Self.Free
。当事件处理程序返回时,接下来执行的VCL代码仍然使用对您刚刚释放的对象的引用。这就是访问冲突的来源。如果您在完全 Debug模式下使用FastMM运行,那么将向您显示一条有用的诊断消息。
这些框架将不得不以更round回的方式杀死自己。将CM_RELEASE消息发布到框架,要求它在框架上调用Free
。您发布消息,而不是发送消息,以便首先处理所有飞行中的消息。您需要在框架中添加一个消息处理程序以响应该消息。
关于Delphi TFrame创建/销毁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10608823/