首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

类里面的事件委托如何搞

2013-11-26 
类里面的事件委托怎么搞看delphi高手突破,对其中的事件委托比较迷惑。写的下面的代码不能运行,请高手们指导

类里面的事件委托怎么搞
看delphi高手突破,对其中的事件委托比较迷惑。写的下面的代码不能运行,请高手们指导一下:


//定义部分
type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    procedure UserMethod(msg: string); //委托指定的用户自定义方法


    { Private declarations }
  public
    { Public declarations }
  end;

type
  TParent = class
  private
    a: Integer;
  public
    constructor Create();
    procedure geta;
  end;

  TssnEditorEvent = class
  private
    // 回调函数指针
    m_OnEditorChange: TNotifyEvent;
  public
    procedure OnEditorSelectionChange(Sender: TObject);
    procedure SetOnEditorSelectionChange(Value: TNotifyEvent);
  end;

//使用部分,

var
  g_EditorEvent: TssnEditorEvent = nil;



procedure TForm1.btn1Click(Sender: TObject);
var
  p: TParent;
  e: TssnEditorEvent;
begin
//
  p := TParent.Create;
  e := TssnEditorEvent.Create;

  e.SetOnEditorSelectionChange(UserMethod);
  p.geta;

  e.Free;
  p.Free;
end;

procedure TForm1.UserMethod(msg: string);
begin
  showmessage(msg);
end;

{ TParent }

constructor TParent.Create;
begin
  a := 1;
end;

procedure TParent.geta;
begin
  g_EditorEvent.OnEditorSelectionChange(nil);
  ShowMessage('from a class named parent: ' + IntToStr(a));
end;

{ TssnEditorEvent }

procedure TssnEditorEvent.OnEditorSelectionChange(Sender: TObject);
begin
  if Assigned(m_OnEditorChange) then
    m_OnEditorChange(Sender); //  调用回调函数
end;

procedure TssnEditorEvent.SetOnEditorSelectionChange(Value: TNotifyEvent);
begin
  m_OnEditorChange := Value;
end;



[解决办法]
TSelectionChangeEvent = procedure(Sender: TObject; msg: string) of object;

TssnEditor = class
private
  FOnSelectionChange: TSelectionChangeEvent;
  procedure Select;
public
  property OnSelectionChange: TSelecionChangeEvent read FOnSelectionChange write FOnSelectionChange;
end;

procedure TForm1.UserMessage(Sender: TObject; msg: string);
begin
  showmessage(msg);
end;

procedure TssnEditor.Select;
begin
  if Assigned(FOnSelectionChange) then
    FOnSelectionChange(Self, 'hi, selection change.....');
end;

e.OnSelectionChange:=UserMessage;

热点排行