听大侠的话,问题一个一个问,呵呵问题1:动态生成几个控件,如何判断哪个控件被选中进行拖放/缩放?(动态生成的控件的唯一标识是什么?)
     比如,在RichEdit上动态产生2个控件,产生第1个时可以对1进行拖放,然后再产生
第2个时可以对2进行拖放,但是这时就不能对1进行拖放了,这时对1进行拖放还是2在拖放,而1没有反应,请教是什么原因?
  注:动态产生的控件是一个链表结构,每动态生成一个控件就加入链表中
  相关代码如下:
TDataFieldList=^DFL;
  DFL=Record
     DataField:TRichEdit;
     Name:string;
     XPos:integer;
     YPos:integer;
Next:TDataFieldList;
end;var  DataFieldList:TDataFieldList;
     AEdt:TRichEdit;procedure TFormDataField.EdtOnDragOver(Sender,Source:TObject;X,Y:Integer;
                                               State:TDragState;var Accept:Boolean);
var p:TDataFieldList;
begin
  p:=DataFieldList;
  while Source<>p.DataField do//判断是哪个控件被拖放
  p:=p.Next;
//  if Source=AEdt then
  Accept:=True;
  FormNew.isDragFormNew:=True;
end;

解决方案 »

  1.   

    //==============================================================================//任意摆布一个控件(拖动、放大、缩小)******************************************//==============================================================================procedure ManipulateControl(WinControl: TWinControl; Shift: TShiftState; X, Y, Precision: integer);//Precision:精度,该方法可以在onmousemove中调用var SC_MANIPULATE: Word;begin  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  //光标在控件的最左侧**********************************************************  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       if (X<=Precision) and (Y>Precision) and (Y<WinControl.Height-Precision)  then begin         SC_MANIPULATE  := $F001;         WinControl.Cursor := crSizeWE;       end  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  //光标在控件的最右侧**********************************************************  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  else if (X>=WinControl.Width-Precision) and (Y>Precision) and (Y<WinControl.Height-Precision)  then begin         SC_MANIPULATE  := $F002;         WinControl.Cursor := crSizeWE;       end  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  //光标在控件的最上侧**********************************************************  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  else if (X>Precision) and (X<WinControl.Width-Precision) and (Y<=Precision)  then begin         SC_MANIPULATE  := $F003;         WinControl.Cursor := crSizeNS;       end  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  //光标在控件的左上角**********************************************************  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  else if (X<=Precision) and (Y<=Precision)  then begin         SC_MANIPULATE  := $F004;         WinControl.Cursor := crSizeNWSE;       end  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  //光标在控件的右上角**********************************************************  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  else if (X>=WinControl.Width-Precision) and (Y<=Precision)  then begin         SC_MANIPULATE  := $F005;         WinControl.Cursor := crSizeNESW ;       end  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  //光标在控件的最下侧**********************************************************  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  else if (X>Precision) and (X<WinControl.Width-Precision) and (Y>=WinControl.Height-Precision)  then begin         SC_MANIPULATE  := $F006;         WinControl.Cursor := crSizeNS;       end  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  //光标在控件的左下角**********************************************************  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  else if (X<=Precision) and (Y>=WinControl.Height-Precision)  then begin         SC_MANIPULATE  := $F007;         WinControl.Cursor := crSizeNESW;       end  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  //光标在控件的右下角**********************************************************  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  else if (X>=WinControl.Width-Precision) and (Y>=WinControl.Height-Precision)  then begin         SC_MANIPULATE  := $F008;         WinControl.Cursor := crSizeNWSE;       end  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  //光标在控件的客户区(移动整个控件)******************************************  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  else if (X>5) and (Y>5) and (X<WinControl.Width-5) and (Y<WinControl.Height-5)  then begin         SC_MANIPULATE  := $F009;         WinControl.Cursor := crSizeAll;       end  else begin         SC_MANIPULATE := $F000;         WinControl.Cursor := crDefault;       end;  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  if Shift=[ssLeft] then  begin    ReleaseCapture;    WinControl.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);  end;  end;
    调用例子:
    procedure TForm_Main.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);begin  Caption := IntToStr(X) + '/' + IntToStr(Y);  ManipulateControl((Sender as TWinControl), Shift, X, Y, 10);end;
      

  2.   

    To:punkun(剑神一笑)
      大侠,我按你的方法做,鼠标在控件上时变成可拖动/缩放状,但是并没有实际缩放啊,
    (也就是光标形状变了,但控件本身还是不能被拖动/缩放)是不是还需要重新生成控件?谢啦!^_^
      

  3.   

    真的不行吗?我怎么可以啊,我就是用上面的代码来着,多试几次。punkun Thank you!!
      

  4.   

    楼上的大哥:
    我是在TImage和TLabel控件的OnMouseMove事件中调用ManipulateControl过程,提示出错啊!
    另外在TEdit中使用时还是只能拖动,不能放大和缩小,为什么啊?(我的TEdit是在TRichEdit上动态产生的)
    向剑神一笑大侠和各位高手请教?
      

  5.   

    TImage和TLabel不是从TWinControl继承下来的,所以没有句柄,当然要出错.
    TLabel你可以用TStaticText代替.我的TEdit放大缩小正常啊?
      

  6.   

    谢谢先!那TImage怎么放大和缩小呢?请教
      

  7.   

    这里又开了一个贴子???
    我把那个问题绕着解决了^_^
    你肯定是TLabel不能拖动,TEdit控件没有问题。
    我认为和它们的祖先类有关。从TWinControl继承的进行拖动与缩放都没有问题。TLabel和TImage都没有从TWinControl继承来,无法缩放。而TEdit和TButton都是从TWinControl继承的,它们的拖动和缩放没有问题。
    我的实现方法是:
    把TImage或TLabel没有从TWinControl分支下来的类控件放到一个Panel上,也就是让Panel来承当它们的载体(TPanel是由TWinControl继承下来的)。那个拖动过程对Panel进行控制。测试成功。你试试吧^_^……
    procedure ManipulateControl(WinControl: TControl; Shift: TShiftState;
                                    X, Y, Precision: integer);
                                    //Precision:精度,该方法可以在onmousemove中调用
    var
      SC_MANIPULATE: Word;
    begin
      //光标在控件的最左侧
      if (X<=Precision) and (Y>Precision) and (Y<WinControl.Height-Precision) then
      begin
        SC_MANIPULATE  := $F001;
        WinControl.Cursor := crSizeWE;  end
      else
        //光标在控件的最右侧
        if (X>=WinControl.Width-Precision) and (Y>Precision) and (Y<WinControl.Height-Precision) then
        begin
          SC_MANIPULATE  := $F002;
          WinControl.Cursor := crSizeWE;
        end
        else
          //光标在控件的最上侧
          if (X>Precision) and (X<WinControl.Width-Precision) and (Y<=Precision) then
          begin
            SC_MANIPULATE  := $F003;
            WinControl.Cursor := crSizeNS;
          end
          else
            //光标在控件的最下侧
            if (X>Precision) and (X<WinControl.Width-Precision) and (Y>=WinControl.Height-Precision) then
            begin
              SC_MANIPULATE  := $F006;
              WinControl.Cursor := crSizeNS;
            end
            else
              //光标在控件的左上角
              if (X<=Precision) and (Y<=Precision) then
              begin
                SC_MANIPULATE  := $F004;
                WinControl.Cursor := crSizeNWSE;
              end
              else
                //光标在控件的右上角
                if (X>=WinControl.Width-Precision) and (Y<=Precision) then
                begin
                  SC_MANIPULATE  := $F005;
                  WinControl.Cursor := crSizeNESW ;
                end
                else
                  //光标在控件的左下角
                  if (X<=Precision) and (Y>=WinControl.Height-Precision) then
                  begin
                    SC_MANIPULATE  := $F007;
                    WinControl.Cursor := crSizeNESW;
                  end
                  else
                    //光标在控件的右下角
                    if (X>=WinControl.Width-Precision) and (Y>=WinControl.Height-Precision) then
                    begin
                      SC_MANIPULATE  := $F008;
                      WinControl.Cursor := crSizeNWSE;
                    end
                    else
                      //光标在控件的客户区(移动整个控件)
                      if (X>5) and (Y>5) and (X<WinControl.Width-5) and 
                            (Y<WinControl.Height-5) then
                      begin
                        SC_MANIPULATE  := $F009;
                        WinControl.Cursor := crSizeAll;
                      end
                      else
                      begin
                        SC_MANIPULATE := $F000;
                        WinControl.Cursor := crDefault;
                      end;
      if Shift=[ssLeft] then
      begin
        ReleaseCapture;
        WinControl.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);
      end;
    end;//建立Timage及TPanel,用Panel作为image的载体。且对Image赋予OnMouseMove过程。
    procedure TForm1.Button1Click(Sender: TObject);
    var
      AJpg: TImage;
      APanel: TPanel;
    begin
       if Form1.OpenPictureDialog1.Execute then
       begin
         APanel := TPanel.Create(Form1.RichEditNew);
         APanel.Align := alnone;
         APanel.BevelOuter := bvNone;
         APanel.Width := Trunc(Form1.RichEditNew.Width/2);
         APanel.Height := Trunc(Form1.RichEditNew.Height/2);
         APanel.Parent := Form1.RichEditNew;     AJpg := TImage.Create(APanel);
         AJpg.OnMouseMove := FMouseMove;
         AJpg.Parent := APanel;
         AJpg.Stretch := True;
         AJpg.Align := alclient;
         AJpg.Picture.LoadFromFile(Form1.OpenPictureDialog1.FileName);
       end;
    end;//建立Image的OnMouseMove调用过程
    procedure TForm1.FMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      Caption := IntToStr(X) + '/' + IntToStr(Y);
      ManipulateControl((TControl(Sender).Parent as TwinControl), Shift, X, Y, 10);
    end;
    ……
      

  8.   

    用我的方法吧~
    这样只要你建的Image都可以进行移动和拖放。
    不存在你的:
    ---在RichEdit上动态产生2个控件,产生第1个时可以对1进行拖放,然后再产生
    第2个时可以对2进行拖放,但是这时就不能对1进行拖放了,这时对1进行拖放还是2在拖放,而1没有反应---这种问题!
    ^_^
      

  9.   

    呵呵,问题解决了
    我把TEdit的dragkind,dragmode属性设置错了,现在可以了
    至于TImage,就用我也要补钙大侠的方法了,呵呵