Delphi TFrame创建/销毁

kxkpmulp  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(207)

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

afdcj2ne

afdcj2ne1#

你不能在这些事件处理程序中调用Self.Free。当事件处理程序返回时,接下来执行的VCL代码仍然使用对刚释放的对象的引用。这就是访问违规的来源。如果您在完全调试模式下运行FastMM,则会显示一条有用的诊断消息。
这些框架将不得不以更迂回的方式杀死自己。将CM_RELEASE消息发布到框架,要求它调用框架上的Free。您发布消息,而不是发送消息,以便首先处理所有正在发送的消息。您需要向帧中添加一个消息处理程序来响应消息。

flseospp

flseospp2#

你已经得到了一些。
这类东西背后的基本思想。
在主窗体中添加一个私有属性来保存框架。
在按钮单击处理程序中,假设您一次只需要一个按钮,

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;

如果你想让你的框架提升另一个框架,在那里重复上面的步骤。
如果你想让你在一个框架中提升的框架成为一个兄弟,例如。有相同的Parent,那么就不要使用Form 1 var。

fMyNextFrame.Parent = self.Parent;

一旦你让它工作起来,有很多方法可以改进它,这是接口和/或继承的经典场景,但首先要弄清楚这一点。

mySomething := TMySomething.Create();

你现在可以用一些东西做一些事情。你叫免费后,不是不能,是不要,也不让别的。
不要做self.free,这就像在汽油桶里玩火柴一样。会很痛...

相关问题