有关动态创建Image的数个问题!!!有难有易,您总会有拿手的:)好多年都没有解决了!!!!!!!!!!!!!(50分)

  • 主题发起人 主题发起人 hunyuan
  • 开始时间 开始时间
H

hunyuan

Unregistered / Unconfirmed
GUEST, unregistred user!


1、动态创建Image,因为不知道要用的个数,几个到几十个不等,
能否只创建一次,然后在Form上同时在不同位置显示?如果不能,我必须得创建几十个Image吗?
2、如何实现Image的闪动效果(棋子被吃时的动态显示)?怎么处理效果理想?
3、为何动态创建的Image释放出错?代码如下:
procedure TfrmMain.AllFree();
var i:Integer;
begin
try
for i:=0 to 9 do
begin
if Assigned(imgZhi) then
imgZhi.Free;
if Assigned(imgXie) then
imgXie.Free;
if Assigned(imgSan) then
imgSan.Free;
if Assigned(imgJiu) then
imgJiu.Free;
if Assigned(imgPalace) then
imgPalace.Free;
end;
{for i:=1 to 2 do
begin
imgZhi.Free;
imgJiu.Free;
end;
for i:=1 to 4 do
begin
imgXie.Free;
imgSan.Free;
end;
for i:=1 to 6 do
begin
//imgDoor.Free;
imgPalace.Free;
end;}
except

end;

end;
因为前面程序可能做过释放操作了,所以在这里经常出错,
我用Assigned(…) 判断了,为什么还出错?
这个过程放在Form的Destroy过程,和重新开始、结束一局棋的过程中,
经常报错啊。当然脱离Delphi环境运行可以,可是这个问题解决啊!!!

非常感谢了!都是Delphi发烧友,帮我一把吧!!!!5555
 
1、你完全可以使用同样的一段代码来创建,只是left、Right使用函数赋值而已。
对于动态创建的控件,可以使用数组来定义。
如:
VAR
Image1: array[0..20] of TImage;
使用的时候是Image1来访问

 
2、你所说的闪动效果,其实就是相当于改变Image里面的图象的问题。
只要你使用一个循环来改变里面的图象,同时不断Refresh,就可以了。
 
3、你出错的原因是,控件Free后,使用Assigned判断还不是空。
必须手工置空。
在此句后面加上
imgPalace.Free;
imgPalace:=nil;
 
var image:array of Timage;
调用: image[1]
 
1、第一个问题只能这样吗?
我就是这么做的啊,用数组。

这个是动态数组吧,var image:array of Timage;
调用前要设置长度吗?不想一下子创建那么多的图片,用一个建一个可行吗?

2、可以用Timer吧,控制图片的Visable

3、我试试

感谢二位

 
2、使用Timer也可以,也可以直接使用循环,里面增加Application.ProcessMessage
 
2、图片不可能VISIBLE的,要就是改IMAGE的VISABLE,要就是改IMAGE的PICTURE属性:)
1、还是用动态数组的好,用SETLENGTH可以改变数组的大小,比如你现在是在做一个下棋的
游戏(黑白棋还是五子棋啊),那么,在鼠标CLICK后,获得CLICKE的POINT所在点,就以那个
点为中心,用SETLENGTH把动态数组+1,新加的IMAGE对象的位置就定在那^_^
 
第三个问题怎么也没解决了!
try
for i:=0 to 9 do
begin
if Assigned(imgZhi) then
imgZhi.Free;
imgZhi:=nil;
……
这样也不行啊,还是出错,因为我的程序中只创建了imgZhi[1]和imgZhi[2],那么用Assigned
判断还出错吗?
大家帮我啊
 
你加一个Begin end呀。
if Assigned(imgZhi) then
begin
imgZhi.Free;
imgZhi:=nil
end
 
呵呵,已经加了啊
try
if Assigned(imgHot) then
begin
imgHot.Free;
imgHot:=nil;
end;
 
建议用TImageList!!!
 
这样,估计还需要你自己调一下代码,将没有错误的代码注释调,然后提炼出精简的出错代码
分析或者贴上来。
 
对了,错误提示是什么?ACCESS VIOLATION吗?
 
错误提示是ACCESS VIOLATION,为什么呢?我程序只有释放这一块出错啊
 
不妨将出错的代码挑拣重要的贴上来吧,你的Free部分暂时看不出来问题了。
 
yzhshi:
非常感谢你的热心帮助,我发现了其中的两个错误,明天调试如果还不行,
我就发上来所有的代码,现在不知道发哪部分,感觉都没错啊:)
 
调试错误代码是一种能力,慢慢锻炼吧。
 
释放过程反过来:
procedure TfrmMain.AllFree();
var i:Integer;
begin
try
for i:=9 downto 0 do //
begin
if Assigned(imgZhi) then
imgZhi.Free;
if Assigned(imgXie) then
imgXie.Free;
if Assigned(imgSan) then
imgSan.Free;
if Assigned(imgJiu) then
imgJiu.Free;
if Assigned(imgPalace) then
imgPalace.Free;
end;
{for i:=1 to 2 do
begin
imgZhi.Free;
imgJiu.Free;
end;
for i:=1 to 4 do
begin
imgXie.Free;
imgSan.Free;
end;
for i:=1 to 6 do
begin
//imgDoor.Free;
imgPalace.Free;
end;}
except

end;

end;
 
[blue][/blue]全是废话!没有 一个敢说自己是老大的,你们为什么不去看看我的问题,我问了一年了!没有
人回答真让我感觉到这里的技术是不是已经过时了,或者是这是这里的人已经不
是做编程的!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=719446
http://www.delphibbs.com/delphibbs/dispq.asp?lid=666070
http://www.delphibbs.com/delphibbs/dispq.asp?lid=716037
http://www.delphibbs.com/delphibbs/dispq.asp?lid=730641
http://www.delphibbs.com/delphibbs/dispq.asp?lid=655233
如果能有人回答这些问题才是真的高手呀!
 
后退
顶部