Ver Mensaje Individual
  #5  
Antiguo 23-04-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A ver, o no entiendo lo que quieres hacer o está muy complicado el método que usas.

Voy a partir de esto que pones en tu código:

Cita:
//String que quiero leer. que puede ser de dos o tres letras
//y de dos o cuatro pares de números:
// 've56-21.doc' o 'jun01-06-82-11.pdf'
y de las cadenas resultantes en el ejemplo que pusiste en tu primer mensaje.

La idea es:

1. Quitar la extensión
2. Separar la parte de las letras y la parte con la secuencia numérica.
3. Por cada número en la secuencia, formar una cadena compuesta por las letras y el número.

La primera parte es muy sencilla usando la función ChangeFileExt.

Para la segunda parte, si -como mencionas en el comentario- la cadena sólo puede contener dos o tres letras, entonces basta leer el tercer caracter para saber cuántas letras tenemos. Si es un número, quiere decir que sólo hay dos letras, y en caso contrario tres. Una vez determinado esto, es fácil separar las letras con la función Copy y, así mismo, la secuencia de números como 01-06-82-11.

Ahora bien, esta secuencia consiste de números separados por un guíon. Así que, para aislar cada número, viene muy práctico el uso de un TStringList y su propiedad DelimitedText.

Una vez que tengamos en una lista los distintos números, ya sólo es cosa de recorrer dicha lista y concatenar las letras con el número en turno.

Aquí pongo la expresión de mi idea:

Código Delphi [-]
procedure SplitString(S: String; Strings: TStrings);
var
  Letras: string; // Parte de las letras
  Cantidad: Integer; // Cantidad de letras
  Numeros: TStringList; // Lista de números
  I: Integer;

begin
  // Eliminamos la extensión
  S := ChangeFileExt(S, '');

  // Determinamos la cantidad de letras según lo que haya en el tercer caracter
  if ( S[3] in ['0'..'9'] ) then
    Cantidad := 2
  else
    Cantidad := 3;

  // Separar las letras
  Letras := Copy(S, 1, Cantidad);

  Numeros := TStringList.Create;
  try
    // Separamos los números y los ponemos en una lista
    Numeros.Delimiter := '-';
    Numeros.DelimitedText := Copy(S, Cantidad + 1, MaxInt);

    for I := 0 to Numeros.Count - 1 do
      Strings.Add(Letras + Numeros[i]);
  finally
    Numeros.Free;
  end;
end;

La forma de usar este procedimiento sería así, por ejemplo, para poner las cadenas resultantes en un Memo:

Código Delphi [-]
SplitString('jun01-06-82-11.pdf', Memo1.Lines);

// Saludos
Responder Con Cita