Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   IF THEN con datos sacados de un txt (https://www.clubdelphi.com/foros/showthread.php?t=68605)

Greco 23-06-2010 20:59:56

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

rgstuamigo 23-06-2010 22:31:34

Personalmente no lo veo muy complicado, a menos :rolleyes: 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...:)

coso 24-06-2010 11:22:22

Hola,
TStringList tiene la propiedad Values, que hace exactamente lo que ha codificado rtgs. Echale un vistazo a la ayuda de delphi. Un saludo.

Caro 24-06-2010 17:21:17

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

Greco 18-07-2010 23:32:39

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


La franja horaria es GMT +2. Ahora son las 04:55:17.

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