Как я могу поделиться событием OnEnter для TcxGrid? - PullRequest
0 голосов
/ 02 июня 2010

Я хочу стандартизировать поведение на Devexpress TcxGrid. Итак, у меня есть блок ClientData с событием:

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

Если я пытаюсь использовать это событие из события TcxGrid.OnEnter в другом модуле, оно отказывается работать. Если я вставлю в ClientData.grdOnEnter, то диалоговое окно скажет, что это недопустимый идентификатор.

Возможно ли поделиться событием для нескольких юнитов в Delphi 2007?

РЕДАКТИРОВАТЬ: ClientData представляет собой модуль данных, который создается при запуске и освобождается при выходе из приложения. Ссылка находится в глобальной переменной ClientData. Поэтому я думаю, что он должен работать, чтобы ссылаться на него из другого устройства.

Ответы [ 2 ]

1 голос
/ 03 июня 2010

Да, это должно работать, если вы назначаете обработчик событий с помощью кода .
Если ваш обработчик событий не использует ничего из экземпляра ClientData (рекомендуется), вам даже не нужно создавать экземпляр.
Переменная nil типа TClientData достаточно.

В приведенном ниже примере приложения модуль ClientData не создается автоматически 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.

Форма ДФМ

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

Форма па

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

Модуль данных па

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 голос
/ 02 июня 2010

Вы можете сделать это, пока ваш модуль формы имеет модуль 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.

...