2011-01-24 9 views
8

मैं अंतर्निहित सॉर्ट विधि का उपयोग करके अपनी जेनेरिक tobjectlist को सॉर्ट करना चाहता हूं।डेल्फी परेशानी: एक Tobjectlist को छंटनी <>

//create the list object 
myList := TObjectList<MyType>.Create(false); 

[...] //populate the list with unsorted entries 

//sort the list 
myList.sort(@Comparer); 

[...]//store sorted results back to array 

myList.Destroy; 

मेरी comparer समारोह इस तरह दिखता है:

function Comparer(Item1, Item2 : pointer):integer; 
begin 
    result := myCompare(item1, item2); 
end; 

चश्मा के अनुसार, यह इस तरह से काम करना चाहिए

यहाँ

मैं क्या कर रहा है।

मैं इन मानकों के साथ मौजूद एक संकलक त्रुटि E2250 की 'क्रमबद्ध' नहीं अतिभारित संस्करण प्राप्त (सटीक शब्द अलग है, मैं रेड स्टूडियो के एक गैर अंग्रेज़ी संस्करण का उपयोग)

मुझे पता नहीं है क्यों यह नहीं करना चाहिए वैध पास्कल बनें - क्या आप में से किसी को इस पर साझा करने की अंतर्दृष्टि है?

procedure Sort(const AComparer: IComparer<T>); 

IComparer<T> के रूप में परिभाषित किया गया है: के रूप में

+0

हालांकि लियोनार्डो और मैंने अधिक विस्तार की पेशकश की, रॉब का जवाब आपके लिए सबसे उपयोगी है। कंपाइलर आमतौर पर स्पष्ट कारण देता है कि यह किसी चीज़ को क्यों ऑब्जेक्ट करता है। –

उत्तर

8

आप लगभग वहां हैं। चूंकि मुझे नहीं पता कि MyType क्या आपको कॉल को myCompare फ़ंक्शन में बदलने की आवश्यकता हो सकती है।

myList.Sort(TComparer<MyType>.Construct(
    function (const L, R: MyType): integer 
    begin 
    result := myCompare(L, R); 
    end 
)); 
+0

+1 लियोनार्डो। es bueno ver a otro programador delphi chileno por aqui, pense que estaba solo;)। – RRUZ

+0

हे। Habíamos hartos en los tiempos de डेल्फी 1 ... –

+0

Bueno me referia en realidad a StackOverflow, pero sobre delphi tienes razon, al parecer somos una raza en extinción। – RRUZ

6

TObjectList<T>.Sort घोषित किया जाता है

IComparer<T> = interface 
    function Compare(const Left, Right: T): Integer; 
end; 

आप TObjectList<MyType> instantiating कर रहे हैं और इसलिए आप एक IComparer<MyType>Sort को पारित करने के लिए की जरूरत है। ऐसा करने के लिए आपको उस इंटरफेस के ठोस कार्यान्वयन के लिए एक वस्तु की आवश्यकता होगी।

ऐसा करने का एक स्पष्ट तरीका TObjectList<MyType> उप-वर्ग करना होगा और वहां इंटरफ़ेस लागू करना होगा।

यह करने के लिए एक और तरीका है TComparer<T> उपयोग करने के लिए अपने Construct वर्ग समारोह का उपयोग कर मांग पर एक IComparer<T> तैयार करना है। आपको तुलनात्मक कार्य की आपूर्ति करने की आवश्यकता होगी:

TComparison<T> = reference to function(const Left, Right: T): Integer; 

लियोनार्डो का उत्तर दर्शाता है कि यह कैसे करें।

4

यदि संकलक कहता है कि उस पैरामीटर प्रकार के साथ कोई ओवरलोडेड संस्करण मौजूद नहीं है, तो खुद से पूछें कि क्या ओवरलोड करता है। पता लगाने के लिए स्रोत कोड या the documentation देखें।

वहां आप देखेंगे कि TObjectList<T>TList<T> से दो Sort विधियों को विरासत में मिला है। कोई तर्क नहीं लेता है, और दूसरा IComparer<T> इंटरफ़ेस को कार्यान्वित करने के लिए कुछ संदर्भ लेता है। आपका स्टैंडअलोन फ़ंक्शन उस फिट नहीं है। TComparer<MyType> के वंशज को लिखें और इसकी Compare विधि ओवरराइड करें।

संबंधित मुद्दे