Structure CustomStruct
	Value$
EndStructure

; Сортировка по числовому значению в строковом элементе структуры.
Procedure CustomCompare(*a.CustomStruct, *b.CustomStruct)
	If Val(*a\Value$) < Val(*b\Value$)
		ProcedureReturn #PB_Sort_Lesser
	ElseIf Val(*a\Value$) > Val(*b\Value$)
		ProcedureReturn #PB_Sort_Greater
	Else
		ProcedureReturn #PB_Sort_Equal
	EndIf
EndProcedure

NewList Test.CustomStruct()

AddElement(Test()) : Test()\Value$ = "0005"
AddElement(Test()) : Test()\Value$ = "2"
AddElement(Test()) : Test()\Value$ = "42"
AddElement(Test()) : Test()\Value$ = "7"
AddElement(Test()) : Test()\Value$ = "23"
AddElement(Test()) : Test()\Value$ = "100"
AddElement(Test()) : Test()\Value$ = "101"

CustomSortList(Test(), @CustomCompare(), #PB_Sort_Ascending)

ForEach Test()
	Debug Test()\Value$
Next

; Пример 2
; Сортировать элементы с плавающей запятой по абсолютному значению (игнорируя знак)
Procedure AbsCompare(*a.Float, *b.Float)
	If Abs(*a\f) < Abs(*b\f)
		ProcedureReturn #PB_Sort_Lesser
	ElseIf Abs(*a\f) > Abs(*b\f)
		ProcedureReturn #PB_Sort_Greater
	Else
		ProcedureReturn #PB_Sort_Equal
	EndIf
EndProcedure

NewList Test.f()
AddElement(Test()) : Test() = 2.5
AddElement(Test()) : Test() = -3.0
AddElement(Test()) : Test() = 0
AddElement(Test()) : Test() = 12
AddElement(Test()) : Test() = -100

CustomSortList(Test(), @AbsCompare())

ForEach Test()
	Debug Test()
Next