Lo primero deberías de poner los límites del bucle para que veamos por donde te mueves. Yo para los strings te aconsejo que controles el tope " length (variable)-1", ya que si la cadena mide 10 char y te vas a mirar el 11 te dará error. En un bucle for, para recorrer la cadena usa:
Código Delphi
[-]
for f:=0 to length(cadena)-1 do
begin
end;
Otra cosa. No le pongas límite a la cadena. Declaralá como:
y no como
Piensa en las string como en lo que son, arrays dinámicos.
Más cosas. La línea:
Código Delphi
[-]
guarda_variable[j]:= cadena[i];
la verdad, me da yuyu. Pienso que sería mejor así:
Código Delphi
[-]
guarda_variable:=guarda_variable+cadena[i];
Antes del bucle inicializaría a '' la variable guarda_variable y pasaría de la variable j. Ten en cuenta que según tú lo haces, si la cadena mide 0 caracteres, en el primer paso del bucle while ya estás intentando llegar al caracter 1, con lo que peta.
Veo que no estás controlando la salida del bucle para cuando llegues a fin de cadena. Sobre todo, mirate ésto y lo anterior, que me parece que es donde te está petando.
Un consejo "cutre" pero funcional. Si no ves mentalmente lo que está pasando, haz lo que hago yo. Pon la siguiente línea dentro del while:
Código Delphi
[-]
showmessage(inttostr(i)+' '+guarda_variable+' '+cadena[i]);
Te lo puedes decorar a tu gusto, pero así consigues ver en cada paso el valor de cada variable. A mi me ayuda mucho, y la verdad, me resulta más cómodo que el depurador.
Saludos del elfo