问题:动态创建了多个可视组件TImage并存到数组Array[i]中后,要为这些动态控件指定onmousemove事件,按照一般的方法,就是先定义一个函数,然后在创建TImage控件的时候直接指定onmousemove事件,但是我如何判断出是哪个控件的事件呢!
if ADOQuery1.FieldByName('xttpmc').AsString<>'' then
        begin
           //-------------------动态创建图片控件,并显示出子系统图片------------------------
           ArrSubImage[i] := Timage.Create(self);
           ArrSubImage[i].Parent := self.Image14.Parent;
           ArrSubImage[i].Name :='JcSubImage'+inttostr(i);
           ArrSubImage[i].Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+ADOQuery1.FieldByName('xttpmc').AsString);
           ArrSubImage[i].Top := ADOQuery1.FieldByName('tpX').AsInteger;
           ArrSubImage[i].left := ADOQuery1.FieldByName('tpY').AsInteger;
           ArrSubImage[i].OnDblClick := FunDbClick;
           ArrSubImage[i].OnMouseDown := FunMouseDown; //鼠标 OnMouseDown事件
           ArrSubImage[i].OnMouseMove := FunMouseMove; //鼠标移动事件
           i:=i+1;
           ADOQuery1.Next;
          end;(***************鼠标移动事件****  //请问ArrSubImage[i]是那个对象我该确定************)
procedure  TMainWindow.FunMouseMove(Sender: TObject; Shift :TShiftState; x,y: Integer);
var   iDeltaX,iDeltaY:integer;
begin
  if  ssLeft in Shift then
    begin
      iDeltaX:=X-iX;
      iDeltaY:=Y-iY;
      if iDeltaX<>0   then
         ArrSubImage[i].Left:=ArrSubImage[i].Left+iDeltaX;
         //请问ArrSubImage[i]是那个对象我该如何传递参数过来
      if iDeltaY<>0   then
         ArrSubImage[i].Top:=ArrSubImage[i].Top+iDeltaY;
    end;
end;

解决方案 »

  1.   

    ArrSubImage[i].OnMouseMove := FunMouseMove
    FunMouseMove(Sender: TObject; Shift :TShiftState; x,y: Integer)
    这样调用方法和定义的方法不一致哦
      

  2.   

    procedure  TMainWindow.FunMouseMove(SubImage:Timage); 
    把ArrSubImage[i]作为参数传入方法FunMouseMove中。
      

  3.   

    procedure  TMainWindow.FunMouseMove(Sender: TObject; Shift :TShiftState; x,y: Integer); 把这个过程改成函数传递的话, 参数Sender: TObject; Shift :TShiftState 我该如何改呢?? ArrSubImage[i].OnMouseMove := FunMouseMove; //鼠标移动事件!  对象的属性事件我能把函数传递给ArrSubImage[i].OnMouseMove 吗???
      

  4.   

      if  ssLeft in Shift then
        begin
          iDeltaX:=X-iX;
          iDeltaY:=Y-iY;
          if iDeltaX < >0   then
            if Sender = TImage then
             TImage(Sender).Left:=TImage(Sender).Left+iDeltaX;
             //请问ArrSubImage[i]是那个对象我该如何传递参数过来
          if iDeltaY < >0   then
            if Sender = TImage then
             TImage(Sender).Top:=TImage(Sender).Top+iDeltaY;
        end;
      

  5.   

    procedure  TMainWindow.FunMouseMove(Sender: TObject; Shift :TShiftState; x,y: Integer); 
    var   iDeltaX,iDeltaY:integer; 
    var Img :TImage;
    begin 
      if not (sender is TImage) then exit;
      Img := TImage(Sender);
      ShowMessage(Img.Name);//这里可以弹出image的name属性值
      
      if  ssLeft in Shift then 
        begin 
          iDeltaX:=X-iX; 
          iDeltaY:=Y-iY; 
          if iDeltaX < >0   then 
             ArrSubImage[i].Left:=ArrSubImage[i].Left+iDeltaX; 
             //请问ArrSubImage[i]是那个对象我该如何传递参数过来 
          if iDeltaY < >0   then 
             ArrSubImage[i].Top:=ArrSubImage[i].Top+iDeltaY; 
        end; 
    end; 
      

  6.   

    procedure  TMainWindow.FunMouseMove(Sender: TObject; Shift :TShiftState; x,y: Integer);  
    var   iDeltaX,iDeltaY:integer;  
    var Img :TImage; 
    begin  
      if not (sender is TImage) then exit; 
      Img := TImage(Sender); 
      ShowMessage(Img.Name);//这里可以弹出image的name属性值 
        后面应该改成 
      if  ssLeft in Shift then  
        begin  
          iDeltaX:=X-iX;  
          iDeltaY:=Y-iY;  
          if iDeltaX  <  >0   then  
             Img.Left:=Img.Left+iDeltaX;  
             //请问ArrSubImage[i]是那个对象我该如何传递参数过来  
          if iDeltaY  <  >0   then  
             Img.Top:=Img.Top+iDeltaY;  
        end;  
    end;