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编辑环境下那样可以用鼠标直接拉伸其长或宽,拜托大家了。
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编辑环境下那样可以用鼠标直接拉伸其长或宽,拜托大家了。
这貌似讲的很详细了
不過你的問題是一個小問題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.
Tshape(Sender).Top :=Tshape(Sender).Top + yPos;
---------------------
Tshape(Sender).Left,Tshape(Sender).Top,是在变化的,作为参考点有问题。这个参考点要在MouseDown的时候记下来.
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.