今天想开心,散分,不过也要答题滴。转贴Forms1:=nil  变量表示

wugangcn 2008-10-06 11:35:42
procedure TForms1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
Forms1:=nil;////这一句
end;
目前这样关子窗口可以的,但不想直接写Forms1,有没办法用其它的变量来代替Forms1。
程序是为了关闭当然子窗口并nil,又为重开作准备。所以要nil;
...全文
245 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
ideation_shang 2008-10-15
  • 打赏
  • 举报
回复
其实你不应该在Form2的FormClose的时候做文章,Action:=Free;就够了,而是在判断Form2是否可用的时候,随便判断一个Form2的一个控件就行了,比如:
if not Assigned(Form2{改为Form2.Button1}) then
Form2:=TForm2.Create(nil);
Form2.Show;
wugangcn 2008-10-15
  • 打赏
  • 举报
回复
我基本每天发贴
wugangcn 2008-10-15
  • 打赏
  • 举报
回复
谢谢各位朋友,
38楼ideation_shang ,可惜只有200分,其它兄弟一瓜分,就只剩给你60分了,以后有机会顶我的贴,我会给你至少再补40分凑成100。还有32楼HelloMicrosoft,愚钝的我开始没看懂。

suton 2008-10-15
  • 打赏
  • 举报
回复
感谢lack_cx!
kdashen 2008-10-15
  • 打赏
  • 举报
回复
回帖是一种美德!传说每天回帖即可获得 10 分可用分!
lake_cx 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 suton 的回复:]
看了33楼的代码,意思是不是这样??:
在栈里面,从保存application的地址的空间开始的1024个范围内, 去查找每个地址指针,指向的地址单元的值,如果跟当前form的一致,
就清除栈中地址指针的值?


但是,1024是根据什么来的?为什么是1024?难道不可能有更大的范围.
还有,凭什么确定,要从application的地址开始?
就因为在forms单元,application的创建过程,在initialation里面?是最先创建的?


以上问题,请教lake_cx
[/Quote]
很明显1024是乱写的,我这个只是表明了下思路,只能说基本可行。
如果要确定范围,应该搜索Section Table,找出静态数据段,在该数据段内搜索,而且可能会搜索到多个。
同时我还没考虑字节对齐问题,如果是4、8等字节对齐我这样搜索还能搜到,如果不是,很有可能搜不到。
从Application地址开始也是随便写的,事实上从你uses的任何一个单元中找个全局变量的地址都行,因为它会指向全局数据区,并且在你声明的全局变量Form1的前面。
思路类似游戏修改器的内存搜索,当然可能搜出错误值,但因为限定在了全局数据区,而且数值是指针,一般来说还是比较准确的
youfish008 2008-10-15
  • 打赏
  • 举报
回复
接上先 up
bob008 2008-10-15
  • 打赏
  • 举报
回复
freeandnil(XXX)
suton 2008-10-15
  • 打赏
  • 举报
回复
看了33楼的代码,意思是不是这样??:
在栈里面,从保存application的地址的空间开始的1024个范围内, 去查找每个地址指针,指向的地址单元的值,如果跟当前form的一致,
就清除栈中地址指针的值?


但是,1024是根据什么来的?为什么是1024?难道不可能有更大的范围.
还有,凭什么确定,要从application的地址开始?
就因为在forms单元,application的创建过程,在initialation里面?是最先创建的?


以上问题,请教lake_cx
fangsp 2008-10-15
  • 打赏
  • 举报
回复
TForm(Sender):=nil;
Self := nil;
wugangcn 2008-10-15
  • 打赏
  • 举报
回复
你是怎么设计打开的
五维思考 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 megyrr 的回复:]
action:=cafree是关掉了子窗口,但是它就不能在不关主程序的情况下再次打开子窗口了。
[/Quote]

谁说的,我的程序打开N次也没事儿,真不知道你们是怎样设计程序的
ywthegod 2008-10-15
  • 打赏
  • 举报
回复
如果是要重开的, 为何要free掉呢? 判断visible属性检查窗口是否可用不行吗?

设定指向form的指针为nil是很不保险的操作, 如果有多个指针指向form, 你怎么知道有多少个需要nil呢?

而且在form中强行记录指针变量的地址也使得程序可移植性变得很差.

如果必须要free掉, 检查窗口是否可用的时候, 不要直接检查指针变量, 直接在父窗口的子窗口列表中枚举检查是否有合乎条件的窗口存在
wugangcn 2008-10-14
  • 打赏
  • 举报
回复
我的神,太强大了,33楼lake_cx 的方法可行
只是太大了,而且说有不安全类型。33楼预定下60分,如果有能精简或让代码更安全,将得到不垩33目前的分数。
[Warning] Unit1.pas(33): Unsafe type 'Pointer' //这是33桉的第三行。
[Warning] Unit1.pas(34): Unsafe type 'Pointer'
[Warning] Unit1.pas(34): Unsafe type 'Pointer'
[Warning] Unit1.pas(40): Unsafe type 'Result: Pointer'
[Warning] Unit1.pas(41): Unsafe code '@ operator'
[Warning] Unit1.pas(42): Unsafe code '@ operator'
[Warning] Unit1.pas(44): Unsafe type 'Value: Pointer'
[Warning] Unit1.pas(45): Unsafe type 'Result: Pointer'
[Warning] Unit1.pas(45): Unsafe type 'Pointer'
[Warning] Unit1.pas(46): Unsafe type 'Pointer'
[Warning] Unit1.pas(51): Unsafe type 'addr: Pointer'
[Warning] Unit1.pas(51): Unsafe type 'Pointer'
[Warning] Unit1.pas(51): Unsafe typecast of 'TForm1' to 'Pointer'
[Warning] Unit1.pas(52): Unsafe type 'addr: Pointer'
[Warning] Unit1.pas(53): Unsafe type 'addr: Pointer'
megyrr 2008-10-14
  • 打赏
  • 举报
回复
action:=cafree是关掉了子窗口,但是它就不能在不关主程序的情况下再次打开子窗口了。
chenyq2008 2008-10-14
  • 打赏
  • 举报
回复
还是接一下分吧。。
五维思考 2008-10-14
  • 打赏
  • 举报
回复
今天认真看了一下楼主的问题,但想来想去不知道楼主要干什么,不就是关闭MDI子窗体吗,Action:=cafree这一句就可以了,为什么还要加其它释放代码呢?
lake_cx 2008-10-14
  • 打赏
  • 举报
回复
难不成这样?
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
addr: Pointer;
function FindAddress(Value: Pointer): Pointer;
const
FIND_MAX_SIZE = 1024;
var
addr: DWORD;
begin
Result := nil;
addr := DWORD(@Application);
while addr < DWORD(@Application) + FIND_MAX_SIZE do
begin
if PPointer(addr)^ = Value then
Result := Pointer(addr);
Inc(addr, SizeOf(Pointer));
end;
end;
begin
Action := caFree;
addr := FindAddress(Pointer(Self));
if addr <> nil then
PPointer(addr)^ := nil;
end;
还是江筱吧 2008-10-14
  • 打赏
  • 举报
回复
是子窗体吧,
没听说自己释放自己的,^-^
应该在它的调用出释放,可以用一个通用的函数释放所有窗体的,应在在application中循环释放。
没有太具体的了,也不用太具体阿
wugangcn 2008-10-14
  • 打赏
  • 举报
回复
200分啊,不要沉了,不要自我消化呀。
加载更多回复(30)

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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