【发布时间】:2012-12-28 22:47:42
【问题描述】:
我在我的项目中使用此代码:
var
P: TPoint;
MyControl.Perform(WM_LBUTTONDOWN, 0, Longint(PointToSmallPoint(P)));
编译器给了我一个警告:
[Warning]: Unsafe typecast of 'TSmallPoint' to 'Integer'
但是,在Controls.pas 中使用了相同的代码没有任何警告 - 例如在TControl.BeginDrag 方法中:
....
Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P)));
我在Controls.pas 单元中看不到任何{$warnings off}。
为什么编译器会警告我,但会跳过Controls.pas 的警告?
这段代码不安全吗?
编辑:在我的项目选项 -> 编译器消息 -> 不安全类型转换已选中(默认情况下未选中)。
也许这就是@David 和@Ken 无法重现警告的原因。
【问题讨论】:
-
我无法重现该警告。您能否提供一个完整的程序来演示该警告。
-
我也无法复制它,使用以下命令:
procedure TForm3.FormCreate(Sender: TObject); var P: TPoint; begin P := Mouse.CursorPos; Perform(WM_LBUTTONDOWN, 0, Longint(PointToSmallPoint(P))); end; -
IIRC,这个警告是在 Delphi 7 中新添加的,因为预期 Delphi .NET,这样的转换不起作用。不是您问题的答案,但除非您打算使用它,否则您不必担心警告。
-
您的编辑是正确的;我没有选中
unsafe type cast,因为它不再适用。 (当他们为 .NET 开发 Delphi 时,为了与 .net 兼容而在 Delphi 6 或 7 中添加了它,以便更轻松地编写适用于 .NET 和 Win32 的代码;由于 .NET 产品的 Delphi 已停产,因此该警告(以及上面的两个)不再适用)。 -
我添加了一个答案,解释了为什么会为未来的读者生成警告(以及为什么禁用它是安全的)。