如何释放内存占用?(25分)

  • 主题发起人 主题发起人 liyipeng
  • 开始时间 开始时间
L

liyipeng

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序想在关闭窗体的时候释放内存,我在窗体的FormDestroy事件中加了一句Close命令
但是不管用,请问应该如何解决?
 
将Form从Project->Options->AutoCreateForm中去除自动创建(除主窗口外)
参考以下代码
unit Unit1;

interface

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

type
TForm1 = class(TForm)
ModalFrm: TButton;
ModalessFrm: TButton;
procedure ModalFrmClick(Sender: TObject);
procedure ModalessFrmClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2, Unit3;

{$R *.DFM}

procedure TForm1.ModalFrmClick(Sender: TObject);
begin
if not Assigned(Form2) then
Form2:=TForm2.Create(self);
try
Form2.ShowModal;
finally
Form2.Free;
Form2:=nil;
end;
end;

procedure TForm1.ModalessFrmClick(Sender: TObject);
begin
if not Assigned(Form3) then
Form3:=TForm3.Create(self);
Form3.Show;
end;

end.

{-----------------Form3------------------------------}
procedure TForm3.FormDestroy(Sender: TObject);
begin
Form3:=nil;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

end.
 
//释放控件
for i:=0 to ComponentCount-1 do
begin
ComponentCount.free;
end;
//如果是你new的
point:TPointer;
new(point);
......
Dispose(point);
 
几位可能是没有明白我的问题,我的意思其实是相当于程序运行结束后用什么将整个程序
的内存占用释放,比如VB的END语句,以前我使用DELPHI的CLOSE命令,但是这个命令有时候
有用,有时候没有,我的程序有两个窗体,第一个是一个口令确认,在这里CLOSE有效,但
到了主界面,CLOSE就没有用了?
 
release无效,说白了吧,你们在你们的程序的关闭处理上是如何做的?这个关闭是指关闭整个
应用程序,不是某个窗体?
 
就如pcexplorer说的
在窗口的Close中指定Action;
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
然后在窗口的Destroy中让Form:=nil;
procedure TForm3.FormDestroy(Sender: TObject);
begin
Form3:=nil;
end;
 
一般情况下不用管那些的。

如果对于动态创建的如用create()创建的对象。

最后用完后用.free。释放。对于数组、指针、或session什么的只有自己干这事。

把它们free掉!

其它的程序会自动自理。

我想是这样的。
 
我觉得也应该不用自己处理这些事情,但是每次我将程序关闭后,在进程管理器或是任务
管理器中,都会发现我的程序的名字没有消失,如果运行5次,就有5个,我想这个也不正
常吧?
 
正常情况下程序关闭后就会被完全释放,这是系统的事情,不用你多操心了。
至于你的程序会没消失,肯定是你程序有问题,你的程序是普通的应用程序还是有着什么
特殊的用途,使用了特别的技术?
 
//这个是第一个窗体的代码
unit LgWin;

interface

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

type
TLoginForm = class(TForm)
Label1: TLabel;
Label2: TLabel;
LgName: TEdit;
LgPassword: TEdit;
YesBtn: TButton;
NoBtn: TButton;
Image1: TImage;
LgQY: TQuery;
Database1: TDatabase;
procedure YesBtnClick(Sender: TObject);
procedure NoBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
LoginForm: TLoginForm;

implementation

uses MainWin;

{$R *.DFM}

procedure TLoginForm.YesBtnClick(Sender: TObject);
begin
LgQY.SQL.Clear
LgQY.SQL.Add ('Select * From UserInfo Where UserName = ''' + LgName.Text + ''' And UserPassWord =''' + LgPassword.Text + '''');
LgQY.ExecSQL
LgQY.Active := True;
IF LgQY.RecordCount = 0 Then
Application.MessageBox('您的信息没有查到,无法确认身份!','登录',mb_Ok + mb_IconInformation)
Else
begin
MainForm.Show;
Self.Release;
end;
end;

procedure TLoginForm.NoBtnClick(Sender: TObject);
begin
Close
end;

end.

//这个是第二个窗体的代码
unit MainWin;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ImgList, ComCtrls, DBTables, StdCtrls, Grids, DBGrids;

type
TMainForm = class(TForm)
InfoTree: TTreeView;
SysImgList: TImageList;
InfoGrid: TDBGrid;
InfoQY: TQuery;
Database: TDatabase;
InfoDS: TDataSource;
Button1: TButton;
Button2: TButton;
SetGroup: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
GroupBox1: TGroupBox;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Button8: TButton;
Button9: TButton;
Button10: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure FormCreate(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
RootNode: TTreeNode;

end;

var
MainForm: TMainForm;

implementation

{$R *.DFM}

procedure DBQuery(SQLStr: string D2TQuery: TQuery);
begin
D2TQuery.SQL.Clear
D2TQuery.SQL.Add(SQLStr)
D2TQuery.ExecSQL
If D2TQuery.Active <> True Then
D2TQuery.Active := True
end;

procedure DBToTree(var TTmpNode: TTreeNode TInfoTree: TTreeView strNodeInfo: String AddMode: Integer);
var
TmpND: TTreeNode;
begin
If AddMode = 0 Then
TTmpNode:= TInfoTree.Items.Add(Nil,strNodeInfo)
Else
begin
TmpND:= TInfoTree.Items.AddChild(TTmpNode,strNodeInfo);
TmpND.ImageIndex := 1;
end;

end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
If InfoQY.Active <> True Then InfoQY.Active:= True;
end;

procedure TMainForm.Button2Click(Sender: TObject);
var
SQLStr,strFnode: String
I :Integer
begin
SQLStr:= 'Select * From ProgramDB Where Fnode = ''Root''';
DBQuery(SQLStr,InfoQY);
DBToTree(RootNode,InfoTree,InfoQY.Fields[0].Value,0);
RootNode.ImageIndex:= 0;
SQLStr:= 'Select * From ProgramDB Where Fnode = ''' + InfoQY.Fields[1].Value + '''';
DBQuery(SQLStr,InfoQY);
For I:= 0 To InfoQY.RecordCount - 1 Do
DBToTree(RootNode,InfoTree,InfoQY.Fields[1].Value,1)

end;

procedure TMainForm.Button10Click(Sender: TObject);
begin

Close;

end;
end.

我觉得没有什么特别的技术,不知道为什么,希望各位给分析分析,在98/2000都是一样的
结果。
 
程序关闭? :-$

主窗体.close

要不然怎样?
 
如果你要关闭整个应用程序用
Application.Terminate;
 
呵呵,看你的程序好象有点怪怪的 :)
你是不是想做一个登录窗体?但是你的登录窗体你又设为了主窗体?这样的话,实际上如果
你关闭了那个登录窗体的话程序就结束了,而看不到第二个窗体了。
还有,不要岂图用Self.Release;来释放窗体的资源,而应该直接调用Close,再在OnClose
事件中加入Action:=acFree这一句。
实际上要做登录窗体的话,应该是修改工程文件,将你的工作窗口做为主窗口,将登录窗口
改为不是自动生成,然后在工程文件中动态创建它,用ShowModal显示,接收用户信息,正确
的话,继续程序,否则结束。
 
感谢各位的指点,pcexplorer的方法更为简便一些,但是教父的指导还是不胜感激。
 
后退
顶部