unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Shape1: TShape;
    Edit2: TEdit;
    Edit3: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    FMouseDownX,FMouseDownY:Integer;
    FMouseDownFlag:Boolean;
    procedure MyshapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure MyShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure MyShapeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  public
    { Public declarations }  end;
  TempData=Record
  Value:integer;
  StartTime:integer;
  factvalue :integer;
  shapetemp :Tshape;
  end;
var
  Form1: TForm1;
  Q :array of TempData;implementation{$R *.dfm}procedure Tform1.MyShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button =MBLEFT then
    begin
      self.FMouseDownFlag :=true;
      self.FMouseDownX :=X;
      self.FMouseDownY :=Y;
    end;
end;procedure TForm1.MyshapeMouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer);
  var xPos, yPos :integer;
begin
  if not self.FMouseDownFlag then
    exit;
  xPos :=X-self.FMouseDownX;
  xPos :=Y-self.FMouseDownY;
  Tshape(Sender).Left :=Tshape(Sender).Left + xPos;  //这句话有问题吗?
  Tshape(Sender).Top :=Tshape(Sender).Top + yPos;
end;procedure Tform1.MyShapeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  self.FMouseDownFlag :=false;
  self.FMouseDownX :=0;
  self.FMouseDownY :=0;
end;procedure TForm1.Button1Click(Sender: TObject);
var  i,RowSpace,ChartsHeight :integer;
begin
  RowSpace:=20; // Shape控件行间距
  ChartsHeight:=20; // Shape控件高度
  setlength(Q,5);
  for i :=0 to 4 do
    begin
      Q[i].StartTime :=10;
      Q[i].Value :=50;
      Q[i].factvalue :=30;
      Q[i].shapetemp :=TShape.Create(self);
      with Q[i].shapetemp do
        begin
          Parent:=Self; //此行必不可少, 否则Shape控件在屏幕显示不出
          Shape:=stRectangle; // Shape控件形状为矩形
          Top:=45+i*(RowSpace+ChartsHeight); //每个shape的高度位置=控件行间距+控件的高度;
          Left:=180+Q[i].StartTime;  
          Width:=Q[i].Value;
          Height:=ChartsHeight;
          Brush.Color:=clWhite;
          Brush.Style:=bsSolid; 
          Enabled:=True;
          OnMouseDown :=self.MyShapeMouseDown;   //这样赋值有问题吗?
          OnMouseMove :=self.MyshapeMouseMove;
          OnMouseUp :=self.MyShapeMouseUp;
        end;
    end;
end;end.以上是我的代码,但是实现的效果却很夸张,鼠标一点,拖动的时候,shape控件就不知道跑哪里去了,不知道是我哪里写错了,
我想动态创建出shape控件,并使其在运行时可以对其进行拖放,主要是不知道onmousedown,onmousemove,onmouseup这三个事件具体要怎么实现?
请大家帮帮忙了,谢谢了,
还有就是要怎么实现在运行时,用户可以改变shape的大小,就象在IDE编辑环境下那样可以用鼠标直接拉伸其长或宽,拜托大家了。

解决方案 »

  1.   

    这个可以实现!我可以帮你实现任意控件回到IDE编辑环境。不过我希望你再加点分。
      

  2.   

    http://fengfan.blog.163.com/blog/static/134786220088983359892/
    这貌似讲的很详细了
      

  3.   

    我以前寫都是參考http://fengfan.blog.163.com/blog/static/134786220088983359892/裡的內容。
    不過你的問題是一個小問題unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TempData=Record 
        Value:integer;
        StartTime:integer;
        factvalue :integer;
        shapetemp :Tshape;
      end;  TForm1 = class(TForm)
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
      private
        Q :array of TempData;
        FMouseDownX,FMouseDownY:Integer; 
        FMouseDownFlag:Boolean; 
        procedure MyshapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
        procedure MyShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
        procedure MyShapeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
        { Private declarations }
      public
        { Public declarations }
      end;
    var
      Form1: TForm1;implementation{$R *.dfm}
    procedure Tform1.MyShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
    begin 
      if Button =MBLEFT then 
      begin
          self.FMouseDownFlag :=true; 
          self.FMouseDownX :=X; 
          self.FMouseDownY :=Y; 
      end; 
    end; procedure TForm1.MyshapeMouseMove(Sender: TObject; Shift: TShiftState;X, Y: Integer); 
    var
     xPos, yPos :integer;
    begin 
      if not self.FMouseDownFlag then
        exit;
      xPos :=X-self.FMouseDownX;
      yPos :=Y-self.FMouseDownY;//你原來的為xPos :=Y-self.FMouseDownY;改過後OK//
      Tshape(Sender).Left :=Tshape(Sender).Left + xPos;  //?句?有????
      Tshape(Sender).Top :=Tshape(Sender).Top + yPos;
    end;procedure Tform1.MyShapeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
    begin
      self.FMouseDownFlag :=false;
      self.FMouseDownX :=0; 
      self.FMouseDownY :=0;
    end;procedure TForm1.btn1Click(Sender: TObject);
    var
      i,RowSpace,ChartsHeight :integer;
    begin 
      RowSpace:=20; // Shape控件行?距
      ChartsHeight:=20; // Shape控件高度 
      setlength(Q,5);
      for i :=0 to 4 do
        begin
          Q[i].StartTime :=10; 
          Q[i].Value :=50; 
          Q[i].factvalue :=30; 
          Q[i].shapetemp :=TShape.Create(self); 
          with Q[i].shapetemp do 
            begin 
              Parent:=Self; //此行必不可少, 否?Shape控件在屏幕?示不出 
              Shape:=stRectangle; // Shape控件形??矩形 
              Top:=45+i*(RowSpace+ChartsHeight); //每?shape的高度位置=控件行?距+控件的高度; 
              Left:=180+Q[i].StartTime;  
              Width:=Q[i].Value; 
              Height:=ChartsHeight; 
              Brush.Color:=clWhite; 
              Brush.Style:=bsSolid; 
              Enabled:=True; 
              OnMouseDown :=self.MyShapeMouseDown;  //???值有???? 
              OnMouseMove :=self.MyshapeMouseMove; 
              OnMouseUp :=self.MyShapeMouseUp; 
            end; 
        end;
    end;end.
      

  4.   

      Tshape(Sender).Left :=Tshape(Sender).Left + xPos;  //这句话有问题吗? 
      Tshape(Sender).Top :=Tshape(Sender).Top + yPos; 
    ---------------------
    Tshape(Sender).Left,Tshape(Sender).Top,是在变化的,作为参考点有问题。这个参考点要在MouseDown的时候记下来.
      

  5.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;type
      TForm1 = class(TForm)
        Shape1: TShape;
        procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
      private
        { Private declarations }
        FBaseShapPoint:TPoint;
        FCursorBasePoint:TPoint;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Types;{$R *.dfm}procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
       FBaseShapPoint.X:=(Sender as TShape).Left;
       FBaseShapPoint.Y:=(Sender as TShape).Top;
       FCursorBasePoint.X:=Mouse.CursorPos.X;
       FCursorBasePoint.Y:=Mouse.CursorPos.Y;
    end;procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if ssLeft in Shift then
      begin
        with Sender as TShape do
        begin
          Left:=FBaseShapPoint.X+(Mouse.CursorPos.X-FCursorBasePoint.X);
          Top:=FBaseShapPoint.Y+(Mouse.CursorPos.Y-FCursorBasePoint.Y);
        end;
      end;
    end;end.