在一个image1上动态创建一个image2(注意是动态的,静态没有这样的问题),然后把另外一幅跟image2一样大的image拖到image2 上,image2没有接收到ondragdrop事件(debug过了,指针不是nil,是正确的地址,如果image2不是在image1上不会有这样问题),就是没有执行这个事件的代码就对了,反而是背景的image1执行了image1.ondragdrop,然而里面的坐标却是image2的坐标。怎样解决这个问题呢?好奇怪啊。

解决方案 »

  1.   

    没问题啊procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      image3.BeginDrag(false);
    end;procedure TForm1.Image2DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      accept:=true;
    end;procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
    begin
      showmessage(Timage(sender).Name);
    end;procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
        accept:=true;
    end;procedure TForm1.FormShow(Sender: TObject);
    var image2:Timage;
    begin
       image2:=Timage.Create(self);
       image2.Height:=image3.Height;
       image2.Width:=image3.Width;
       image2.Left:=250;
       image2.Top:=200;
       image2.Name:='image2';
       image2.Parent:=self;
       image2.Picture:=image3.Picture;
       image2.OnDragOver:=image1.OnDragOver;
       image2.OnDragDrop:=image1.OnDragDrop;
    end;
      

  2.   

    image1是背景吧?/////////
    image2.OnDragDrop:=image1.OnDragDrop;    <==   image1.ondragdrop不是nil吗?  
    image2.OnDragOver:=image1.OnDragOver     <==   浪费了一句话你这样做,image1和image2的ondragdrop是一样的。我的问题是:image2(放在image1上面)的ondragdrop没有执行,image1的ondragdrop却执行了,然而坐标却是image2的坐标。
      

  3.   

    是不是别地方的代码出了问题,比如在IMAGE1上动态创建IMAGE2时候。
      

  4.   

    你这样做,image1和image2的ondragdrop是一样的。
    ----------------------------------------------------拜托你看清楚,事件中我返回的是sender的属性,在image1中方下返回的image1,再image2放下,返回的image2怎么会一样,你既然动态创建的image2那ondragdrop事件当然也得动态指定了,这里我只不过指定的是image1相同的事件,当然也可以制定另外的
      

  5.   

    是,不过我最主要的问题是,想让image2响应image2的ondragdrop,而不要响应image1.ondragdrop,或者,响应image1.ondragdrop,而坐标却是image1的。然而现实确是只响应image1.ondragdrop,而坐标是image2的。
      

  6.   

    image能做载体吗??记得不能
      

  7.   

    不好意思,上网的机会太少把image2放在panel上可以执行ondragdrop,不过不是动态建立的什么是载体啊?我把代码给你们看看(建立的代码):
      FMap[QipanXY.X,QipanXY.Y]:=TQizi.Create(self);
      FMap[QipanXY.X,QipanXY.Y].Parent:=self;
      FMap[QipanXY.X,QipanXY.Y].EverGone:=false;
      FMap[QipanXY.X,QipanXY.Y].QiziStyle:=QiziStyle;
      FMap[QipanXY.X,QipanXY.Y].PicDir:=self.PicDir;
      FMap[QipanXY.X,QipanXY.Y].X:=QipanXY.X;
      FMap[QipanXY.X,QipanXY.Y].Y:=QipanXY.Y;
      FMap[QipanXY.X,QipanXY.Y].QipanCtrl:=self;
      FMap[QipanXY.X,QipanXY.Y].AutoHide:=True;
      Range:=GetGeziFanwei(QipanXY);
      FMap[QipanXY.X,QipanXY.Y].Left:=FImgChess.Left+(Range.X1+Range.X2) div 2 - FMap[QipanXY.X,QipanXY.Y].Width div 2;
      FMap[QipanXY.X,QipanXY.Y].Top:=FImgChess.Top+(Range.Y1+Range.Y2) div 2 - FMap[QipanXY.X,QipanXY.Y].Height div 2;
      FMap[QipanXY.X,QipanXY.Y].BringToFront;
      (FMap[QipanXY.X,QipanXY.Y] as TControl).ControlStyle:=(FMap[QipanXY.X,QipanXY.Y] as TControl).ControlStyle+[csDisplayDragImage];/////////////////////////////
    constructor TQizi.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FPicDir:='';
      FQiziStyle:=' ';
      FAutoHide:=true;
      X:=0;//SET TO NIL
      Y:=0;
      EVERGONE:=FALSE;
      QipanCtrl:=nil;
      DragMode:=dmAutomatic;
      SetAutoDragging;
    end;
    ///////////////////////////
    procedure TQizi.SetAutoDragging;
    begin
      OnStartDrag:=TQiziStartDrag;
      OnEndDrag:=TQiziEndDrag;
      OnDragOver:=TQiziDragOver;
      OnDragDrop:=TQiziDragDrop;
    end;