动态创建的图象如何移动?如何用带箭头的线把两个动态创建的图象连接起来?(100分)

  • 主题发起人 主题发起人 blueearth
  • 开始时间 开始时间
B

blueearth

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.FormClick(Sender: TObject);
aBitmap:=TBitmap.Create;
aBitmap.LoadFromFile('c:/Bitmap1.bmp');
form1.Canvas.Draw(x_panel,y_panel,aBitmap);
1.通过点击FORM把我把c盘下的BITMAP1.BMP图片画到FORM上,谁有移动这个创建的图片的程序吗?
或者别的方法调用图片也行!
2.再如何把如上动态创建的图片用一条带箭头的线连接起来(用鼠标分别点击两个图片就画如此
的射线或者直线也可以)
 
图像要移动,最好用一个控件,如TImage,虽然不用也可以!

线和箭头,可以用画的,Canvas.LineTo
 
netfool,你好
我现在要实现的就是鼠标每点击一次界面就增加一张图片,如何在CLICK事件中创建TIMAGE?
LINETO好像起始点是0,0吧,我现在要在两图片点击就连接呢?或者如何把鼠标点击的两点连
起来也可以!谢谢!
 
FormClick时
代码:
var
  img: TImage;
begin
  img := TImage.Create;
  try
     img.Picture.LoadFromFile('');
     ...
  except
     ...;
  end;
end;

LineTo默认起点是0, 0, 可以用MoveTo移动
OnMouseUp/OnMouseMove,可以得到Mouse坐标
 
先获得点击的位置坐标再划线,关键是位置坐标,图片控
件有坐标,鼠标点击可以用GETCURPOS函数得到。
 
netfool,
img := TImage.Create;这样创建的图片如何移动?
如果在IMG里写ONMOUSEDOWN 等事件?
 
平凡人,你好
GETCURPOs如何用?能举例否?
 
你要制作能够画出想UML图的软件吗?那可不是一两句能说清楚的呀。
我也不知道,帮你提前吧。[:D]
 
blueearth(忧郁大地),呵!

你这样不好,人家给你一个函数了,已经很好了,你也不看看HELP....不好!
还有,你得先看看所有VCL组件的一些通用属性,方法和事件,只有这样之后你才有希望写出个东西!
 
netfool,好
函数我已经找到
img := TImage.Create;这样创建的图片如何移动?
如何在IMG里写ONMOUSEDOWN 等事件?
是分感谢
 
一般下,控件有下列属性:
Left, Top...只说这两个吧,其它的看看HELP;

Object Inspecter有Properties, Events两个TAB
在Properties里是当前对象所有的属性
在Events里是当前对象支持的所有事件

 
netfool,你好!
再麻烦你了
img := TImage.Create;这样创建的图片如何移动?
如何在IMG里写ONMOUSEDOWN 等事件?
我试了一下TNotifyEvent,还不是非常明白
请问你做过这样的移动吗?能给你框架吗?实例最好,我把分数全给你了!
 
在窗口上放二个按钮button1和button2,在button1按钮Click事件中,装入图片,在button2
按钮Click事件中移动图片,同时将Button2按钮的OnClick事件过程赋值给了TImage.onclick
你击图片试试。
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
img:TImage;
{ Public declarations }
end;
var
Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
img:=TImage.Create(self);
try
img.Picture.LoadFromFile('11.bmp');
img.Parent:=self;
img.OnClick:=button2click; //图片的Click事件过程是将button2的click事件过程
赋值给它的,我注意到你的问题,可能是你不知道事件过程怎样运行时赋值,其实说白了
很简单,你写好过程(过程一定要符合事件过程的参数要求,即TNotifyEventr所说明的
再将过程名赋值给对应的事件属性名就可以了。
应该说清楚了吧!
img.Visible:=true;
except
img.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
img.Top:=img.Top+3;
img.Left:=img.Left+3;
end;
end.
 
平凡人,谢谢你的回答
图片移动问题我自己已经解决了
现在问你最后一个问题,img := TImage.Create;这样创建的图片之间如何用直线(最好带箭头)连接起来?
图片移动那么线也跟着移动?
 
有专门的矢量图编辑系统组件,在www.51delphi.com!
 
你这个问题有点复杂,我给你一个建议看行不行:
1、将动态创建的TImage对象存入TList对象中,同时设置直线起点座标或终点座标属性,最好还
设置一个直线指向的TImage对象的属性
2、每建立一个TImage对象时,将这些属性值都写入TList对象中,这样,所有的图片及直线
的所有信息在TLIST中都有了,记住存入TLIST中的对象都要自己释放。
3、在窗体的ONPAINT事件中重画所有的直线,移动时,只要即时更改直线座标就可以了。
这种方法肯定行的,但还有一些小麻烦,总的思路就这样。
 
平凡人,
非常感谢你耐心的回答
我还想再请教你一个问题,就是我现在打算建立一个图片类,里面包括图片名称,图片(bmp),
,坐标等。然后我在每动态创建一个图片时候,就把这个图片赋值给我创建的那个图片类,
现在问题是,我怎么区分我动态创建的那些图片?
你能帮我简单设计这个类及做的想法吗?
我很想认识你,我QQ 99664175
 
img:=TImage.Create(self);
如此创建的图片如何选中并删除?
 
在mousemove中控制坐标,我就是这么做的。你检索以下,很多的。
 
一个简单的类
unit pub;

interface
uses system,ExtCtrls;

type
TMyImage=class(Tcomponent)
private
FPicFileName:string;
FPosX,FPosY:integer;
FLineDir:integer; //直线标志,-1表示没有,0直线起点,1直线终点
FImage:TImage;
public
constructor Create(image:TImage;picFileName:string);
destructor Destroy;
end;


implementation

constructor TMyImage.Create(image:TImage,picFileName:string);
begin
inherited Create;
FPicFileName:=picFileName;
FImage:=image;
FPosX:=image.Left;
FPosY:=image.Top;
FLineDir:=-1;
end;

destructor TMyImage.Destroy;
begin
FImage.Free;
FPicFileName:='';
FPosX:=-1;
FPosY:=-1;
FLineDir:=-1;
end;
end.
对于怎样区分动态创建的图片你可以利用TIMAGE.TAG写入编号就可以了。
我的QQ:108472281
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部