当前位置:主页>销售管理软件> 列表

动态创建控件后释放时出错

财务软件版1楼: 程序如下,点button1时在图片上放置一个小的Image,在点button2的时候点到哪个小的image就删除它
在运行时随机的出现错误,提示信息是Access Violation at Address ,有时候出错的信息又是 Abstract Error



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Image1: TImage;
Button2: TButton;
Button1: TButton;
procedure Image1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FState, tmp: Integer;
procedure onDeviceClick(Sender: TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Image1Click(Sender: TObject);
var
PosX, PosY: Integer;
begin
if FState = 1 then
begin
PosX := Panel2.ScreenToClient(Mouse.CursorPos).X;
PosY := Panel2.ScreenToClient(Mouse.CursorPos).Y;
with TImage.Create(Panel2) do
begin
Parent := Panel2;
Left := PosX;
Top := PosY;
Stretch := True;
Tag := tmp;
Picture.LoadFromFile(''H:\1.jpg'');
OnClick := onDeviceClick;
end;
inc(tmp);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FState := 1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
FState := 2;
end;

procedure TForm1.onDeviceClick(Sender: TObject);
var
ILoop, ClickTag: Integer;
begin
{ if FState = 2 then
begin
ClickTag := (Sender as TImage).Tag;
for ILoop := Panel2.ComponentCount - 1 downto 0 do
begin
if Panel2.Components[ILoop].Tag = ClickTag then
begin
Panel2.Components[ILoop].Free;
break;
end;
end;
end;
}
if FState = 2 then
begin
(Sender as TImage).Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
tmp := 200;
end;

end.

2楼: (Sender as TImage).Free;
这个Sender是Image1,而你另外创建了一个Image对象,名称可能自动命名为Image2了。
你在创建时可命名一下,Free时就直接Free新命名的Image。
不过很奇怪,不是已有Image1了,还创建什么?为了点击吗?为何不用按钮? 如管理软件下载

3楼: 这个Sender 是我动态创建出来的Image ,因为在创建这些Image的时候给的onClick事件确定为onDeviceClick,而Image1的onClick的时候是不会触发这个事件的,因此不会释放。
另外,我在测试错误的过程中发现我动态创建的Image没有Name属性,我也很奇怪。
还有,(Sender as TImage).Free;这句不会保错,是在onDeviceClick结束后保错。

4楼: TImage.Create(Panel2) 这个语句有问题,Image的属主应该为form1,否则会出现错误。正确的语句应该为 with TImage.Create(self) do

5楼: to: yleagle


TImage.Create(Panel2) 这个语句有问题,Image的属主应该为form1,否则会出现错误。
你是说会出什么错误啊 ?
我改为Self试过了,还是同样的错误……

6楼: 不要试图在控件的事件中释放本身

财务软件版7楼: to: ysai
不要试图在控件的事件中释放本身
??
你的意思是说在控件的事件中释放本身就会出错?能说说原因吗 ?

8楼: 如果自己释放的话,TImage.Create(Panel2) 改成TImage.Create(nil) 就行了

9楼: to: ysai
多谢,多谢,就是这样的了,
另外,我想问问怎么才能给你留消息或是什么的啊 ?

10楼: 你在image自己的onclick事件里free了自己,事件结束后的image还有要执行的代码,可是这时他已经被free了,当然会出内存错误。。。。

11楼: 这里不能发离线消息
我现在工作不用DELPHI,没事上来转转而已

12楼: 改改你的程序吧,看看free的帮助文件:

Warning: Never explicitly free a component within one of its own event handlers or the event handler of a component it owns or contains. For example, don`t free a button, or the form that owns the button, in its OnClick event handler.

不要尝试在自己的事件里释放自己 如万能档案管理软件

13楼: 多谢,多谢



上一篇:如何合并表中的数据项?   下一篇:没有了