动态创建了TScrollBar,在设置 OnChange 事件时,触发函数可以响应,
但是(Sender is TScrollBar) 里,Sender 的值为 nil,造成无法提取TScrollBar的信息,求助~procedure TForm1.FormCreate(Sender: TObject);
var
  Method: TMethod;
begin
  Method.Data := nil;
  Method.Code := @ScrollBarChange;  ScrollBar:= TScrollBar.Create(nil);
  ScrollBar.Parent := Panel1;
  ScrollBar.OnChange := TNotifyEvent(Method);
end;procedure ScrollBarChange(Sender: TObject);
var
  lcIndex:integer;
begin
  lcIndex:= -1;
  if (Sender is TScrollBar) then  // Sender 一直为 nil ???
  begin
    lcIndex:= (Sender as TScrollBar).Position;
  end;
  Showmessage(inttostr(lcIndex));
end;

解决方案 »

  1.   

    搞那么费劲干嘛,直接
    ScrollBar.OnChange := ScrollBarChange;
      

  2.   

    把ScrollBarChange作为form的成员函数
    procedure TForm1.ScrollBarChange(Sender: TObject);
      

  3.   

    把 ScrollBarChange 作为成员函数确实可以,但是不知道原因。bdmh能讲讲原理吗?关于动态控件的事件Sender的问题。我之前用 TMenuItem 的 Click事件,Sender的值可以传过去的
      

  4.   

    方法1:使用类方法,OnChange一般引用在类中定义的方法。如2楼,或者属于自定义类的方法
    方法2:使用指针,@ScrollBar.OnChange := @ScrollBarChange;
    普通过程的过程名指向其入口地址,而对象方法指向VMT(或DMT),但可通过指针赋值
    此法不太安全,在运行时有一定风险