2010-06-02 7 views
0

Devexpress TcxGrid에서 동작을 표준화하고 싶습니다. 나는 그것이 작동을 거부 다른 단위로 TcxGrid.OnEnter 이벤트에서 해당 이벤트를 사용하려고하면TcxGrid에 대해 OnEnter 이벤트를 공유하려면 어떻게해야합니까?

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

: 그래서 나는 이벤트와 단위 ClientData 있습니다. ClientData.grdOnEnter에 붙여 넣으면 대화 상자에 유효한 식별자가 아니라고 표시됩니다.

Delphi 2007에서는 여러 단위에 이벤트를 공유 할 수 있습니까?

EDIT : ClientData는 시작시 생성되고 응용 프로그램 종료시 해제되는 데이터 모듈입니다. 참조는 전역 변수 ClientData에 있습니다. 그래서 다른 단위에서 그것을 참조하는 것이 효과가 있다고 생각합니다.

답변

1

코드를 통해 이벤트 처리기를 할당하면 작동합니다.
이벤트 처리기에서 ClientData 인스턴스의 항목을 사용하지 않는 경우 (권장) 인스턴스를 만들지 않아도됩니다.
TClientData 유형의 nil 변수이면 충분합니다.

아래 샘플 응용 프로그램에서는 ClientData 모듈이 dpr에 의해 자동 생성되지 않고 nil로 유지됩니다. 그렇다고해서 이벤트 처리기가 올바르게 작동하는 것을 방해하지는 않습니다.

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 
,

the DataModule 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. 
1

양식 단위의 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; 

에서 [F] ClientData 개체를 양식하기 전에 파괴되면 뭔가 OnEnter를 입력하려고 할 때 다음 액세스 위반을 얻을 것이다 방법.

+0

내 편집 addon. ClientData는 싱글 톤 클래스에 대한 전역 참조입니다. 작동하지만 여전히 거절해야합니다. –

+0

Ok. 시간을 디자인하는 대신 런타임에 이벤트 처리기를 할당 해 보았습니까? 예 : 양식의 OnCreate. 디자인 시간 문제가 cxGrid의 다소 '비정상적인'디자인 때문인지 궁금합니다. 그것은 TcxGridSite와 그리드 뷰 등의 모든 조합입니다. 따라서 OnEnter 메서드는 폼에서 예상대로 보이지 않습니다. 그래도 잘못 될 수 있습니다 ... – shunty

+0

아마도 cxGrid의 기이함과 관련이없는 것 같습니다. D2010에서는 오브젝트 인스펙터를 사용하여 다른 모듈의 컴포넌트 참조를 지정할 수 있지만 런타임에만 메소드/이벤트 핸들러를 지정할 수는 없습니다. 내가 말할 수있는 한. – shunty

관련 문제