Ale*_* P. 5 delphi freepascal frame lazarus
如何创建(当我想要显示它)并在主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.
Run Code Online (Sandbox Code Playgroud)
第一帧:
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.
Run Code Online (Sandbox Code Playgroud)
第二帧:
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.
Run Code Online (Sandbox Code Playgroud)
但当我单击FrameStart或Frame1上的按钮时,它会崩溃并访问vialataions(TForm FormCreate工作正常,即它创建并显示FrameStart).
德尔福7.
您无法调用Self.Free
这些事件处理程序.当事件处理程序返回时,下一个执行的VCL代码仍然使用对刚刚释放的对象的引用.这就是访问违规的来源.如果您在完全调试模式下使用FastMM运行,那么您将看到一条有用的诊断消息.
这些帧必须以更迂回的方式自杀.将CM_RELEASE消息发布到要求它在帧上调用Free
的帧.您发布消息而不是发送消息,以便首先处理所有正在进行的消息.您需要向帧添加消息处理程序以响应消息.