var P: TPoint; MyControl.Perform(WM_LBUTTONDOWN,Longint(PointToSmallPoint(P)));
编译器给了我一个警告:
[Warning]: Unsafe typecast of 'TSmallPoint' to 'Integer'
但是,Controls.pas中没有任何警告使用相同的代码 – 例如在TControl.BeginDrag方法中:
.... Perform(WM_LBUTTONUP,Longint(PointToSmallPoint(P)));
Controls.pas中没有看到任何{$warnings off}.
为什么编译器警告我,但是跳过Controls.pas的警告?
这段代码不安全吗?
编辑:在我的项目选项中 – >编译器消息 – >检查不安全的类型转换(默认情况下未选中).
也许这就是为什么@David和@Ken无法重现警告.
解决方法
我无法重现警告,因为我没有选中不安全的类型.它不再适用. (当Delphi for .NET开发Delphi时,它被添加到Delphi 6或7中,以实现.NET兼容性,以便更容易地编写适用于.NET和Win32的代码;由于Delphi for .NET产品已被停用,所以该警告(和上面的两个)不再适用).这三个警告中的“不安全”使用“不安全”的.NET含义,意思是“不受管理”.
从Delphi 7帮助文件(搜索“编译器更改”)(强调我的):
The Delphi dcc32 compiler now supports three additional compiler warnings: Unsafe_Type,Unsafe_Code,and Unsafe_Cast. These warnings are disabled by default,but can be enabled with the compiler directive {$WARN UNSAFE_CODE ON},compiler command line switch (dcc32 -W+UNSAFE_CODE),and,in the IDE,on the Project|Options|Compiler Messages page.
This feature is intended to help you port your code to the managed execution environment of Microsoft’s .NET platform. In a managed execution environment,“unsafe” means the operation cannot be verified during the static analysis performed by the Just In Time (JIT) compiler. Such code might pose a security risk,since there is not enough information for the JIT compiler to verify its runtime behavior. Examples of unsafe code include pointer operations and memory overwrites.