4.000 elementos no son nada, busca alguna función recursiva que tengas, y me refiero a un evento OnChange por ejemplo, si al pulsar una tecla en un edit, haces que se cargue esos 4.000, cada tecla que se pulse está cargando otros 4.000 más.
O incluso una funcion indirectamente recursiva .....Modificar por código tal o cual cosa dentro de un bucle, que hace saltar un evento Onchange por cada ciclo.
Este tipo de cosas son las más dificiles de encontrar, Puede ser de utilidad usar una constante asignable en forma de contador, para ver cuantas veces pasa por ahí:
Código Delphi
[-]
procedure NoSeSiEsRecursivo;
const contador:integer = 0;
begin
memo1.lines.add('contador tiene '+ inttostr(inc(contador)));
end;
Quizás puedas controlarlo al revés, es decir, meter en el SringList los que no estan en la tabla de firebird. Si explicas lo que estas haciendo, quizás te podamos dar alternativas, ya sabes que 40 ojos ven más que 2
.