线程中删除图片的问题!

yinweixian 2009-09-24 03:39:59
我在线程中写删除主界面上的一个图标。代码如下:
procedure GMyThread.Execute;
var
i:integer;
begin
for i:=pan[0].ControlCount-1 downto 0 do
if (pan[0].Controls[i].Left=123) and (pan[0].Controls[i].Top=118) then
(pan[0].Controls[i] as TImage).Free;
end;

pan是主界面上定义的一个全局的panel数组,想要删除pan[0]中位置是(123,118)的图标。

主界面是MainForm,我早MainForm.FormShow中调用线程就能正常删除图标;但是当我点击按钮button去调用线程删除图标时就出错了,出错的提示是Access violation at address 77F8F281 in module 'ntdll.dll'.Write of address 00000010.

到底是什么问题啊?为什么在FormShow中就不会出错呢?
...全文
74 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
modaoshi3002 2009-09-26
  • 打赏
  • 举报
回复
这个TImage,如果是一开始就放在主界面上的话,它有个属主属性,是指向主界面的,在主界面注销时,会自动注销这个TImage,所以这个是不应该自己手动去free,否则会导致二次free。
你要不还是把这图片隐藏掉算了。
阿发伯 2009-09-26
  • 打赏
  • 举报
回复
修改一下,应该可以的(随手修改,没作测试,供参考):

procedure GMyThread.FreeImage; //增加一个方法
var
i:integer;
begin
for i:=pan[0].ControlCount-1 downto 0 do
if (pan[0].Controls[i].Left=123) and (pan[0].Controls[i].Top=118) then
begin
(pan[0].Controls[i] as TImage).Parent := nil;
(pan[0].Controls[i] as TImage).Owner.RemoveComponent(Self);
(pan[0].Controls[i] as TImage).Free;
end;
end;

procedure GMyThread.Execute;
begin
Synchronize(FreeImage);
end;
风之谷 2009-09-24
  • 打赏
  • 举报
回复
同步后就相当于没使用线程,有什么意思啊。~
火龙岛主 2009-09-24
  • 打赏
  • 举报
回复
处理主线程内容的时候需要使用同步功能!
如:
procedure TMyThread.PushTheButton;

begin
Button1.Click();
end;

procedure TMyThread.Execute;
begin
...
Synchronize(PushTheButton);
...
end;
dahai9825 2009-09-24
  • 打赏
  • 举报
回复
free完一个之后ControlCount会自动减一的 加上一个break看看 另外你在线程里面操作GUI你最好要考虑同步的问题

procedure GMyThread.Execute;
var
i:integer;
begin
for i:=pan[0].ControlCount-1 downto 0 do
if (pan[0].Controls[i].Left=123) and (pan[0].Controls[i].Top=118) then
begin
(pan[0].Controls[i] as TImage).Free;
break;
end;
end;

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧