Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-04-2009
Carmen Flores Carmen Flores is offline
Registrado
 
Registrado: feb 2008
Posts: 4
Poder: 0
Carmen Flores Va por buen camino
Recorrer un String

Hola. Tengo un problema:
Necesito recorrer nombre de archivos como String:
ACA01-05-07-06.doc ó
VA05-06-07-08.PDF
y necesito identificar las primeras letras y enseguida ir formando otro string con las primeras letras más los siguientes dos digitos, ejemplo:

ACA01
ACA05
ACA07
ACA06
VA05
VA06
VA07
VA08

y después de que va separando el string debe hacer un busqueda (función que ya tengo) en una BD.

parte del codigo que estoy utilizando es este:


Funcion para identificar Letras

procedure TMain.OpenArrayLetras(const constArray: array of const);
var
i : Integer;
begin
for i := 0 to 54 {High(constArray)} do
begin
Abcd:=ConstArray[i].VChar;
if Abcd=LetraFile then
break;
end;
end;

Funcion para identificar Numeros
procedure TMain.OpenArrayNumero(const constArray: array of const);

var
i : Integer;
begin
for i := 0 to 9 {High(constArray)} do
begin
ABC123:=ConstArray[i].VChar;
if ABC123=NumFile then
break;
end;
end;



procedure TMain.AdvSmoothButton4Click(Sender: TObject);
var
Letra, numero, Punto: Integer;
Final, FinalNum, Plana, PlanaNum: String;
begin
//Punto:='.';
PkaCmp:='aca01-02-99-16.PDF';
punto:=Pos('.',PkaCmp);
Delete(PkaCmp,Punto,4);
//Delete(PkaCmp,Punto+1,3);

for letra := 1 to Length(PkaCmp) do
begin
LetraFile:=PkaCmp[Letra];
OpenArrayLetras(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','ñ',
'o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','Ñ','O','P','Q','R','S','T','U','V','W','X','Y','Z']);
if not (LetraFile=Abcd) then

Begin
//inicio de busqueda de nomenclatura
Final:=PkaCmp;
Delete(Final, Letra, Length(Final));
Plana:=Final;
NomPub:=Plana;
Memo2.Lines.Add(Plana);
//termino de busqueda de nomenclatura
//inicio de busqueda de dos digitos de la plana
//Se elimina la nomenclatura y se dejan los numeros de página
PkaCmp2:= Copy(PkaCmp,Letra,length(PkaCmp));
for numero := 1 to Length(PkaCmp2) do
Begin
NumFile:=PkaCmp2[Numero];
OpenArrayNumero(['0','1','2','3','4','5','6','7','8','9']);

if Not (NumFile=ABC123) then
Begin
FinalNum:=PkaCmp2;
PlanaNum:= copy(FinalNum, ((numero)-(2)),2 );
Digito:=PlanaNum;
PlanaBusqueda:=NomPub+Digito;
Memo2.Lines.Add(PlanaBusqueda);
end;

end;
end;


end;
end;
Responder Con Cita
  #2  
Antiguo 22-04-2009
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Dos cosillas: primero, deberías utilizar las etiquetas [code]... [/code] (el botón con el símbolo "#" o uno de los tres siguientes)

Y segundo, ¿cuál es exactamente tu consulta?
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 22-04-2009
alferesvi alferesvi is offline
Registrado
 
Registrado: feb 2009
Posts: 1
Poder: 0
alferesvi Va por buen camino
buenas, soy nuevo aqui y haber q tal esta solucion

Código Delphi [-]
 
i:=0;
longitud:=lenght(variablestring);
repeat
   i:=i+1;
   //con esto guardas todas letras hasta que encuentra el signo '-'
   if variablestring[i]<>'-' then nuevastring[i]:=nuevastring[i]+variablestring[i]
   else salida:=false;
until salida;

si hay algun error de codigo perdoneme
Responder Con Cita
  #4  
Antiguo 23-04-2009
Carmen Flores Carmen Flores is offline
Registrado
 
Registrado: feb 2008
Posts: 4
Poder: 0
Carmen Flores Va por buen camino
Recorrer Sting

Hola, creo que no me di entender mucho, pero aquí escribo el código ya corregido y cual es exactamente mi problema:

Gracias y saludos

Código:
//Función para identificar letras
procedure TMain.OpenArrayLetras(const constArray: array of const);
var
  i : Integer;
begin
  for i := 0 to 54 {High(constArray)} do
    begin
      Abcd:=ConstArray[i].VChar;
     if Abcd=LetraFile then
      break;
    end;
end;


//Función para identificar números
procedure TMain.OpenArrayNumero(const constArray: array of const);
var
  i : Integer;
begin
  for i := 0 to 9 {High(constArray)} do
    begin
      ABC123:=ConstArray[i].VChar;
     if ABC123=NumFile then
      break;
    end;
end;


//Procedimiento (dentro de un botón)
procedure TMain.AdvSmoothButton4Click(Sender: TObject);
var
Letra, numero, Punto: Integer;
Final, FinalNum, Plana, PlanaNum, PkaCmp, PkaCmp2, PkaCmp3: String;
begin

//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'

PkaCmp:='aca01-02-99-16.PDF';

// al string le eliminamos la extensión y nos queda el string asi: 
// 'aca01-02-69--99-16'

punto:=Pos('.',PkaCmp);
Delete(PkaCmp,Punto,4);

//se inicia el recorrido del string (PkaCmp) para buscar letras

for letra := 1 to Length(PkaCmp) do
        begin
   LetraFile:=PkaCmp[Letra];
   OpenArrayLetras(['a','b','c','d','e','f','g','h','i','j','k','l','m','n','ñ',
'o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','Ñ','O','P','Q','R','S','T','U','V','W','X','Y','Z']);
               if not (LetraFile=Abcd) then
                Begin
               //inicio de busqueda de nomenclatura
                Final:=PkaCmp;
                Delete(Final, Letra, Length(Final));
                Plana:=Final;
//este es es resultado de las dos o tres primeras letras de string

                NomPub:=Plana;

                Memo2.Lines.Add(Plana);

//termina el recorrido del string (PkaCmp) y nos encontramos dos o tres letras               

//inicio de busqueda de dos digitos de la plana

               //Se elimina la nomenclatura y se dejan los numeros de página
                PkaCmp2:=  Copy(PkaCmp,Letra,length(PkaCmp));

             for numero := 1 to Length(PkaCmp2) do
                    Begin
                     NumFile:=PkaCmp2[Numero];
                     OpenArrayNumero(['0','1','2','3','4','5','6','7','8','9']);

                  if Not (NumFile=ABC123) then
                       Begin
                       FinalNum:=PkaCmp2;
                       PlanaNum:= copy(FinalNum, ((numero)-(2)),2 );

//este es el resultado de los primeros dos digitos del string

                       Digito:=PlanaNum;

//en el primer recorrido ya tengo mi primer string (PkaCmp:='aca01')
//y junto mus letras + mi primer digito y realizo una búsqueda
//es donde tengo mi problema, si hago la busqueda de los primeros
// tres digitos:'aca01' 'aca02' 'aca99' y el cuarto ya no lo hace

                       PlanaBusqueda:=NomPub+Digito;

                       Memo2.Lines.Add(PlanaBusqueda);
                       end;

                    end;
               end;


        end;
end;
Responder Con Cita
  #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
Poder: 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
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Recorrer y Cortar String octalh Varios 6 28-11-2017 09:46:41
Recorrer un STRING creus Varios 3 07-01-2007 22:52:37
Error al recorrer string creus Varios 6 16-11-2006 22:39:45
recorrer string emiliu Varios 2 16-11-2005 10:23:25
Recorrer un string davidgaldo Varios 3 09-11-2005 10:04:28


La franja horaria es GMT +2. Ahora son las 18:40:56.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi