var FCache1: TTntStringList; FCache1Vals: TTntStringList; FCache2: TTntStringList; FCache2Vals: TTntStringList; function Initialize: Boolean; begin result := True; end; procedure Finalize; begin end; procedure BeginSort; begin FCache1 := TTntStringList.Create; FCache1Vals := TTntStringList.Create; FCache2 := TTntStringList.Create; FCache2Vals := TTntStringList.Create; FCache1.Sorted := True; FCache2.Sorted := True; end; procedure EndSort; begin FCache2Vals.Free; FCache2.Free; FCache1Vals.Free; FCache1.Free; end; function IndexValueForImage(AImage: TImageItem): WideString; begin result := AddLeadingChars(IntToStr(AImage._VersionCount), '0', 9, False) + AImage.FileNameOnly; end; function Sort (AItem1, AItem2: TImageItem): Integer; var AIdx: Integer; AVal1, AVal2: WideString; begin result := 0; if AItem1 = AItem2 then exit; AIdx := FCache1.IndexOf(AItem1.GUID); if AIdx = -1 then begin AVal1 := IndexValueForImage(AItem1); AIdx := FCache1Vals.Add(AVal1); FCache1.AddObject(AItem1.GUID, IntToStr(AIdx)); end else AVal1 := FCache1Vals.Strings[FCache1.Objects[AIdx]]; AIdx := FCache2.IndexOf(AItem2.GUID); if AIdx = -1 then begin AVal2 := IndexValueForImage(AItem2); AIdx := FCache2Vals.Add(AVal2); FCache2.AddObject(AItem2.GUID, IntToStr(AIdx)); end else AVal2 := FCache2Vals.Strings[FCache2.Objects[AIdx]]; if AVal1 = AVal2 then result := 0 else if AVal1 > AVal2 then result := 1 else result := -1; end;