如何在主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.

第一帧:
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。

最佳答案

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

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

关于Delphi TFrame创建/销毁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10608823/

10-09 06:51
查看更多