代码之家  ›  专栏  ›  技术社区  ›  Roland Bengtsson

如何为tcxgrid共享OnEnter事件?

  •  0
  • Roland Bengtsson  · 技术社区  · 15 年前

    我想标准化devexpress tcxgrid上的行为。所以我有一个单位clientdata和一个事件:

    procedure TClientData.grdOnEnter(Sender: TObject);
    begin
      mnuCxGridStandardMenu.Grid := TcxGrid(Sender);
    end;
    

    如果我尝试从另一个单元的tcxgrid.onenter事件中使用该事件,它将拒绝工作。 如果我粘贴到clientdata.grdonenter中,那么会有一个对话框说它不是有效的标识符。

    是否可以在Delphi2007中为多个单元共享一个事件?

    编辑: clientdata是一个数据模块,在启动时创建,在应用程序退出时释放。引用位于全局var clientdata中。所以我认为从另一个单位引用它应该是有效的。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Francesca    15 年前

    是的,如果你 通过代码分配事件处理程序 .
    如果事件处理程序不使用来自clientdata实例的任何内容(推荐),则甚至不需要创建实例。
    tclientdata类型的nil变量就足够了。

    在下面的示例应用程序中,客户端数据模块不是由DPR自动创建的,保持为零。 这不会阻止事件处理程序正常工作。

    DPR

    program Project2;
    
    uses
      Forms,
      Unit10 in 'Unit10.pas' {Form10},
      Unit11 in 'Unit11.pas' {ClientData: TDataModule};
    
    {$R *.res}
    
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TForm10, Form10);
      Application.Run;
    end.
    

    DFM格式

    object Form10: TForm10
      Left = 0
      Top = 0
      Caption = 'Form10'
      ClientHeight = 282
      ClientWidth = 418
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object Button1: TButton
        Left = 168
        Top = 168
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 0
        OnClick = Button1Click
      end
    end
    

    表格PAS

    unit Unit10;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Unit11, StdCtrls;
    
    type
      TForm10 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form10: TForm10;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm10.Button1Click(Sender: TObject);
    begin
      if ClientData = nil then
        ShowMessage('ClientData is nil')
      else
        ShowMessage('ClientData is NOT nil');
    end;
    
    procedure TForm10.FormCreate(Sender: TObject);
    begin
      OnClick := ClientData.WhateverEvent;
    end;
    
    end.
    

    数据模块DFM

    object ClientData: TClientData
      OldCreateOrder = False
      Height = 150
      Width = 215
    end
    

    数据模块PAS

    unit Unit11;
    
    interface
    
    uses
      SysUtils, Classes, Windows;
    
    type
      TClientData = class(TDataModule)
        procedure WhateverEvent(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      ClientData: TClientData;
    
    implementation
    
    {$R *.dfm}
    
    procedure TClientData.WhateverEvent(Sender: TObject);
    begin
      MessageBox(0, PChar('Sender is ' + Sender.ClassName), 'Test', MB_ICONINFORMATION or MB_OK);
    end;
    
    end.
    
        2
  •  1
  •   shunty    15 年前

    您可以这样做,只要表单单元的use子句中有clientdata单元,并且存在正确实例化的tclientdata对象并且可以访问。(不要混淆类定义和该类类型的对象)。然后,例如,您可以向onCreate处理程序添加如下内容:

    // Optional - ClientData may be a 'global' object so won't need creating.
    // FClientData could be a form member ora more globally accessible variable.
    //FClientData := TClientData.Create(Self); 
    // or
    //FClientData := TClientData.Create(Application);
    cxGrid1.OnEnter := FClientData.grdOnEnter;
    

    如果[f]clientdata对象在表单之前被破坏,那么当有人试图进入onenter方法时,您将得到一个访问冲突。