创建与销毁控件的一点问题,请指点一下。 ( 积分: 50 )

  • 主题发起人 主题发起人 newsofter
  • 开始时间 开始时间
N

newsofter

Unregistered / Unconfirmed
GUEST, unregistred user!
您好,我这里做一个软件,鼠标点到FORM上,自动创建一个IMAGE,记录下X,Y坐标,然后在点到其它地方,上次创建的IMAGE要销毁,然后再记录新控件的X,Y坐标,不知道如何实现,谢谢您告诉我。
 
您好,我这里做一个软件,鼠标点到FORM上,自动创建一个IMAGE,记录下X,Y坐标,然后在点到其它地方,上次创建的IMAGE要销毁,然后再记录新控件的X,Y坐标,不知道如何实现,谢谢您告诉我。
 
procedure TForm1.FormMouseDown(Sender: TObject
Button: TMouseButton;
Shift: TShiftState
X, Y: Integer);
begin
FPoint.X := X;
FPoint.Y := Y;
self.Canvas.TextOut(20,10,'X:'+IntToStr(FPoint.X)+';Y:'+IntToStr(FPoint.Y));
CreateImage;
end;

procedure TForm1.CreateImage;
begin
if Assigned(FImage) then
FreeAndNil(FImage);
FImage := TImage.Create(nil);
FImage.Top := FPoint.Y;
FImage.Left := FPoint.X;
FImage.Parent := self;
FImage.Width := 64;
FImage.Height := 64;
FImage.Picture.LoadFromFile('G:/Icon/图标/winxp/application/application/dd.ico');
end;

楼主,这种每次都动态创建的方法很消耗资源,使用起来要注意阿
 
谢谢楼上的兄弟,假如FORM上CREATE了多个TIMAGE,如何通过命令来销毁他们,还有就是如果知道多个坐标,又如何依次的CREATE这些IMAGE呢。
 
for i:=0 to Self.ComponentCount-1 do
if assined(Self.Components) and (Self.Components is TImage) then
FreeAndNil(TImage(Self.Components));


var
i,j:integer;
p:array[0..10] of TPoint;
image:array[0..10] of TImage;
begin
for i:=0 to 10 do
begin
p.x:=50*i+30;
p.y:=30;
end;
for j:=0 to 10 do
begin
image[j] := TImage.Create(Self);
with image[j] do
begin
Top := p[j].Y;
Left := p[j].X;
Parent := Self;
Width := 64;
Height := 64;
Picture.LoadFromFile('C:/tadd.bmp');
end;
end;
end
 
楼上的方法是可行地,不过楼主可以将这两个数组设为动态数组,这样动态的设定数组的长度,方便使用。
另外,楼上的兄弟写的这段代码执行起来估计会出错,因为在Create的时候,用的Self,这样,如果你已经释放了某些Image,在窗体销毁的时候,仍然会释放他,这样就会产生地址读取错误。按照楼主的思路,最好为Create(nil)
还有,释放的时候,既然已经设定了数组,就按数组循环,一减少循环次数,二不用再判断对象类型,省劲!别忘了最后把两个数组长度设为0,防止不必要的内存泄漏阿[:)]
 
后退
顶部