首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为OnEnter共享TcxGrid事件?

如何为OnEnter共享TcxGrid事件?
EN

Stack Overflow用户
提问于 2010-06-02 06:46:56
回答 2查看 823关注 0票数 0

我想对Devexpress TcxGrid上的行为进行标准化。所以我有一个单元ClientData,它有一个事件:

代码语言:javascript
复制
procedure TClientData.grdOnEnter(Sender: TObject);
begin
  mnuCxGridStandardMenu.Grid := TcxGrid(Sender);
end;

如果我试图从另一个单元中的TcxGrid.OnEnter事件中使用该事件,它将拒绝工作。如果我粘贴在ClientData.grdOnEnter中,那么一个对话框说它不是一个有效的标识符。

是否可以在Delphi 2007中为多个单位共享一个事件?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-03 00:02:05

是的,如果您通过代码分配事件处理程序,那么它应该可以工作。

如果您的事件处理程序不使用来自ClientData实例的任何内容(建议),您甚至不需要创建一个实例。

TClientData类型的零变量就足够了。

在下面的示例应用程序中,ClientData模块不是由dpr自动创建的,仍然是零。这并不妨碍事件处理程序正确工作。

dpr

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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.

DataModule调频

代码语言:javascript
复制
object ClientData: TClientData
  OldCreateOrder = False
  Height = 150
  Width = 215
end

DataModule pas

代码语言:javascript
复制
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.
票数 1
EN

Stack Overflow用户

发布于 2010-06-02 08:01:00

您可以这样做,只要表单单元在uses子句中有ClientData单元,并且存在一个正确实例化的TClientData对象,并且是可以访问的。(不要混淆类定义和该类类型的对象)。然后,例如,可以将类似的内容添加到OnCreate处理程序中:

代码语言:javascript
复制
// 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;

如果在表单之前销毁了FClientData对象,那么当某些东西试图进入OnEnter方法时,就会出现访问冲突。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2955543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档