来自datamodule的Delphi fire框架事件

来自datamodule的Delphi fire框架事件,delphi,events,frame,Delphi,Events,Frame,我有一个由主窗体、框架和数据模块组成的应用程序。 创建主窗体时,我还创建了一个框架,其中包含datamodule中表中的字段。 因此,主要的表单代码如下: unit main; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Fra

我有一个由主窗体、框架和数据模块组成的应用程序。 创建主窗体时,我还创建了一个框架,其中包含datamodule中表中的字段。 因此,主要的表单代码如下:

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.
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.
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.
框架的代码如下所示:

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.
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.
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.
数据模块的代码如下:

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.
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.
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.
我想调用触发DSAutoRestatechange事件的帧中存在的过程。有办法做到这一点吗

我想调用触发DSAutoRestatechange事件的帧中存在的过程

您可以使用如下代码执行此操作:

unit database;
....
implementation

uses FraDtl;

procedure TdmData.dsAutoriStateChange(Sender: TObject);
begin
  FraDtl.SomeProcedure; 
end;
或者,如果您想访问实际的实例化帧,您可以访问主单元

unit database;
....
implementation

uses main;  //circular reference allowed in implementation

procedure TdmData.dsAutoriStateChange(Sender: TObject);
begin
  frmMain.FrameDetail.DoSomething(Sender); 
end;
在这种情况下,您需要将公共属性添加到
frmMain
以公开帧

TfrmMain = class(TForm)
...
public
  property FrameDetail: TFraDetail read FFraDtl;
警告
数据模块和表单之间的这种硬耦合被认为是糟糕的编程实践。

最好在主窗体内为数据源使用事件处理程序,或者如果无法向
TdmData
添加其他属性,这些属性将根据需要由主窗体更新。

事件处理程序
dsAutoRestatechange
可以访问这些属性,而不必在帧的私有部分四处搜索

你想访问帧内的数据模块,还是从主单元访问数据模块?嗨,Johan,我用了你访问实例化帧的想法。我想使用事件处理程序,但我不知道如何定义它来完成我想要的任务。最好问一个新问题:如何将事件处理程序添加到框架中。