Hola Carlos:Probablemente es mas facil de explicar de lo que yo lo voy a hacer
pero bueno, lo intentare con un pequeño ejemplo:
// Definimos una estructura como ejemplo
struct MiStruct {
int campo1, campo2;
};
// Creamos la función que pasaremos luego como argumento a Sort(...)
// Tiene que devolver:
// un valor menor de 0: si Item1 < Item2
// un valor igual a 0: si Item1 == Item2
// y un valor mayor de 0: si Item1 > Item2
int __fastcall Comparar(void *Item1, void *Item2)
{
MiStruct *datos1=(MiStruct*)Item1;
MiStruct *datos2=(MiStruct*)Item2;
if (datos1->campo1 < datos2->campo1)
return -1;
else if (datos1->campo1 > datos2->campo1)
return 1;
else
return 0;
}
//-----------------------------------------------------------------
// He añadido el código para probarlo, al evento
// OnClick de un TButton
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// Rellenamos con algunos datos, en este caso
// para facilitar el ejemplo no lo hacemos dinamicamente
MiStruct datos[3] = { {5,10}, {1,20}, {3,30} };
int i;
String str;
TList *MiList = new TList;
// Añadimos los datos al TList
for (i=0; i<3; i++)
MiList->Add(&datos[i]);
// Mostramos los datos antes de ser ordenados
str = "ANTES de ordenar\n\n";
for (i=0; i<MiList->Count; i++)
{
str += "campo1=";
str += ((MiStruct*)MiList->Items[i])->campo1;
str += " : campo2=";
str += ((MiStruct*)MiList->Items[i])->campo2;
str += "\n";
}
ShowMessage(str);
// Ordenamos: le pasamos como argumento la
// función que se encarga de hacer las comparaciones
MiList->Sort(Comparar);
// Mostramos los datos ordenados como prueba
str = "DESPUES: ordenado por el campo1:\n\n";
for (i=0; i<MiList->Count; i++)
{
str += "campo1=";
str += ((MiStruct*)MiList->Items[i])->campo1;
str += " : campo2=";
str += ((MiStruct*)MiList->Items[i])->campo2;
str += "\n";
}
ShowMessage(str);
delete MiList;
}
//-----------------------------------------------------------------
Espero que sea lo que buscabas y que se haya entendido, sino dimelo. 
Saludos.