यह एक बग की तरह दिखता है।
यदि आप डीबग डीसीयू के साथ संकलित करते हैं (आमतौर पर तब तक ऐसा न करें जब तक कि आप अपनी संवेदना को खोना नहीं चाहते!) आप देखते हैं कि तुलनाकर्ता को एक कॉल गलत हो गया था। तुलनात्मक फ़ंक्शन का एक (संभवतः वैकल्पिक) तीसरा मान सेट नहीं है और एक्सेस उल्लंघन का कारण बनता है।
तो संभवतः आप एक सामान्य सूची में विधि पॉइंटर्स नहीं डाल सकते हैं।
ठीक निम्नलिखित काम करता है:
uses
Generics.Defaults;
type
TForm4 = class(TForm)
...
private
procedure myNotifyEvent(Sender: TObject);
end;
TComparer<T> = class (TInterfacedObject, IComparer<T>)
public
function Compare(const Left, Right: T): Integer;
end;
implementation
uses
Generics.Collections;
var
list: TList<TNotifyEvent>;
begin
list := TList<TNotifyEvent>.Create(TComparer<TNotifyEvent>.Create);
try
list.Add(myNotifyEvent);
list.Remove(myNotifyEvent);
finally
FreeAndNil(list);
end;
end;
procedure TForm4.myNotifyEvent(Sender: TObject);
begin
ShowMessage('event');
end;
{ TComparer<T> }
function TComparer<T>.Compare(const Left, Right: T): Integer;
begin
Result := 0;
end;
आप possiby कुछ और खुफिया ;-) के साथ, अपने स्वयं के comparer परिभाषित करने के लिए किया है।
स्रोत
2008-11-14 11:59:02
हम्म, यह वास्तव में आपके प्रश्न का उत्तर नहीं है। मुझे लगता है कि आपको इसे अपने प्रश्न में कोड के साथ मर्ज करना चाहिए (जो, जैसा कि अब है, अमान्य है क्योंकि प्रश्न में दिखाए गए 'myNotifyEvent'' TNotifyEvent' हस्ताक्षर से मेल नहीं खाता है (यह वहां कोई विधि नहीं है) –