如何在主TForm上创建(当我想显示它时)和销毁(当我想隐藏它)帧?帧的对齐= 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。


发布于 2012-05-15 21:32:21
您不能在这些事件处理程序中调用Self.Free。当事件处理程序返回时,接下来执行的VCL代码仍然使用对您刚刚释放的对象的引用。这就是非法访问的原因。如果您在完全调试模式下使用FastMM运行,那么您将看到一条有用的诊断消息。
这些框架将不得不以一种更迂回的方式自杀。向框架发送一条CM_RELEASE消息,要求它调用框架上的Free。您可以发布消息,而不是发送消息,以便首先处理所有在飞行中的消息。您需要向框架中添加一个消息处理程序来响应消息。
发布于 2012-05-15 22:04:07
你已经得到了一些。
这类事情背后的基本想法。
将私有属性添加到主窗体以保存框架。
在按钮中单击处理程序,假设一次只想要一个
if assigned(fMyFrame) then
begin
fMyFrame.Free;
fMyFrame := nil;
end;
fMyFrame := TSomeFrame.Create(self);
fMyFrame.Parent := self;
fMyFrame.blah...当你只想摆脱它而不是取代它的时候
if assigned(fMyFrame) then
begin
fMyFrame.Free;
fMyFrame := nil;
end;如果您想要您的框架提出另一个框架,重复上述的在那里。
如果希望在框架中引发的框架成为兄弟姐妹,例如具有相同的父级,则不要使用Form1 var。
fMyNextFrame.Parent = self.Parent;有大量的方法可以改进这一点,一旦你开始工作,这是一个典型的接口和继承的场景,但首先要解决这个问题。
mySomething := TMySomething.Create();你现在可以做点什么了。在你打电话给自由之后,它不会是不能的,它也不会,也不会让任何事情发生。
不要做self.free,这就像在汽油桶里玩火柴一样。会痛的..。
https://stackoverflow.com/questions/10608823
复制相似问题