如何在主TForm上创建(当我想显示它时)和销毁(当我想隐藏它时)框架?Frames' 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上的按钮时,它会崩溃。它创建并显示FrameStart)。
Delphi 7.
2条答案
按热度按时间afdcj2ne1#
你不能在这些事件处理程序中调用
Self.Free
。当事件处理程序返回时,接下来执行的VCL代码仍然使用对刚释放的对象的引用。这就是访问违规的来源。如果您在完全调试模式下运行FastMM,则会显示一条有用的诊断消息。这些框架将不得不以更迂回的方式杀死自己。将CM_RELEASE消息发布到框架,要求它调用框架上的
Free
。您发布消息,而不是发送消息,以便首先处理所有正在发送的消息。您需要向帧中添加一个消息处理程序来响应消息。flseospp2#
你已经得到了一些。
这类东西背后的基本思想。
在主窗体中添加一个私有属性来保存框架。
在按钮单击处理程序中,假设您一次只需要一个按钮,
当你只是想摆脱它而不是取代它时
如果你想让你的框架提升另一个框架,在那里重复上面的步骤。
如果你想让你在一个框架中提升的框架成为一个兄弟,例如。有相同的Parent,那么就不要使用Form 1 var。
一旦你让它工作起来,有很多方法可以改进它,这是接口和/或继承的经典场景,但首先要弄清楚这一点。
你现在可以用一些东西做一些事情。你叫免费后,不是不能,是不要,也不让别的。
不要做self.free,这就像在汽油桶里玩火柴一样。会很痛...