Results 1 to 5 of 5

Thread: Sort TOwnedCollection

  1. #1

    Sort TOwnedCollection

    Ik probeer een TOwnedCollection te sorteren, voorheen gebruikte ik Generics TObjectList maar omdat ik het wat aan het opschonen en uitbreiden ben, vond ik TOwnedCollection en collectionitems makkelijker vanwege de IDE integratie.
    Nu voorheen werkte mijn sort prima, nu krijg ik een error

    Click image for larger version. 

Name:	Error.png 
Views:	45 
Size:	3.4 KB 
ID:	8292

    Mijn sort code:
    Delphi Code:
    1. Pictures.Sort(TComparer<TCollectionItem>.Construct(
    2.    function (const L, R: TTrainingPicture): integer
    3.    begin
    4.      Result := CompareText(L.Filename, R.Filename);
    5.    end
    6. ));

    Maar met deze code krijg ik bovenstaande error, moet ik hier dan geen TComparer gebruiken? Ik dacht dat de nieuwe collectionitems ook generics waren? Iemand die me uit de brand kan helpen? Ik vind vanalles over sort van TList etc, maar niks over TCollection's - ook niet op de website van Embarcadero (heel eerlijk laat die documentatie nog iets te wensen over).

  2. #2
    Ik vermoed dat de comparison function ook TCollectionItem moet krijgen i.p.v. TTrainingPicture. Die types moeten vziw hetzelfde zijn.

    En dat betekent dat je in die functie zal moeten typecasten. Volgens mij ontkom je daar niet aan, want generics en dfm streaming (dus designtime) zijn geen dikke vrienden.
    1+1=b

  3. #3
    Dat had ik inderdaad ook al geprobeerd maar kom er niet echt uit, kan ook nergens een voorbeeld vinden voor het sorteren van een collection.. Anders kan ik misschien beter eerst alle filenames in een Stringlist laden en die sorteren, en daarna aan de collection toevoegen

  4. #4
    Werkt anders als een tiet!

    Gewoon zoals ik zei. Ben benieuwd wat er dan niet aan werkte...

    Staat ook in de Emba DocWiki, al kwam ik er ook door de code completion en de implementatie te volgen. Even opzoeken wat TComparer en TComparison zijn, bijvoorbeeld, kan online, maar net zo makkelijk om even door te klikken in code.
    Delphi Code:
    1. type
    2.   TMyThingie = class(TCollectionItem)
    3.   public
    4.     Value: Integer;
    5.   end;
    6.  
    7. procedure TForm1.FormCreate(Sender: TObject);
    8. begin
    9.   // Maak een collection met een specifiek type. Dit is geen generic, maar
    10.   // ouderwets polymorphisme met een common basetype en een virtual contstructor.
    11.   var coll := TOwnedCollection.Create(self, TMyThingie);
    12.  
    13.   // Voeg twee items toe. Geen generics, dus typecast nodig,
    14.   (coll.Add as TMyThingie).Value := 2;
    15.   (coll.Add as TMyThingie).Value := 1;
    16.  
    17.   // Sorteer volgens het boekje. De comparer is weliswaar generic, maar <T>
    18.   // is altij TCollectionItem, dus geen TMyThingie. Wederom typecast nodig.
    19.   coll.Sort(TComparer<TCollectionItem>.Construct(
    20.     function(const l, r: TCollectionItem): Integer
    21.     begin
    22.       Result := (l as TMyThingie).Value - (r as TMyThingie).Value;
    23.     end));
    24.  
    25.   // Volgorde is veranderd
    26.   ShowMessage((coll.Items[0] as TMyThingie).Value.ToString); // 1
    27. end;
    1+1=b

  5. #5
    Heel erg bedankt, ik heb me al kapot zitten zoeken.. geen idee waarom het bij mij niet lukte, waarschijnlijk te lang op hetzelfde stuk zitten kijken..

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •