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 03-09-2008
Avatar de Greco
Greco Greco is offline
Miembro
 
Registrado: jul 2007
Ubicación: Chile
Posts: 97
Poder: 17
Greco Va por buen camino
error de funcion dentro de un stringlist...

Hola a todos, tengo el siguiente problema al utilizar una funcion que encontre en los trucos de clubdelphi, la funcion extrae una subdacena.

(extraida de los trucos de clubdelphi)
Código Delphi [-]
function GetText(s: string; Indice: Byte;Separador:string='|'): string;
var i:Integer;
tmp:string;
begin
  i:=1;
  while i<=Indice do
   begin
    Delete(s,1,Pos(Separador,s));
    Inc(i);
   end;
  if Pos(Separador,s)<>0 then
   tmp:=Copy(s,1,Pos(Separador,s)-1)
  else
   tmp:=s;
  if Length(tmp)=0 then
    tmp:=EmptyStr;
  Result:=tmp;  
end;


// Para utilizarlo...
GetText('12345|aeiou|a1s2d3f4',1);
//nos devuelve 'aeiou'

Si la utilizo asi sola no tengo problemas, me funciona correctamente,
el problema se presenta cuando llamo a la funcion dentro del codigo de un stringlist, me explico:

Código Delphi [-]
procedure Log(Str: String; Archivo: String);
begin
  // Creamos el objeto
  with TStringList.Create do
  try
    try
      // Intentamos cargar el archivo
    If FileExists(Archivo) then LoadFromFile(Archivo);
    except
      // Si no podemos ignoramos el error
    end;
    // Si ya hay lineas
    if Count > 0 then
     // Comprobamos si la ultima es igual a la que queremos introducir
     if Strings[Count-1] = Str then
      Exit; // Si lo es salimos
    // Dejamos solo las cuatro ultimas lineas
    while Count > 9 do
      Delete(0);
      // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      // lo siguiente es por si le quiero anteponer la hora (el caracter | es para separar la hora de la cadena
      //Add(FormatDateTime('hh:nn:ss',now())+'|'+Str);
      // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     // si utilizo la linea anterior elimino la siguiente     
    Add(Str);
   // Por ultimo guardamos el archivo
    SaveToFile(Archivo);
  finally
    Free;
  end;
end;

La funcion anterior la obtube en este foro con la ayuda de la comunidad, su funcion es:
- recibe una cadena
-abre un archivo que almacena siempre 5 lineas...
-compara la ultima linea con la cadena que recibio la funcion, si son iguales no hace nada, si son distintas almacena la cadena al final del archivo y elimina la primera linea, con lo cual siempre el archivo va a mantener 5 lineas.

yo le agregue la parte que esta entre //++++++ para a parte de guardar la cadena, tambien me guarde la hora en que recibe la cadena, por ejemplo:
17:45:23|la cadena
17:46:41|otra cadena
pero se me presentó un problema, al comparar la cadena que recibe la funcion con la ultima linea almacenada en el archivo, siempre va a detectar que son distintas ya que compara la linea completa, con la hora incluida, una solucion que encontre fue la funcion que puse al principio de este mensaje, la enocntre en los trucos de esta pagina.
Lo que hace es separar la cadena por algun caracter especifico, en este caso "|" y me entrega el indice deseado, en mi caso para la siguiente cadena:
17:45:23|la cadena
llamaría a la funcion GetText('17:45:23|hola mundo',1) y obtengo 'hola mundo'

si lo hago manualmente en un form muevo, me funciona correctamente pero si lo incluyo detro de la funcion anterior me da el siguiente error: "too many actual parameters", pienso yo que debe ser por que esta dentro del codigo del stringlist, no se por que pero se me ocurre que por ahi debe andar el problema (disculpen mi ignorancia).

No se como poder solucionarlo.

Espero que se haya entendido mi mensaje, cualquier duda estare atento al foro para dar mas detalles. Estaré agradecido a cualquier ayuda

Saludos
__________________
Greco - Principiante
Responder Con Cita
  #2  
Antiguo 03-09-2008
Avatar de Greco
Greco Greco is offline
Miembro
 
Registrado: jul 2007
Ubicación: Chile
Posts: 97
Poder: 17
Greco Va por buen camino
para completar un poco...

Código Delphi [-]
procedure Log(Str: String; Archivo: String);
begin
  // Creamos el objeto
  with TStringList.Create do
  try
    try
      // Intentamos cargar el archivo
    If FileExists(Archivo) then LoadFromFile(Archivo);
    except
      // Si no podemos ignoramos el error
    end;
    // Si ya hay lineas
    if Count > 0 then
     // Comprobamos si la ultima es igual a la que queremos introducir
     //****** AQUI MANDO A LLAMAR LA FUNCION PARA EXTRAER SOLO LA CADENA Y NO LA HORA *****     
if GetText(Strings[Count-1]) = Str then
 { intenté tambien usando una variable, por ejemplo:
 cadena:=Strings[Count-1];
 if cadena = Str then
 ...}  
     //if Strings[Count-1] = Str then
      Exit; // Si lo es salimos
    // Dejamos solo las cuatro ultimas lineas
    while Count > 9 do
      Delete(0);
      // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      // lo siguiente es por si le quiero anteponer la hora (el caracter | es para separar la hora de la cadena
      //Add(FormatDateTime('hh:nn:ss',now())+'|'+Str);
      // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     // si utilizo la linea anterior elimino la siguiente     
    Add(Str);
   // Por ultimo guardamos el archivo
    SaveToFile(Archivo);
  finally
    Free;
  end;
end;

Saludos
__________________
Greco - Principiante
Responder Con Cita
  #3  
Antiguo 03-09-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola Greco, te sale el error porque te falta un parametro cuando llamas a tu función GetTex, también puedes hacerlo utilizando StringList y sus funciones Delimiter y DelimiterText.

Código Delphi [-]
var
 slFile, slLinea, slFileNuevo : TStringList;
begin
  slFile := TStringList.Create; //Para todo el archivo
  slLinea := TStringList.Create;//Paar la ultima linea
  slFileNuevo := TStringList.Create;
  
  slLinea.Delimiter:='|'; //Delimitador para que lo use DelimitedText
 
  slFile.LoadFromFile('archivo.txt'); //cargamos el archivo
 
  slLinea.DelimitedText:=slFile[slFile.Count-1];//Cargamos la ultima línea y lo separa en slLinea 
  
  //si lo que se tiene en la ultima posición es igual a Str
  if slLinea[slFile.Count-1]<>Str then
   begin
     for i:=1 to slFile.Count-1 do
       slFileNuevo.Add(slFile[i]); //Añadimos lo que teniamos anteriormente

     slFileNuevo.Add(str); //añadimos lo nuevo
 
     slFileNuevo.SaveToFile('Archivo.txt');
   end;
end;

Si lo que tienes en las lineas de tus archivos no tiene espacios en blanco, te funcionara bien, pero si lo tubieras necesitas colocar a True la función StrictDelimiter, lo malo es que esta función esta en un Delphi posterior a Delphi 7. Pero tenemos otra función ExtractStrings que lo puedes utilizar en vez del Delimiter y DelimiterText, esa función no te traera problemas y te separara también la linea en el StringList utilizando el delimitador que le pongas.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.

Última edición por Caro fecha: 03-09-2008 a las 04:37:57.
Responder Con Cita
  #4  
Antiguo 03-09-2008
Avatar de Greco
Greco Greco is offline
Miembro
 
Registrado: jul 2007
Ubicación: Chile
Posts: 97
Poder: 17
Greco Va por buen camino
Cita:
Empezado por Caro Ver Mensaje
Hola Greco, te sale el error porque te falta un parametro cuando llamas a tu función GetTex...
En el post anterior me equivoqué al escribir la funcion y me falto un parametro la funcion pero solo fue error de escritura del mensaje ya que en delphi tengo la funcion con los dos parametros necesarios, la cadena y el elemento de la cadena que necesito pero igual me sale el error, si lo pruebo a parte me funciona correctamente, por eso me imagino que debe crearse un conflicto a utilizarlo despues de haber creado el stringlist que utilizo para cargar y recorrer el archivo.

Cita:
Empezado por Caro Ver Mensaje
...también puedes hacerlo utilizando StringList y sus funciones Delimiter y DelimiterText.
Si lo que tienes en las lineas de tus archivos no tiene espacios en blanco, te funcionara bien, pero si lo tubieras necesitas colocar a True la función StrictDelimiter, lo malo es que esta función esta en un Delphi posterior a Delphi 7...
Asi es, lo que tengo en las lineas contiene espacios en blancos (17:05:24|unas cuantas palabras).
Tambien tengo delphi 7

Cita:
Empezado por Caro Ver Mensaje
...Pero tenemos otra función ExtractStrings que lo puedes utilizar en vez del Delimiter y DelimiterText, esa función no te traera problemas y te separara también la linea en el StringList utilizando el delimitador que le pongas...
Investigaré un poco sobre esta funcion, como se utiliza, etc para empesar a probar, cualquier duda posteo aqui.

Cita:
Empezado por Caro Ver Mensaje
...Saluditos
Gracias por tu ayuda
__________________
Greco - Principiante
Responder Con Cita
  #5  
Antiguo 03-09-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola de nuevo, utilizando la función ExtractStrings ya no utilizarias ni delimiter ni delimiterText, te pongo un ejemplo.

Código Delphi [-]
 ExtractStrings(['|'], [' '], PCHAR(slFile[slFile.Count-1]), slLinea);

las líneas que puse en rojo en mi anterior codigo estarían demas, en vez de ellas utilizas este ultimo codigo.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #6  
Antiguo 03-09-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

Greco, el error que tienes es por que la clase TStringList tiene un método llamado GetText el cual no recibe parámetros y al estar tu código dentro de un with..do, Delphi cree que estás tratando de llamar a ese método y no a tu función...

Así que tienes dos opciones, usar lo que te a recomendado Caro o cambiar el nombre de tu función GetText...


Saludos...
Responder Con Cita
  #7  
Antiguo 03-09-2008
Avatar de Greco
Greco Greco is offline
Miembro
 
Registrado: jul 2007
Ubicación: Chile
Posts: 97
Poder: 17
Greco Va por buen camino
Cita:
Empezado por maeyanes Ver Mensaje
Hola...

Greco, el error que tienes es por que la clase TStringList tiene un método llamado GetText el cual no recibe parámetros y al estar tu código dentro de un with..do, Delphi cree que estás tratando de llamar a ese método y no a tu función...

Así que tienes dos opciones, usar lo que te a recomendado Caro o cambiar el nombre de tu función GetText...


Saludos...
Muchas gracias maeyanes, me has salvado!!!!!, cambie el nombre de la funcion y ahora me funciona perfectamente, gracias nuevamente.

También agradecer a caro por la ayuda brindada, aunque me estaba costando adaptar el código a la funcion que ya tenia hecha por la inexperiencia que tengo .

Saludos.
__________________
Greco - Principiante
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
llamada a una funcion dentro de una dll mauqu Varios 4 16-10-2007 17:47:57
Funcion para borrar la cadena que aparesca repetida dentro de otra cadena flystar Varios 1 02-07-2007 23:51:10
Funcion para buscar cadena dentro de otra cadena y el numero de veces flystar Varios 3 02-07-2007 22:48:08
TQuery dentro de una funcion Function jorgito Varios 4 26-09-2005 15:44:57
Crear query dentro de unit y funcion? alehillebrand OOP 3 19-07-2005 00:56:59


La franja horaria es GMT +2. Ahora son las 19:02:21.


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