2016-04-09 22 views
0

今日私の質問は(再び)デルファイフレームについてです。 私はメインフォームと2つのフレームを使用するインターフェイスを持つアプリケーションを持っています。最初はDBGridのレコードの一覧を表示し、もう1つは選択したレコードの詳細を表示して編集するためのものです。 メインフォーム内のここでリストフレーム:デルファイフレーム閉じるフォーム

enter image description here

、ここで詳細フレーム:ここ

enter image description here

は、インタフェースコードです:

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. 

ご覧のとおり、フレーム間のコミニケーションを行うためにメッセージを使用しています。例えば、リスト1の詳細フレームを示すために:

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

ユーザーが詳細フレームにあるときに、リストの枠を表示代わりに、フォームの閉鎖を回避し、方法はありますか?

+0

脇:送信メッセージが奇妙に見えます。なぜメソッドを呼び出さないのですか? –

+0

私はまだインタフェースの初心者ですので、あまり使用することは知らないです。たとえば、 "FraAutList"フレームで行うように、DBGridのダブルクリックをインターセプトするためのインターフェイスでメソッドを作成する方法がわかりません。 – Eros

答えて

3

すべてのフォームにはOnCloseQueryというイベントがあります。 (

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

詳細フレームは、(無料で)終了します、それは自己と以前フレーム: - はちょうどこのようなパラメータをキャンセル設定(多かれ少なかれ擬似コードは、あなたは、現在表示されているフレームを返す関数が必要になります)まだある場合は1が表示されます)。

+1

'TFrame'は' CM_RELEASE'メッセージを処理せず、確かに自動的に自動解放しません。 'TForm'だけがこれを行います。 –

関連する問題