Efectivamente, cadetill tiene razón (eso me pasa por no dedicar más tiempo a pensar en el problema y responder demasiado deprisa).
Otra posible solución es declarar el fichero FileReg directamente como TextFile y "esconder" el número en el propio fichero, delimitado por un par de caracteres que no se utilicen en el fichero, por ejemplo |45|.´Creo que es la solución más sencilla. La primera línea contiene el número, las siguientes contienen el texto, hasta que se encuentre el delimitador; éste indicará que estamos ante otro registro; es decir:
|45|
dhjfsd sdjklh sdh fs fsd fsld fl sdfsdh fhsdf
sdfs
df
sdf
sdf
sdfsd fgasd fsdjfgsd fjgs d fs
|34|
dfl´ñskd f sdfj sdklñfañs ñfasdññfasñdfsadf
asd f
asd
fa
sd
fsdf asdjkl fasdjklfasd f
ds
fda
s fasd
|27|
sdjk fksf
sdfsd
f
d
s
f
Meter la información es ahora trivial. Para sacarla basta ir buscando la letra '|' con Pos, con algo como:
Memo1.Lines.LoadFromFile('..........');
Texto := Memo1.Text;
cont := 1;
//1ª aparición de '|'
Pos1 := Pos('|', Texto);
while (Pos1 > 0) do
begin
// 2ª aparición de '|'
Pos2 := Pos('|'+Chr(13)+Chr(10), Texto);
//Extraemos el núm. Numero[i] es un array de enteros
Numero[cont] := StrToInt(Copy(Texto, Pos1+1, Pos2-1));
// Eliminamos el '|nº|'+Salto de línea
Texto := Copy(Texto, Pos2+3, Length(Texto));
// Buscamos el siguiente '|'
Pos1 := Pos('|', Texto);
if Pos1 > 0 then
//Extraemos el texto del registro cont
Contenido[cont] := Copy(Texto, 1, Pos1-3); // El -3 es para
// eliminar el salto de línea tras el texto
// Incrementamos el contador
INC(cont);
end; // del while
Tras el bucle en Numero[i] están los números y en Contenido[i] están los contenidos. Hay que iterar desde 1 hasta cont-1.
Nota: el código lo he escrito al vuelo, a lo mejos se me ha pasado algo.
Espero que, ahora sí

, te sirva.
Un saludo
Nacho