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
详细信息框架将自行关闭(并释放)它,并且之前的框架(如果还有一个将显示)。
【讨论】:
ATFrame
不处理 CM_RELEASE
消息,当然也不会自动释放自身。只有TForm
这样做。以上是关于Delphi 框架关闭形式的主要内容,如果未能解决你的问题,请参考以下文章