Delphi 定位传感器有问题吗?

Delphi 定位传感器有问题吗?,delphi,firemonkey,delphi-10.1-berlin,Delphi,Firemonkey,Delphi 10.1 Berlin,在我的程序中(使用Delphi10.1 Berlin,更新2-应用程序是FireMonkey),我使用了一个TLocationSensor。没有为事件指定事件处理程序OnLocationChanged: 即便如此,我的应用程序还是会抛出一个错误。我打开“调试”,发现System.Sensors中的以下代码正在执行: procedure TCustomLocationSensor.DoLocationChanged(const OldLocation, NewLocation: TLocat

在我的程序中(使用Delphi10.1 Berlin,更新2-应用程序是FireMonkey),我使用了一个TLocationSensor。没有为事件指定事件处理程序
OnLocationChanged

即便如此,我的应用程序还是会抛出一个错误。我打开“调试”,发现System.Sensors中的以下代码正在执行:

procedure TCustomLocationSensor.DoLocationChanged(const OldLocation,
  NewLocation: TLocationCoord2D);
begin
  if Assigned(OnLocationChanged) and not (SameValue(OldLocation.Latitude, NewLocation.Latitude) and
    SameValue(OldLocation.Longitude, NewLocation.Longitude)) then
    OnLocationChanged(Self, OldLocation, NewLocation);
end;
出于某种原因,它试图触发OnLocationChanged。但它不应该试图触发此事件,因为我没有为其分配事件处理程序

我现在已经显式地设置了
OnLocationChanged:=nil在我表单的
OnCreate
事件中。这似乎解决了这个问题(但我不希望使用此代码,因为它感觉我正在解决一个不应该发生的问题)


我想我的问题是:我错过了什么吗?或者TLocationSensor是否存在问题?

创建
TLocationSensor
实例时,
OnLocationChanged
字段为零。如果
OnLocationChanged
在稍后阶段为非nil,则程序中的某些内容正在更改它。可能是您的代码或某个第三方。但很难说,你甚至没有指出你犯了什么错误。此外,与目标平台、测试设备等无关。只是为了澄清,IDE显示
OnLocationChanged
unassigned这一事实当然并不意味着它不能在代码中分配。在
过程TLocationSensor.SetOnLocationChanged(常量值:TLocationChangedEvent)中放置断点。调用堆栈将告诉您是谁在设置它。程序在unit
System.Sensors.Components
中。感谢您对TomBrunberg的评论。该错误是访问冲突错误。我目前正在运行联想Ideapad的Windows 10上测试该应用程序。@TomBrunberg我按照您的建议使用了断点。它在一个完全不同的窗口中被调用(使用它自己的位置传感器组件)。在该窗口中,我使用OnLocationChanged事件。但是为什么主窗体中的组件会继续将事件处理程序分配持久化到另一个窗体中完全独立的组件实例中呢1) 完整的错误消息对于错误分析至关重要。2) 给定类的所有实例共享相同的代码(但每个实例都有自己的数据)。触发AV错误的是另一个位置传感器。如果错误中的访问地址是一个相当小的数字(接近$00000000),那么真正的错误很可能是访问非实例化对象实例。创建
TLocationSensor
实例时,
OnLocationChanged
字段为零。如果
OnLocationChanged
在稍后阶段为非nil,则程序中的某些内容正在更改它。可能是您的代码或某个第三方。但很难说,你甚至没有指出你犯了什么错误。此外,与目标平台、测试设备等无关。只是为了澄清,IDE显示
OnLocationChanged
unassigned这一事实当然并不意味着它不能在代码中分配。在
过程TLocationSensor.SetOnLocationChanged(常量值:TLocationChangedEvent)中放置断点。调用堆栈将告诉您是谁在设置它。程序在unit
System.Sensors.Components
中。感谢您对TomBrunberg的评论。该错误是访问冲突错误。我目前正在运行联想Ideapad的Windows 10上测试该应用程序。@TomBrunberg我按照您的建议使用了断点。它在一个完全不同的窗口中被调用(使用它自己的位置传感器组件)。在该窗口中,我使用OnLocationChanged事件。但是为什么主窗体中的组件会继续将事件处理程序分配持久化到另一个窗体中完全独立的组件实例中呢1) 完整的错误消息对于错误分析至关重要。2) 给定类的所有实例共享相同的代码(但每个实例都有自己的数据)。触发AV错误的是另一个位置传感器。如果错误中的访问地址是一个相当小的数字(接近$00000000),那么真正的错误很可能是访问一个未实例化的对象实例。