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 23-06-2010
Avatar de Greco
Greco Greco is offline
Miembro
 
Registrado: jul 2007
Ubicación: Chile
Posts: 97
Poder: 17
Greco Va por buen camino
IF THEN con datos sacados de un txt

hola gente del foro, tenía ya bastante tiempo de no postear una consulta, es por que de hace tiempo que no he metido mano en delphi, solo lo hacía esporádicamente y por hobbie, además que no se mucho de programación como ustedes.
He vuelto a retomar un viejo proyecto que tenía creado y se me ha presentado cierto inconveniente con algo que quiero realizar, les explico:

tengo una cadena que incluye lo siguiente al final de la misma: '#algo'
por ejemplo 'esta es mi cadena #blabla'

tengo que detectar lo que dice despues de # y en base a eso dar una respuesta especifica

Con ExtractStrings separo la cadena en 2 por medio del separador que uso, en mi caso es el signo '#'.
Una vez separada tengo en cadena[0] el texto en si y en cadena[1] el dato que debo evaluar

Dependiendo del dato que tenga cadena[1] es la respuesta que voy a dar.

Cuando ya tengo el dato lo evalúo con IF THEN para hacer algo dependiendo de dicho valor

Código Delphi [-]
texto:='este es un texto cualquiera #algo';

cadena:=TStringList.Create;
ExtractStrings(['#'], [' '], PChar(texto), cadena);

if (cadena[1]='Pedro') then
  respuesta:='Es un hombre'
else if (cadena[1]='Gato') then
  respuesta:='Es un animal'
else
  respuesta:='Es otra cosa';
//...

Ahora lo que necesito es poder tener la condición a evaluar y la respuesta almacenada en un archivo, por ejemplo en un txt de la siguiente manera:

(contenido del archivo)
Cita:
Pedro=Es un hombre
Gato=Es un animal
y en base a eso construir los 'IF THEN' dependiendo de la cantidad de datos que tenga el archivo, por ejemplo si solo son 2 lineas como en el ejemplo, habrían 2 condiciones a evaluar, si yo modifico el archivo agregando mas lineas, entonces aumentarian las condiciones a evaluar, no se si me explico bien.
Actualmente si quiero agregar condiciones tengo que hacerlo directamente en el codigo y volver a compilar pero lo que deseo es sacar esos datos de un archivo, por ejemplo un txt como dije anteriormente.

asi podria agregar o modificar datos al archivo cuando yo quisiera sin tener que tocar el codigo.

Cita:
Pedro=Es un hombre
Gato=Es un animal
Jupiter=Es un planeta
Ballena=Es un mamifero
Etc...
lo cual ya automaticamente aumentarian los IF THEN...

Lo que se me ocurre por ahora es hacerlo por medio de un bucle, por ejemplo leo el archivo, lo recorro linea a linea y por cada linea separo su contenido para obtener el dato a comprarar con lo que extraje de la cadena 'texto' y la respuesta que deba dar.

No se si sea la mejor forma de hacerlo.

Espero sus comentarios.

Si algo no ha quedado claro no duden en consultar y tratare de explicarlo mejor,

Saludos
__________________
Greco - Principiante
Responder Con Cita
  #2  
Antiguo 23-06-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Personalmente no lo veo muy complicado, a menos que no te haya entendido bien, pero si de lo que se trata es de saber exactamente que es un determinada "Cosa"(persona, animal o cosa) pues tranquilamente puedes hacerte una Funcion que te busque dicha Cosa en tu archivo y te devuelva "lo que és", en un string mas o menos asi:
Código Delphi [-]
function TForm1.Que_es_esto(const Algo: String): String;
var
aux:TStrings;
i,p:Integer;
s:String;
begin
Result:='Es otra cosa';
 aux:=TStringList.Create;//creo una lista auxiliar
  try
   aux.LoadFromFile('MiArchivo.txt'); //leo el contenido del archivo a mi lista
    for i := 0 to aux.Count-1 do //iteramos para buscar
    begin
        p:=pos('=',aux[i]); //saco la posiscion del caracter '='
        s:=Trim(copy(aux[i],1,p-1));//copio parte de string hasta la posicion del "=" - 1(menos uno)
        if CompareText(s,algo)=0 then //comparo si es el objeto o cosa que busco
         begin
           Result:=Trim(copy(aux[i],p+1,length(aux[i])-p));//copio la segunda parte del string es decir "lo que és".
           Break;//rompo el ciclo
         end;
    end;
  finally
   aux.Free;//Libero mi lista auxiliar
  end;
end;
Con eso solucionas tu problema.
Un ejemplo de uso sería:
Código Delphi [-]
var respuesta:String
begin
respuesta:=Que_es_esto('Jupiter');
ShowMessage(respuesta);
end;
Por demás está decirte que tu archivo donde guardarás la definiciones debe tener el formato adecuado..
Espero te sea de Ayuda.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 23-06-2010 a las 22:38:19.
Responder Con Cita
  #3  
Antiguo 24-06-2010
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola,
TStringList tiene la propiedad Values, que hace exactamente lo que ha codificado rtgs. Echale un vistazo a la ayuda de delphi. Un saludo.
Responder Con Cita
  #4  
Antiguo 24-06-2010
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 sería mas facil utilizar la propiedad Values como te indica Coso, ejemplo:

Código Delphi [-]
var
 sl : TStringList;
 Valor : String;
begin
 sl := TStringList.Create;
 sl.LoadFromFile('archivo.txt');
 
 Try
   Valor := sl.Values[Edit1.Text];//En tu edit colocas lo que estas buscando  ->Pedro...

   if Valor='' then
    showmessage('es otra cosa')
   else
    showmessage(Valor);
 Finally
   sl.Free;
 end;

El separador por defecto es el igual, si quisieras cambiarlo puedes utilizar la propiedad NameValueSeparator.

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
  #5  
Antiguo 18-07-2010
Avatar de Greco
Greco Greco is offline
Miembro
 
Registrado: jul 2007
Ubicación: Chile
Posts: 97
Poder: 17
Greco Va por buen camino
hola, gracias a todos por las respuestas, no habia podido responder antes por que a los días de haber posteado después no pude acceder a la página por el famoso mensaje de virus y los siguientes días no tuve tiempo.

Probé las dos soluciones, la que indica rgstuamigo y la de Coso (ampliada por Caro), las dos funcionaron y realizaron lo que necesitaba pero al final implementé la que utiliza la opción Values por requerir menos lineas de código.

Lo metí en una función y puedo hacer lo que necesito.


Gracias a todos por su ayuda.

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
Crear base de datos y cargar datos desde delphi Albano MySQL 4 17-05-2007 20:01:18
Herramienta case para diccionario de datos de base de datos firebird mcalmanovici Firebird e Interbase 1 11-02-2007 15:17:37
Como pasar datos de una hoja de Excel a Bases de Datos de Paradox Goyo OOP 1 06-02-2007 01:57:20
ubicar archivo, con datos sacados de base de datos Giniromero Varios 19 20-10-2005 16:23:02
Reto Para Expertos En Base De Datos Y Tipos De Datos.... (blob) frankmch Conexión con bases de datos 2 08-09-2003 19:44:52


La franja horaria es GMT +2. Ahora son las 19:23:43.


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