帮忙看看下面的程序有什么问题,控件数组不能正常释放,程序关闭是出错?谢谢!(50分)

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

bcahz

Unregistered / Unconfirmed
GUEST, unregistred user!
unit UFORmclass;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
myfirstform:array[1..100] of tmyform;
temphw:hwnd;
mfreeit:array [1..100] of boolean;
museit:array [1..100] of boolean;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 100 do
begin
if museit=false then
begin
myfirstform:= tmyform.Create(self);
mfreeit:=false;
museit:=true;
myfirstform.frm.tag:=i;
myfirstform.show;
break;
end;
// temphw:=findwindow('tform','aa');
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
// myfirstform.free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
i,j:integer;
begin
for i:=0 to 100 do
begin
if mfreeit=true then
begin
myfirstform.free;
mfreeit:=false;
museit:=false;
end;
end;
end;

end.

unit Unit2;

interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
tmyform = class(TComponent)
frm :tform;
firstbutton:tbutton;
// tag:string;
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
// destructor frmDestroy;
procedure show;
// procedure frmclose(Sender: TObject; var Action: TCloseAction);
procedure myclick(sender:tobject);
// procedure myclick();
// procedure formclose(Sender: TObject; var Action: TCloseAction);
end;
implementation
uses
uformclass;
{ tmyform }

{procedure tmyform.frmclose(Sender: TObject; var Action: TCloseAction);
begin
// tmyform.free;
end;}
destructor tmyform.Destroy;
begin
firstbutton.Free;
frm.free;
frm:=nil;
inherited Destroy;

end;
procedure tmyform.myclick(sender:tobject);
begin
showmessage('ok');
mfreeit[frm.Tag]:=true;
//sendmessage(temphw,wm_close,0,0);
end;

constructor tmyform.Create(AOwner:TComponent);
begin
inherited Create(AOwner);

frm:=TForm.Create(APPLICATION);
// frm.parent:=frm;
frm.AutoScroll:=false;
// frm.caption:='aa';
// frm.name:='bb';
// frm.Hide;
// frm.onclose:=frmclose;
firstbutton := tbutton.create(FRM);
firstbutton.parent := frm;
firstbutton.onclick:=myclick;
firstbutton.Left := 23;
firstbutton.Top := 90;
frm.tag:=0;
end;

procedure tmyform.show;
begin
// frm.ShowModal;
frm.Show;
end;


{destructor tmyform.frmDestroy();
begin
tmyform.free;
end;}

{procedure tmyform.formclose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
end;}
end.

***************************



 
我试验了一下你的程序,没有什么错误。
是不是你的环境有点问题
我的环境是 Windows98 + Delphi5
 
早两次生成FRM后,退出程序报错!
 
当两次 Click Button1 时候 有两个窗口被创建,名字都是 frm, 而且 两个 frm 的 Ower
都是 Application .frm 相当于一个窗口的句柄.
第二个 frm 创建时 第一个 frm 没有句柄 可以引用.
就产生一块内存泄漏.


 
expect说的有道理,而且我觉得下面这个地方应该这么写:
procedure tmyform.frmclose(Sender: TObject; var Action: TCloseAction);
begin
// tmyform.free;
Action:=caFree;
end;
另外我以前写的东西在过程编译的时候被delphi忽略了,不知道怎么回事:
destructor tmyform.Destroy;
begin
frm:=nil;
end;

关注此问题中。。。。。。。。
 
expect说的那处我想是没问题的,每个frm属于不同的对象实例


procedure TForm1.Timer1Timer(Sender: TObject);
var
i,j:integer;
begin
for i:=0 to 100 do
begin
if mfreeit=true then
begin
myfirstform.free;
// 我认为在这里最好还是加一句myfirstform:=nil;
mfreeit:=false;
museit:=false;
end;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 100 do
begin
if museit=false then
begin
//也加一句在这里if not myfirstform.assigned....之类的试试
myfirstform:= tmyform.Create(self);
mfreeit:=false;
museit:=true;
myfirstform.frm.tag:=i;
myfirstform.show;
break;
end;
// temphw:=findwindow('tform','aa');
end;
end;
 
接受答案了.
 
后退
顶部