2010-06-02 48 views
0

我想標準化Devexpress TcxGrid上的行爲。所以我有一個單元ClientData與事件:如何共享TcxGrid的OnEnter事件?

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

如果我嘗試在其他單位也拒絕合作,利用該事件從TcxGrid.OnEnter事件。 如果我粘貼在ClientData.grdOnEnter中,那麼對話框說它不是一個有效的標識符。

是否可以在Delphi 2007中共享多個單元的事件?

編輯: ClientData是一個數據模塊,在啓動時創建並在應用程序退出時釋放。該引用位於全局變量ClientData中。所以我認爲應該從另一個單位參考它。

回答

1

是的,它應該工作,如果你通過代碼分配事件處理程序。
如果您的事件處理程序不使用ClientData實例中的任何內容(推薦),則甚至不需要創建實例。
類型爲TClientData的nil變量就足夠了。

在下面的示例應用程序中,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中DFM

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

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

只要您的表單單元在其使用條款中具有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

Se my edit addon。 ClientData是對單例類的全局引用。它應該工作,但仍然拒絕 – 2010-06-02 08:34:18

+0

好吧。您是否嘗試過在運行時分配事件處理程序而不是設計時間?例如在窗體的OnCreate中。 我想知道如果設計時間問題是由於cxGrid的有點'不尋常'的設計。這是一個TcxGridSite和網格視圖等等的所有組合,所以也許OnEnter方法不會像表單所期望的那樣被看到。可能是錯誤的,但... – shunty 2010-06-02 09:10:34

+0

似乎它可能不是與cxGrid的怪異畢竟。在D2010中,您可以使用對象檢查器從其他模塊分配組件引用,但不能在設計時分配它們的方法/事件處理程序 - 僅限運行時。據我所知。 – shunty 2010-06-02 11:00:53