Delphi TFrame创建/销毁

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.

随着第一帧 用第二帧

Dav*_*nan 9

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

这些帧必须以更迂回的方式自杀.将CM_RELEASE消息发布到要求它在帧上调用Free的帧.您发布消息而不是发送消息,以便首先处理所有正在进行的消息.您需要向帧添加消息处理程序以响应消息.

  • 和鲍里斯的链接向你展示了一些[例子](http://stackoverflow.com/a/2502613/596852)...... (2认同)