Delphi 框架关闭形式

Posted

技术标签:

【中文标题】Delphi 框架关闭形式【英文标题】:Delphi frames close form 【发布时间】:2016-07-30 13:42:04 【问题描述】:

今天我的问题(再次)是关于 delphi 框架的。 我有一个应用程序,它有一个主窗体和一个使用两个框架的界面:第一个用于显示 DBGrid 中的记录列表,第二个用于显示和编辑所选记录的详细信息。 这里是主窗体内的列表框:

这里是细节框架:

接口代码如下:

unit TblInterface;

interface

uses
  System.TypInfo, Vcl.Forms, RzPanel, Winapi.Windows, Winapi.Messages,
  UserMessages, Vcl.Dialogs;

type

  TFrameClass = class of TFrame;

  ITabella = interface
  ['D21924F9-BB41-493B-B06D-0908C0CA73D8']
    procedure CreateLstFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
    procedure CreateDtlFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
    procedure DestroyLstFrame;
    procedure DestroyDtlFrame;
    procedure BringFrameToFront(FrameType: string);
    procedure OnEditRecord;
  end;

  TTabella = class(TInterfacedObject, ITabella)
  private
    FLst: TFrame;
    FDtl: TFrame;
    procedure CreateLstFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
    procedure CreateDtlFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
    procedure DestroyLstFrame;
    procedure DestroyDtlFrame;
    procedure BringFrameToFront(FrameType: string);
    procedure OnEditRecord;
  end;

implementation

 TTabella 

 Creazione foglio lista 
procedure TTabella.CreateLstFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
begin
  FLst := Frame.Create(ParentPanel);
  FLst.Parent := ParentPanel;
end;

 Creazione form dettaglio 
procedure TTabella.CreateDtlFrame(ParentPanel: TRzPanel; Frame: TFrameClass);
begin
  FDtl := Frame.Create(ParentPanel);
  FDtl.Parent := ParentPanel;
end;

 Gestione inserimento / modifica record 
procedure TTabella.OnEditRecord;
begin
  SendMessage(FDtl.Handle, WM_EDT_RECORD, 0, 0)
end;

 Distruzione frame lista 
procedure TTabella.DestroyLstFrame;
begin
  FLst.Free;
end;

 Distruzione frame dettaglio 
procedure TTabella.DestroyDtlFrame;
begin
  FDtl.Free;
end;

procedure TTabella.BringFrameToFront(FrameType: string);
begin
  if FrameType = 'lst' then
    FLst.BringToFront;
  if FrameType = 'dtl' then
    FDtl.BringToFront;
end;

end.

我不知道如何制作东西。如果用户在详细信息框架上并关闭主窗体,它将关闭,但在这种情况下,我希望不关闭窗体,而是显示列表框架。

这里是列表框的来源:

unit FraAutList;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.Grids, Vcl.DBGrids, UserMessages;

type
  TfraAutLst = class(TFrame)
    grdAutori: TDBGrid;
    procedure grdAutoriDblClick(Sender: TObject);
  private
     Private declarations 
  public
     Public declarations 
  end;

implementation

$R *.dfm

uses database, Tabelle;

procedure TfraAutLst.grdAutoriDblClick(Sender: TObject);
begin
  SendMessage(frmTabelle.Handle, WM_DTL_RECORD, 0, 0)
end;

end.

这里是详细框架的来源:

单位 FraAutDetail;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, Vcl.Mask, Vcl.DBCtrls, UserMessages;

type
  TFraAutDtl = class(TFrame)
    lblIdAutore: TLabel;
    edtIdAutore: TDBEdit;
    lblCognome: TLabel;
    edtCognome: TDBEdit;
    lblNome: TLabel;
    edtNome: TDBEdit;
  private
    procedure OnEditRecord(var Msg: TMessage); message WM_EDT_RECORD;
  public
     Public declarations 
  end;

implementation

$R *.dfm

uses database;

 TfraAutDtl 

procedure TFraAutDtl.OnEditRecord(var Msg: TMessage);
begin
  edtCognome.SetFocus;
end;

end.

如您所见,我使用消息在帧之间进行通信;例如用于显示列表一中的详细信息框架:

SendMessage(frmTabelle.Handle, WM_DTL_RECORD, 0, 0)

有一种方法可以避免表单关闭,而是在用户位于详细信息框架时显示列表框架?

【问题讨论】:

旁白:发送消息似乎很奇怪。为什么不调用方法? 我还是接口的新手,所以我不知道如何使用它们。例如,我不知道如何在界面中创建一个方法来拦截 DBGrid 上的双击,就像我在“FraAutList”框架中所做的那样。 【参考方案1】:

每个表单都有一个OnCloseQuery 事件。 只需像这样设置 Cancel 参数(或多或少的伪代码 - 您需要一个返回当前显示帧的函数):

Cancel := GetCurrentActiveFrame is TFraAutDtl;
if Cancel then
  PostMessage(GetCurrentActiveFrame.Handle, CM_RELEASE, 0, 0) // or just set Visible := False

详细信息框架将自行关闭(并释放)它,并且之前的框架(如果还有一个将显示)。

【讨论】:

A TFrame 不处理 CM_RELEASE 消息,当然也不会自动释放自身。只有TForm 这样做。

以上是关于Delphi 框架关闭形式的主要内容,如果未能解决你的问题,请参考以下文章

在 Delphi 中使用框架的公认方法是啥?

delphi中WebBrowser控件怎么模拟点击网页框架中的按钮button?

delphi - 使用新事件创建自定义框架

嵌套在 Delphi 框架中的私有组件字段

如何在 C# 中制作类似 Delphi 的框架?

Delphi,框架与表格。多文档界面是啥?