2016-04-09 14 views
0

heute meine Frage ist (wieder) über Delphi Frames. Ich habe eine Anwendung mit einem Hauptformular und einer Schnittstelle, die zwei Frames verwendet: das erste zum Anzeigen einer Liste von Datensätzen in einem DBGrid und das zweite zum Anzeigen und Bearbeiten des Details des ausgewählten Datensatzes. Hier die Liste Rahmen innerhalb der Hauptform:Delphi Frames schließen Formular

enter image description here

und hier im Detail Rahmen:

enter image description here

hier ist die Schnittstelle Code:

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. 

ich kann‘ Ich weiß nicht, wie man etwas macht. Wenn sich der Benutzer im Detailrahmen befindet und das Hauptformular schließt, wird er geschlossen, aber ich möchte in diesem Fall das Formular nicht schließen, sondern den Listenrahmen anzeigen. Hier

ist die Quelle der Liste Rahmen:

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. 

und hier ist die Quelle des Detail Rahmen:

Einheit 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. 

Wie Sie sehen können, verwende ich Nachrichten, um zwischen Frames zu kommunizieren; zum Beispiel für die Detailrahmen aus der Liste zeigt ein:

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

Es gibt einen Weg, um den Formschluss und stattdessen zeigt die Liste Rahmen zu vermeiden, wenn der Benutzer auf dem feld ist?

+0

Neben: Senden von Nachrichten scheint seltsam. Warum nicht eine Methode aufrufen? –

+0

Ich bin immer noch Anfänger von Schnittstellen, so dass ich nicht weiß, sie sehr zu verwenden. Zum Beispiel weiß ich nicht, wie man eine Methode in der Schnittstelle zum Abfangen des Doppelklicks auf das DBGrid wie im Rahmen "FraAutList" erstellt. – Eros

Antwort

3

Jedes Formular hat ein OnCloseQuery Ereignis. Setzen Sie einfach die Parameter wie folgt Abbrechen (mehr oder weniger Pseudo-Code - Sie würden eine Funktion benötigen die aktuell angezeigte Rahmen zurückkehrt):

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

Detailrahmen wird geschlossen (und kostenlos) es selbst und die zuvor Rahmen (wenn es noch einen gibt wird angezeigt).

+1

Ein 'TFrame' verarbeitet keine 'CM_RELEASE'-Nachrichten und macht sich selbst nicht automatisch frei. Nur ein 'TForm' macht das. –

Verwandte Themen