DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: pixelcraft
今日帖子: 54
在线用户: 22
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 ysai (ysai) ★☆☆☆☆ -
盒子活跃会员
2019/5/17 10:31:43
标题:
Delphi 7的神奇问题 浏览:1054
加入我的收藏
楼主: procedure f(OnEvent: TNotifyEvent); overload;
begin
end;

procedure f(); overload; //不重载就没问题
begin
end;

var
  event : TNotifyEvent;
begin
  event :=  nil;
  f(event);
  f(nil); //编译出错
end;
----------------------------------------------
-
作者:
男 go_on (go_on) ★☆☆☆☆ -
盒子活跃会员
2019/5/17 13:02:15
1楼: 没delphi7 你试验一下f()
----------------------------------------------
-
作者:
男 peng_delphi (我去) ★☆☆☆☆ -
普通会员
2019/5/17 16:28:05
2楼: f(nil); //编译出错

   nil是值,不是TNotifyEvent属性。
----------------------------------------------
程序在于业务、流程、思想、风格。
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/5/17 17:17:56
3楼: 同意楼上,你加了overload,那么编译时检查规则有些不同,其实你这种情况有几种解决方法:
1、不要overload,改成一个函数,用带默认值的形式:
procedure f(OnEvent: TNotifyEvent = nil);
2、调用时如果不是变量,则转换一下类型,比如:
f(TNotifyEvent(nil));

注:我在XE中测试的,出现类似的问题。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 ysai (ysai) ★☆☆☆☆ -
盒子活跃会员
2019/5/18 10:02:48
4楼: to 2楼:
  没重载的情况下,f(nil)可以

to3楼:
  我只是简化了,实际参数可能很多,只要有事件参数并重载就会有这个问题
  另外TNotifyEvent(nil)是编译通不过的
----------------------------------------------
-
作者:
男 ysai (ysai) ★☆☆☆☆ -
盒子活跃会员
2019/5/18 10:03:45
5楼: 而且,这个问题在高版本下是不会出现的,应该就是个bug
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2019/5/18 11:40:56
6楼: d7不重载也一样出错。
此帖子包含附件:
PNG 图像
大小:50.4K
----------------------------------------------
--
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2019/5/18 13:07:14
7楼: TNotifyEvent又不是指针。
是TMethod的结构体。
用NIL当然会出错。
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/5/18 18:36:38
8楼: 楼主这个f(nil)在不同的Delphi版本中可能会有不同的结果,新版的Delphi应该都能编译了。这种情况只能尽量少用overload吧。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 ysai (ysai) ★☆☆☆☆ -
盒子活跃会员
2019/5/21 11:36:50
9楼: @bahamut8348 (leonna)
你没把第一个函数的overload去掉,去掉是可以编译通过的

@wr960204 (武稀松)
TMethod也是可以传nil的,只是在D7重载情况下出错
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行74.21875毫秒 RSS