为什么在执行下面的代码时会引发EAccessViolation?
uses
Generics.Collections;
...
var
list: TList<TNotifyEvent>;
...
begin
list := TList<TNotifyEvent>.Create();
try
list.Add(myNotifyEvent);
list.Remove(myNotifyEvent); // EAccessViolation at address...
finally
FreeAndNil(list);
end;
end;
procedure myNotifyEvent(Sender: TObject);
begin
OutputDebugString('event'); // nebo cokoliv jineho
end;
Run Code Online (Sandbox Code Playgroud) 我正在学习Delphi,但喜欢在Perl和Java中使用哈希数组.Delphi中是否存在数据结构的混合?
我知道可以使用TStringList作为哈希数组:
var
myHash:TStringList);
begin
myHash:=TStringList.Create();
myHash.values['color']:='blue';
Showmessage(myHash.Values['color']); //blue
myHash.free;
end;
Run Code Online (Sandbox Code Playgroud)
是否有可能在Delphi中构建更复杂的数据结构,如Perl的数组哈希等?
在Delphi 2009中,到目前为止我没有使用Generics的主要问题(使用Generics.Collections列表,没有特殊的泛型功能).
现在我发现这段代码会导致访问行中的AV MyList.Contains.
如果我声明TMyList = class(TList<TMyEntry>),则错误消失;
我应该避免TObjectList<T>或是我的代码中的其他内容导致此错误?
type
TMyEntry = class(TStringlist);
TMyList = class(TObjectList<TMyEntry>);
procedure TListTests.TestAV;
var
Entry: TMyEntry;
MyList: TMyList;
begin
MyList := TMyList.Create;
try
Entry := TMyEntry.Create;
MyList.Add(Entry);
Assert(MyList.Contains(Entry)); // <--- AV
finally
MyList.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)