首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi TFrame创建/销毁

Delphi TFrame创建/销毁
EN

Stack Overflow用户
提问于 2012-05-15 20:59:55
回答 2查看 19.6K关注 0票数 5

如何在主TForm上创建(当我想显示它时)和销毁(当我想隐藏它)帧?帧的对齐= alClient。

我试过这个:

表单:

代码语言:javascript
运行
复制
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.

第一帧:

代码语言:javascript
运行
复制
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.

第二帧:

代码语言:javascript
运行
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-15 21:32:21

您不能在这些事件处理程序中调用Self.Free。当事件处理程序返回时,接下来执行的VCL代码仍然使用对您刚刚释放的对象的引用。这就是非法访问的原因。如果您在完全调试模式下使用FastMM运行,那么您将看到一条有用的诊断消息。

这些框架将不得不以一种更迂回的方式自杀。向框架发送一条CM_RELEASE消息,要求它调用框架上的Free。您可以发布消息,而不是发送消息,以便首先处理所有在飞行中的消息。您需要向框架中添加一个消息处理程序来响应消息。

票数 9
EN

Stack Overflow用户

发布于 2012-05-15 22:04:07

你已经得到了一些。

这类事情背后的基本想法。

将私有属性添加到主窗体以保存框架。

在按钮中单击处理程序,假设一次只想要一个

代码语言:javascript
运行
复制
if assigned(fMyFrame) then
begin
  fMyFrame.Free;
  fMyFrame := nil;
end;
fMyFrame := TSomeFrame.Create(self);
fMyFrame.Parent := self;
fMyFrame.blah...

当你只想摆脱它而不是取代它的时候

代码语言:javascript
运行
复制
if assigned(fMyFrame) then
begin
  fMyFrame.Free;
  fMyFrame := nil;
end;

如果您想要您的框架提出另一个框架,重复上述的在那里。

如果希望在框架中引发的框架成为兄弟姐妹,例如具有相同的父级,则不要使用Form1 var。

代码语言:javascript
运行
复制
fMyNextFrame.Parent = self.Parent;

有大量的方法可以改进这一点,一旦你开始工作,这是一个典型的接口和继承的场景,但首先要解决这个问题。

代码语言:javascript
运行
复制
mySomething := TMySomething.Create();

你现在可以做点什么了。在你打电话给自由之后,它不会是不能的,它也不会,也不会让任何事情发生。

不要做self.free,这就像在汽油桶里玩火柴一样。会痛的..。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10608823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档