我想对Devexpress TcxGrid上的行为进行标准化。所以我有一个单元ClientData,它有一个事件:
procedure TClientData.grdOnEnter(Sender: TObject);
begin
mnuCxGridStandardMenu.Grid := TcxGrid(Sender);
end;如果我试图从另一个单元中的TcxGrid.OnEnter事件中使用该事件,它将拒绝工作。如果我粘贴在ClientData.grdOnEnter中,那么一个对话框说它不是一个有效的标识符。
是否可以在Delphi 2007中为多个单位共享一个事件?
编辑: ClientData是一个数据模式,在启动时创建,在应用程序退出时释放。引用位于全局变量ClientData中。所以我认为它应该从另一个单位引用它。
发布于 2010-06-03 00:02:05
是的,如果您通过代码分配事件处理程序,那么它应该可以工作。
如果您的事件处理程序不使用来自ClientData实例的任何内容(建议),您甚至不需要创建一个实例。
TClientData类型的零变量就足够了。
在下面的示例应用程序中,ClientData模块不是由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.DataModule调频
object ClientData: TClientData
OldCreateOrder = False
Height = 150
Width = 215
endDataModule 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.发布于 2010-06-02 08:01:00
您可以这样做,只要表单单元在uses子句中有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;如果在表单之前销毁了FClientData对象,那么当某些东西试图进入OnEnter方法时,就会出现访问冲突。
https://stackoverflow.com/questions/2955543
复制相似问题