2016-04-29 4 views
1

Ich habe eine Anwendung von einem Hauptformular, einem Rahmen und einem Datamodul gemacht. Wenn das Hauptformular erstellt wird, erstelle ich auch den Rahmen, der die Felder in einer Tabelle enthält, die sich im Datamodul befinden. So ist die Hauptform Code ist dies:Delphi Feuerrahmen Ereignisse von Datamodul

unit main; 

interface 

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

type 
    TfrmMain = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    FFraDtl: TfraDetail; 
    public 
    { Public declarations } 
    end; 

var 
    frmMain: TfrmMain; 

implementation 

{$R *.dfm} 

procedure TfrmMain.FormCreate(Sender: TObject); 
begin 
    FFraDtl := TfraDetail.Create(Self); 
    FFraDtl.Parent := Self; 
end; 

end. 

Der Code des Rahmens ist das:

unit FraDtl; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
    database, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, 
    cxContainer, cxEdit, cxTextEdit, cxDBEdit, Vcl.StdCtrls, dxSkinsCore, 
    cxNavigator, cxDBNavigator; 

type 
    TfraDetail = class(TFrame) 
    lblCognome: TLabel; 
    edtCognome: TcxDBTextEdit; 
    lblNome: TLabel; 
    edtNome: TcxDBTextEdit; 
    cxDBNavigator1: TcxDBNavigator; 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

implementation 

{$R *.dfm} 

end. 

Und der Code des Datenmodul ist dies:

unit database; 

interface 

uses 
    System.SysUtils, System.Classes, Data.DB, DBAccess, MSAccess, MemDS, 
    dxSkinsCore, cxClasses, cxLookAndFeels, dxSkinsForm; 

type 
    TdmData = class(TDataModule) 
    Connection: TMSConnection; 
    tblAutori: TMSTable; 
    dsAutori: TMSDataSource; 
    fAut_IdAutore: TIntegerField; 
    fAut_Cognome: TStringField; 
    fAut_Nome: TStringField; 
    fAut_Nominativo: TStringField; 
    SkinController: TdxSkinController; 
    procedure DataModuleCreate(Sender: TObject); 
    procedure DataModuleDestroy(Sender: TObject); 
    procedure dsAutoriStateChange(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    dmData: TdmData; 

implementation 

{$R *.dfm} 

procedure TdmData.DataModuleCreate(Sender: TObject); 
begin 
    tblAutori.Open; 
end; 

procedure TdmData.DataModuleDestroy(Sender: TObject); 
begin 
    tblAutori.Close; 
end; 

procedure TdmData.dsAutoriStateChange(Sender: TObject); 
begin 
    // Some stuff 
end; 

end. 

Ich möchte eine Prozedur aufgerufen wird, die im Rahmen des Ereignisses dsAutoriStateChange vorhanden ist, wird ausgelöst. Es gibt einen Weg, dies zu tun?

+0

Möchten Sie auf das Datamodul innerhalb des Frames oder auf die Haupteinheit zugreifen? – Johan

Antwort

1

Ich möchte eine Prozedur aufrufen, die im Frame im dsAutoriStateChange-Ereignis ausgelöst wird.

Sie können wie folgt dies mit Code tun:

unit database; 
.... 
implementation 

uses FraDtl; 

procedure TdmData.dsAutoriStateChange(Sender: TObject); 
begin 
    FraDtl.SomeProcedure; 
end; 

Oder wenn Sie die tatsächliche instanziiert Rahmen zugreifen möchten Sie Zugriff auf die Haupteinheit.

unit database; 
.... 
implementation 

uses main; //circular reference allowed in implementation 

procedure TdmData.dsAutoriStateChange(Sender: TObject); 
begin 
    frmMain.FrameDetail.DoSomething(Sender); 
end; 

In diesem Fall benötigen Sie eine öffentliche Eigenschaft zu frmMain Freilegung der Rahmen hinzuzufügen.

TfrmMain = class(TForm) 
... 
public 
    property FrameDetail: TFraDetail read FFraDtl; 


Diese Arten von harter Kopplung zwischen Datenmodul und Form Warnung sind schlechte Programmierpraxis angesehen.
Loose coupling is good
Hard coupling is bad

Es wäre besser, einen Event-Handler für eine Datenquelle in der Hauptform zu verwenden, oder wenn das nicht möglich ist zusätzliche Eigenschaften TdmData hinzuzufügen, die je nach Bedarf von der Hauptform aktualisiert.
Der Ereignishandler dsAutoriStateChange kann dann auf diese Eigenschaften zugreifen, anstatt in den privaten Teilen des Rahmens herumstochern zu müssen.

+0

Hallo Johan, ich habe deine Idee benutzt, auf den instanziierten Frame zuzugreifen. Ich möchte einen Event-Handler verwenden, aber ich weiß nicht, wie ich ihn definieren soll, um die Aufgabe zu erledigen, die ich möchte. – Eros

+0

Am besten eine neue Frage stellen: wie man einen Event-Handler zu einem Frame hinzufügt. – Johan