procedure TForm1.Button2Click(Sender: TObject);
//我按下这个按钮的时候,Panel上的按钮应该移动到相对应的座标上.
//而这些按钮是动态创建的,问题是,如果我只在PANEL上点一下(就是生成一个按钮,那么程序完全正常,如果点多次,就只有第一下点生成的那个按钮有移动到我相对应的位置.我不知道我程序是哪里出错了..请大侠们帮我看看)
var I:Integer;
    Temp:TComponent;
    X,Y:Integer;
begin
   P1:=Panel1.BoundsRect.Left+Panel1.Width;
   P2:=Panel1.BoundsRect.Bottom+Panel1.Height;
   Panel1.Width:=(Panel1.Width*1)DIV 2;
   Panel1.Height:=(Panel1.Height*1) DIV 2;
   Button1.Left:=Button1.Left Div 2;
   Button1.Top:=Button1.Top div 2;
   Image1.Width:=Panel1.Width;
   Image1.Height:=Panel1.Height;
   Panel1.Refresh;
  For I:=0 to Form1.ComponentCount-1 do
//问题可能是由这一句引起的..
    Temp:=Form1.Components[i];
    begin
      if (Sender is TButton) then
        begin
        X:=TButton(Temp).Left;  //记录下当前按钮的Left位置,
        Y:=TButton(Temp).Top;   //记录下当前按钮的Top位置
        TButton(Temp).Left:=X div 2;
        TButton(Temp).Top:=Y div 2;
        Panel1.Refresh;
        Image1.Refresh;
        Form1.Refresh;
        end;
    end;
end;
//这个是创建控件的...
procedure TForm1.Image1Click(Sender: TObject);
var Btn:TButton;
    PT:TPoint;
begin
  GetCursorPos(PT);
  Btn:=TButton.Create(Self);
  with Btn do
  begin
    Parent:=Self;//或者是Panel1都行
    Width:=10;
    height:=10;
    Left:=ScreenToClient(PT).X;
    Top:=ScreenToClient(PT).Y;
    OnClick:=ButtonClick;
    OnMouseMove:=ButtonMouseMove;
    Show;
  end;
end;end.

解决方案 »

  1.   

    也就是说我的那个
    For I:=0 To Form1.ComponentsCount-1 do 这个只对第一次创建的按钮起做用..不知道为什么会是这个样子的..
      

  2.   

    不会吧,老兄忘记了,害我陪你瞎弄了半天
    For I:=0 To Form1.ComponentsCount-1 do 
    begin             //忘记了这句吧?end;
      

  3.   

    呵呵,木兄实在是不仔细啊,你看看
      For I:=0 to Form1.ComponentCount-1 do
     
      begin//你看看这里是不是少了一个begin呢,呵呵    Temp:=Form1.Components[i];
        //这个begin是多余的
          if (Sender is TButton) then
            begin
            X:=TButton(Temp).Left;  //记录下当前按钮的Left位置,
            Y:=TButton(Temp).Top;   //记录下当前按钮的Top位置
            TButton(Temp).Left:=X div 2;
            TButton(Temp).Top:=Y div 2;
            Panel1.Refresh;
            Image1.Refresh;
            Form1.Refresh;
            end;
        end;