三个问题,再求答案!!400分(300分)

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

lccc

Unregistered / Unconfirmed
GUEST, unregistred user!
以下三个问题在672789中,未能有满意答案,重新整理提出:
以Form为例,其他对象也如此:
1、 一个Form的解除是由它的Owner负责的, 程序关闭时实际上由Owner关闭了这些Form,
比如Application,如果用语句TForm.Create(nil)创建了一个窗体,而又忘记使用
Free方法,那么,当程序关闭后,这些Form还在内存中吗?如果没有在内存中,谁
将它解除的?我想是不存在的。如果存在,则内存泄露。
2、 如果使用语句Form2:=TForm2.Create(nil),创建一个窗体Form2,并且Form2的Name
属性为空,然后设置Form2:=nil。现在,由Form2:=TForm2.Create(nil)语句创建的
对象是存在的,但因为使用了Form2:=nil语句,已经不能用Form2来访问。又因无Owner
属性,不能使用FindComponent方法来访问。现在如何操作这个对象?如何解除它?
3、 编写数据库程序时,调试时在Module窗口获知程序需要的BDEDLL,然后在安装程
序中(不用IntallShiled)直接复制到客户的机器,清问:在注册表中需要作那些修
改,或者说,如何让程序知道有这些([blue]数据库连接所使用的[/blue])动态库?用Installshiled
制作的按装程序并没有复制这些DLL到EXE所在目录。
 
也解除了,因为你选为nil的话,实际上还是在Applicatin中.那么,你退出程序后,Application
还是会释放掉它.
 
谢谢!
请继续 2、3 。
 
1.
>>因为你选为nil的话,实际上还是在Applicatin中.
自己凭空想象的吧!请看:
constructor TComponent.Create(AOwner: TComponent);
begin
FComponentStyle := [csInheritable];
if AOwner <> nil then AOwner.InsertComponent(Self);
end;
若AOwner=nil根本就没有插入Application。

程序结束时,Windows 会将该进程空间的所有资源释放。
如果用语句TForm.Create(nil)创建了一个窗体,而又忘记使用
Free方法,那么,一直存在,直到程序关闭,Delphi本身并没有
释放它,当程序关闭后,被操作系统全部清除。

2.
应该说并不是毫无办法,但需要详细分析和调试,我想大概思
路是分析已经分配的内存块,用这些指针做 IS TFORM2检测,
应该可以找出来的。我只是奇怪,你为何不在Form2:=nil之前把
它保存到另一个变量中而非要如此大费周章不可呢?

3.
看看你自己的注册表就知道了:
HKEY_LOCAL_MACHINE/SOFTWARE/Borland/Database Engine
 
HKEY_LOCAL_MACHINE/Software/Boland/Database Engine
你看看这下面得内容就知道了

设置好路径就可以了
 
我也好同意"龙丹"的说法,但有一点想补充的就是当你调用TForm.Free()的时候,其中没有
"真正"地在内存中"释放"它占用的地方,不过,这也许只在win2000吧,这是由操作系统的
内存缓冲机制决定的,我个我认为OS把每个form的实例的都cache了,你可以自己create和
Free一下一个form的实例就知道了,总是有那么1百来k的内存没有真正释放的:),不过,
虽然是这样,但这个内存位置的地址值已经是无效的(但对OS的内存管理是有效的:)
 
呵呵,我没想通的是:你怎么可以做到“Form2的Name属性为空,然后设置Form2:=nil”
 
谢谢你,龙丹!
关于1,“若AOwner=nil根本就没有插入Application”,“没有插入Application”
但仍属于Application吗?
关于问题2的提出,并不是在实际中这么做了。是在看书时想到的:
[blue]一个对象的存在,与是否被引用,或者说,是否有引用它的变量是无关的。
同时,对象取什么名称是人为的,并不影响对象的存在。这有点象唯物主义
的东西了?所以想到如何存取的问题。希望能在此问题上继续指教。[/blue]
关于问题3,在开发时可以如此。但用InstallShield发行时,并没有?为什么?
 
TO教父:
Delphi是引用模型的开发语言,与C不一样,和Java差不多,
声明语句:
var
Form1:TForm;
并没有创建对象,而只是告诉程序:Form1是“指向一个TForm类型的窗体
所在内存”的指针,至于这个指针所指内存里面有没有对象,那是另外一
回事情。
声明之后,使用Form1.Name:='Any Strings';将出现错误,但使用
Create(Owner)之后,可以将Form1.Name:='Any Strings'或者别的什么
字符串。
我知道在FoxPro、VB中,标识一个对象是用Name,但Delphi中不是。
对象你就是不标识它也是[red]客观[/red]存在的,例如:
with TForm.Create(Application) do
begin
Name:='any strings';
Caption:='another any strings';
ShowModal;
Close;
ed;
这里并没有不释放它,但没有引用变量,也没有Name属性,其它地方难以使用。
 
即使用Form2 := TForm2.Create(nil),Form2还是加到了Screen的Forms列表中. 你可以
做一个循环定位Form2来释放它.
 
1.关闭窗口时将 FormX := nil
关闭程序时用Assigned(FormX)判断窗口是否释放。
2.看来只好用 FindWindow 查窗口了。
3.将你计算机的注册表中
HKEY_LOCAL_MACHINE/SOFTWARE/Borland
HKEY_CURRENT_USER/SOFTWARE/Borland
导成文件,注册给其他计算机就行了,文件可以在运行你的程序时删除
/Program files/Common files/Borland Shared/BDE/的DLL文件,
删不掉的,就是必须保留的,删出毛病可不要怪我! :)

 
一:
1.对于 2 中的代码应该叫内存泄漏,
2.Delphi对对象的封装就是要减轻程序员设计的复杂度,包括内存管理
3.所有组件都有自己的内存管理机制,也就是由它的Owner的生存期管理
4.如果一个组件没有了Owner,就必须人为的处理
二:
1.Delphi 中的组件名只是一个指针,对象没创建时是空指针,创建后指向对象的实例
2.一个对象可以有无数个指针指向它,也可以没有指针指向它(如例中),但对象的实例照
样存在,同样占用内存空间
3.Delphi中的对象指针管理就如拥有者关系,拥有的人能用它,没有人拥有就不能用,
除非用黑客的方法(但你例中Form2为拥有者为Tapplication)
三:
1.在一般情况一个程序中的所组件的根是Application
2.从Applicaion中不能用一般的方法找到,是因为Delphi包装得够好
一般情部你可以用Name或Caption来找,但你例中有意去掉此线索
3.可以用WinApi用排除法,一定能找到
4.我用Screen方法找到 请用下例
四:
unit Unit1;

interface

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

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

var
Form1: TForm1;

implementation
uses Unit2;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2:=TForm2.Create(nil);
Form2.Show;
Form2:=nil;

end;

procedure TForm1.Button2Click(Sender: TObject);
Var a:TComponent;
i:Integer;
begin
For i:=0 to Screen.CustomFormCount-1 do
Screen.CustomForms.Show;
//第二个Form中这儿出现了

五:
1.关于你的第三个问题
2.Dll是不需要注册的 你将要用的拷贝到System或System32就可
3.有可能要考虑是Alias的设置
4.其实可不用Alias,直接在Database中设置路径就可
end;

end.




 
后退
顶部