Que bueno que lograste encontrar la causa, y gracias por mostrarla.
Un mejor parche podría ser (para el último de esos
Ifs):
Código Delphi
[-]If (Node <> Nil) And (Selected = Node) Then
Selected := Node.GetNext;
En lugar de reprimir la excepción, la evita.
Entonces
Node era el objeto Nil en cuestión. La ejecución del método GetNext intentaba leer el primero de sus campos (desplazamiento 4).