我发现IList无法将事件处理程序作为其元素。程序在退出时出现访问冲突$C00000005。
如果我使用Delphi RTL的TList,一切都正常。
无论是32位还是64位版本构建,在发生此问题时,它似乎会停留在Spring4D的以下行中:
procedure TCollectionBase<T>.Changed(const item: T; action:
TCollectionChangedAction);
begin
if fOnChanged.CanInvoke then
fOnChanged.Invoke(Self, item, action);
end;
以下是一个示例程序,可以在Windows上使用RAD Studio Tokyo 10.2.3复制访问冲突。
program Test_Spring_IList_With_Event_Handler;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Spring.Collections;
type
TSomeEvent = procedure of object;
TMyEventHandlerClass = class
procedure SomeProcedure;
end;
TMyClass = class
private
FEventList: IList<TSomeEvent>;
public
constructor Create;
destructor Destroy; override;
procedure AddEvent(aEvent: TSomeEvent);
end;
procedure TMyEventHandlerClass.SomeProcedure;
begin
// Nothing to do.
end;
constructor TMyClass.Create;
begin
inherited;
FEventList := TCollections.CreateList<TSomeEvent>;
end;
destructor TMyClass.Destroy;
begin
FEventList := nil;
inherited;
end;
procedure TMyClass.AddEvent(aEvent: TSomeEvent);
begin
FEventList.Add(aEvent);
end;
var
MyEventHandlerObj: TMyEventHandlerClass;
MyObj: TMyClass;
begin
MyObj := TMyClass.Create;
MyEventHandlerObj := TMyEventHandlerClass.Create;
try
MyObj.AddEvent(MyEventHandlerObj.SomeProcedure);
finally
MyObj.Free;
MyEventHandlerObj.Free;
end;
end.
TSomeClass.SomeProcedure()
实际上会对其Self
参数执行某些操作。 - Remy LebeauSystem.UnsetExceptionHandler
中得到了一个AV错误。我认为这可能是RTL而不是Spring4D的缺陷。该问题尚未解决,我将进行调查。 - Stefan Glienke