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 10-11-2008
vcs vcs is offline
Registrado
 
Registrado: nov 2008
Posts: 9
Poder: 0
vcs Va por buen camino
Recorrer un string y actuar segun palabras leidas

Hola a todos soy muy novato en esto de Delphi, he leido varios tutos de los que hay por internete pero cada vez que trato de hacer algo que está fuera de lo que pone en los tutos me doy de frente contra un muro.

Estoy haciendo un pequeño programilla, para uso personal, para aprender, pero me surgen mil y un problemas que los voy solventando a medida que me encuentro con ello pero me resulta muy dificil, si bien es cierto que todo el tema del entorno grafico y el uso de las componentes es mas o menos intuitivo, el tema de picar codigo me resulta dificilisimo, para poneros en antecedentes apenas he programado antes de ponerme con Delphi, salvo alguna cosilla en un Pseudo Basic en unas tarjetas de controlar motores, o servos o algo así.

El problema principal con el que me encuentro es que no se muy bien como moverme por dentro de un String, uno de los problemas que no he sabido solucionar es con la siguiente secuencia

Tengo una Form con dos Memos (Memo1, Memo2), en uno cargo un archivo y quiero buscar una linea en la que pone 'SECUENCIAS', una vez encontrada la linea y a partir de esa palabra seguiran otras como por ejemplo UNO y TRES, lo que pretendo hacer es una vez encontrada la linea de secuencias en funcion de las palabras que sigan escribir en el Memo2 por ejemplo si leo DOS escribir "Activando secuencia 2", pero no consigo hacerlo, en principio mediante Pos(cadena, Memo1.text) encuentro la posicion donde comienza SECUENCIAS, pero luego cuando intento desplazarma por el Sting para tratar de leer cual es la palabra que viene a continuacion me pierdo. Alguien me puede ayudar con un codigo de ejemplo para tratar de hacer lo anterior.

En resumen, me ayudaria un código que lea un Memo donde pone los siguiente:

Bla bla
bla
SECUENCIA
DOS
TRES
bla
bla
...

encuntre la linea donde pone SECUENCIA, lea las siguientes palabras y es escriba en otro memo "Activando secuencia X" donde X es la palabra que ha leido.

Como he dicho llegar hasta la posicion de SECUENCIA lo tengo resuelto, el problema es ¿como leo las palabras que le siguen?

MUCHISIMAS GRACIAS POR ADELANTADO
Responder Con Cita
  #2  
Antiguo 10-11-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 vcs, si esta así como dices donde en la línea esta solo SECUENCIA y nada mas, puedes utilizar la función IndexOf de la propiedad Lines del Memo.

Código Delphi [-]
var
 NumLinea : Integer;
begin
 NumLinea := Memo1.Lines.IndexOf('SECUENCIA');
 Memo2.Text := 'Activando secuencia '+Memo1.Lines[NumLinea+1];

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
  #3  
Antiguo 10-11-2008
vcs vcs is offline
Registrado
 
Registrado: nov 2008
Posts: 9
Poder: 0
vcs Va por buen camino
Joer que facil, pues la verdad es que soluciona baste bien lo que queria hacer, pero de todas formas si no estubiera en lineas distintas como se podria hacer?

Por ejemplo
bla bla
SECUENCIA TRES
DOS
bla bla..

Lo que he hecho es correr memo.text[a] desde la posicion donde acaba SECUENCIA, y muevo el caracter leido a una variable string, busco que esa variable tome valor espacio ' ' y almaceno esa posicion, luego continuo hasta el siguiente espacio y hago
memo.selstar:=posicion1;
memo.sellength:=posicion2-posicion1
cadena2:=memo.seltext

y luego saco esa cadena, el problema es si no esta en la misma linea y esta en la siguiente al hacer esto leo cosas raras como #$D y cosas asi y ya me pierdo, porque me pinta por el memo donde saco un cuadrado y cosas asi, yo pense que el enter era #10 o #13, si soluciona algo puedo tratar de pegar el codigo que uso.

ASIAS
Responder Con Cita
  #4  
Antiguo 10-11-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola, deberas crearte, por ejemplo, unas funciones para ir recorriendo la 'frase':

Código Delphi [-]
function PrimeraPalabra(o : string) : string;
begin
        if Pos(' ',o) = 0 then  result := o
        else                         result := Copy(o,0,Pos(' ',o)-1);
end;
 
function Restofrase(o : string) : string;
begin
        if Pos(' ',o) = 0 then 
        result := ''
        else
        result := Copy(o,Pos(' ',o)+1,1000);
end;

y luego ir recorriendo las 'palabras' en el texto

Código Delphi [-]
var
     s,p : string;
begin
s := stringreplace(Memo1.Text,#13,'',[rfReplaceAll]);
s := stringreplace(s,#10,'',[rfReplaceAll]);
while s <> '' do
begin
           p := PrimeraPalabra(Trim(s));
           s := RestoFrase(Trim(s));
 
           if p = '' then ...
end;
      
end;

estas funciones por eso estan incompletas. No estoy seguro si identificara la ultima palabra , ademas de tener que tratarse los caracteres especiales #13, #10, etc...saludos

PD: edito, y incluyo el stringreplace, y trim para eliminar espacios finales e iniciales.

Última edición por coso fecha: 10-11-2008 a las 22:43:58.
Responder Con Cita
  #5  
Antiguo 10-11-2008
vcs vcs is offline
Registrado
 
Registrado: nov 2008
Posts: 9
Poder: 0
vcs Va por buen camino
Jo, me parece que me queda mucho por estudiar porque no he entendido practicamente nada de tu codigo coso, aun así muchas gracias, intentaré empaparme un poco mas a ver si me aclaro.
Responder Con Cita
  #6  
Antiguo 10-11-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
en primerapalabra :
si pos(' ',o) = 0 entonces es que no hay espacios, por lo que el parametro o es una palabra. Si no es el caso y hay espacios, entonces se copia de o desde la posicion cero a la posicion del espacio (la primera palabra)

en restofrase :
si pos(' ',o) = 0 entonces no hay espacios, por lo que no hay resto de frase (es una sola palabra). Si si que hay espacios, entonces se copia de o desde la posicion del primer espacio hasta el final (el resto de la frase)

los stringreplace sirven para descartar los caracteres #13, #10, etc...

el bucle se conforma asi : mientras haya 'frase', se coge la primera palabra y se asigna a 'frase' el resto de la frase. Luego con la palabra cogida (s) tu ya haces lo que necesites.

saludos.
Responder Con Cita
  #7  
Antiguo 10-11-2008
vcs vcs is offline
Registrado
 
Registrado: nov 2008
Posts: 9
Poder: 0
vcs Va por buen camino
Ahora mucho mas claro, pero aun asi perdona mi ignoracia pero entiendo que Result es lo que va a devolver la funcion ¿no? esque en el PseudoBasic que he programado no existian las funciones y todavia me lio porque por ejemplo ni entiendo muy bien la definicion de la funcion

function PrimeraPalabra(o : string) : string;

entiendo que PrimeraPalabra es el nombre de la funcion, a continuacion
(o:string) querra decir que se va a usar esa variable de tipo Sting
y :String que el resultado de la funcion de PrimeraPalabra será del
tipo String

¿eso seria igual que decir lo siguiente?

Funcion PrimeraPalabra:string;
var
o:String;
Begin
...
Por otro lado en la segunda Funcion

function Restofrase(o : string) : string;
begin
if Pos(' ',o) = 0 then
result := ''
else
result := Copy(o,Pos(' ',o)+1,1000);
end;comprobamos si hay alguna posicion en la haya un ' ' pero eso ya se ha hecho en la primera funcion ¿no? y por otro lado en la ultima expresion usamos copy(o,Pos(' ',o)+1,1000) pero al hacer eso suponemos que hay 1000 caracteres en el String entonces no se copiaran todos los signos raros esos que veo cuando uso el depurador #$D ¿?

Asias por tu paciencia y siento hacer unas preguntas tan simples.
Responder Con Cita
  #8  
Antiguo 10-11-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Cita:
function PrimeraPalabra(o : string) : string;

entiendo que PrimeraPalabra es el nombre de la funcion, a continuacion
(o:string) querra decir que se va a usar esa variable de tipo Sting
y :String que el resultado de la funcion de PrimeraPalabra será del
tipo String

¿eso seria igual que decir lo siguiente?

Funcion PrimeraPalabra:string;
var
o:String;
Begin
...
no es lo mismo, puesto que de la primera manera se envia un parametro (o) a la funcion.

Cita:
...comprobamos si hay alguna posicion en la haya un ' ' pero eso ya se ha hecho en la primera funcion ¿no?
no, puesto que las funciones son 'trozos' de codigo autonomos, los cuales tu les envias ciertos parametros y te devuelven un resultado. Luego, en el bucle principal (que deberas colocar en un evento OnClick, por ejemplo) se 'llaman' a estas funciones con el parametro que nos interesa (en ese caso, s) y se recoge su resultado tambien donde nos interesa.

Cita:
por otro lado en la ultima expresion usamos copy(o,Pos(' ',o)+1,1000) pero al hacer eso suponemos que hay 1000 caracteres en el String entonces no se copiaran todos los signos raros esos que veo cuando uso el depurador #$D
ese es el numero de caracteres que se copiaran desde la posicion origen dada (resultado string = Copy(string origen, posicion_origen, longitud a copiar)) solo que si te pasas de la longitud de cadena, se copia hasta el final (para hacerlo correctamente se tendria que restar la longitud inicial de la posicion origen). Vamos, que el mil esta para que copie hasta el final.


Cita:
entonces no se copiaran todos los signos raros esos que veo cuando uso el depurador #$D ¿?
si, se copia todo. Ese por eso es el caracter #10, que con el stringreplace ya queda descartado.

Cita:
Asias por tu paciencia y siento hacer unas preguntas tan simples.
tranquilo, asi aprendemos todos, que nadie nace enseñado. saludos.
Responder Con Cita
  #9  
Antiguo 11-11-2008
vcs vcs is offline
Registrado
 
Registrado: nov 2008
Posts: 9
Poder: 0
vcs Va por buen camino
Ok, ya me queda mas claro,

al final he montado un codigo que hace lo que quiero aunque se complica demasiado

Código:
procedure TFXY.Button5Click(Sender: TObject);
var
  cadena1:string;
  cadena2:string;
  cadena3:string;
  siguiente:string;
  posicion:integer;
  posicion1:integer;
  posicion2:integer;
  chivato:integer;
  chivato2:integer;
  a: Integer;
  b: Integer;
  label
  kk;
begin
 chivato:=0;
 chivato2:=0;
  cadena1:='ENTITIES';
  posicion:=pos(cadena1,mtexto.Text);
  a:=posicion;
  while chivato=0 do
  begin
  kk:
   a:=a+1;
    cadena2:=mtexto.Text[a+7];
    if (cadena2=' ')or
        (cadena2=#10) or
        (cadena2=#13) or
        (Cadena2=#0) then
        BEGIN
        b:=a+1;
        siguiente:=mtexto.text[b+7];
    if (siguiente=' ')or
       (siguiente=#10) or
       (siguiente=#13) or
       (siguiente=#0) then
       goto kk
       else
       begin
        posicion1:=a+7;
        chivato:=1;
       end;
        END;
   end;
   while chivato2=0 do
    begin
   a:=a+1;
    cadena2:=mtexto.Text[a+7];
    if (cadena2=' ')or
        (cadena2=#10) or
        (cadena2=#13) or
        (Cadena2=#0) then
        BEGIN
        posicion2:=a+7;
        chivato2:=1;
        END;
   end;
  mtexto.SelStart:=posicion1;
  mtexto.SelLength:=posicion2-posicion1;
  Mtexto.SetFocus;
  cadena3:=mtexto.SelText;
  memo1.Text:=cadena3;
Para aprender me ha venido GENIAL pero esta claro que si tubiera que hacer un tecto de configuraciones lo mas sencillo desde luego seria trabajar por lineas y usar IndexOf que te arregla todo el código, muchas gracias por la ayuda.
Responder Con Cita
  #10  
Antiguo 11-11-2008
vcs vcs is offline
Registrado
 
Registrado: nov 2008
Posts: 9
Poder: 0
vcs Va por buen camino
He seguido mirando el tema ahora desde el punto de vista de las lineas y me encuentro con una chorrada de problemilla pero no le veo la salida, como se seleccionan varias lineas de Memo?

cuando trabajo Con string hago lo siguiente:

memo.selstart:=posicioninicial;
memo.sellength:=logitud;
memo.setfocus;
cadena:=memo.seltext;

pero si trabajo con las lineas no se como hacerlo.

Gracias
Responder Con Cita
  #11  
Antiguo 11-11-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola de nuevo, se puede acceder a cada linea de un memo mediante un indice:

Código Delphi [-]
 
linea1 := memo1.lines[0];
linea2 := memo1.lines[1];
...
linean := memo1.lines[n-1];
linea1_y_2 := memo1.lines[0] + ' ' + memo1.lines[1];

saludos
Responder Con Cita
  #12  
Antiguo 11-11-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, como te dice el amigo Coso, para acceder a las líneas debes hacerlo con la propiedad Lines y su respectivo indice.

Tu codigo en un memo mas o menos sería así (para marcar varias líneas), le das valores a LineaIni y LineaFin, que serían las líneas que quieres marcar:

Código Delphi [-]
var
 i, LineaIni, LineaFin, aLength, aStart : Integer;
begin
 aLength := 0;
 aStart := 0;
 for i:=0 To LineaIni-1 do
  aStart := aStart + Length(Memo1.Lines[i])+2;
 
 for i:=LineaIni To LineaFin do
  aLength := aLength +Length(Memo1.Lines[i])+2;
 
 Memo1.SelStart := aStart;
 Memo1.SelLength := aLength;
 Memo1.SetFocus;
 Showmessage(Memo1.SelText);

Pero no entiendo porque lo haces así, si quieres obtener una parte de un texto en una cadena puedes utilizar la función Copy.

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
  #13  
Antiguo 14-11-2008
vcs vcs is offline
Registrado
 
Registrado: nov 2008
Posts: 9
Poder: 0
vcs Va por buen camino
Hola, Gracias a los dos por responder, Pues la verdad es que yo tampoco se muy bien porque lo hago así, como comenté al principio no tengo mucha idea de delphi, y lo hago asi porque era un poco lo que se me fue ocurriendo, los problemas que estaba teniendo era al insertar texto en lineas

Memo.lines[3]:='linea tres';

Y a partir de ahí, probando cosas llegue a la pregunta anterior, el problema que tenia era que queria meter texto en la linea 3 cuando no existian las lineas anteriores, por eso no aparecia nada al escribir, la solucion pasó por meter un

memo.lines[0]:=#13#10;
memo.lines[1]:=#13#10;
memo.lines[2]:=#13#10;
...
de esa forma meto los saltos de linea. Voy a probar los codigos que me incluis asi como la funcion de Copy a ver si me voy aclarando.

Por otro lado ¿habeis usado alguna vez el puerto ethernet? lo que me gustaria es sacar por el puerto ethernet un mensaje del tipo ascii por ejemplo ese ACTIVANDO SECUENCIAS BLABLA

Es decir, se puede hacer algo parcido a un Hyper terminal de windows, donde marcando el IP del pc remoto le mande la trama que hemos escrito?

He leido algo sobre las librerias Indy pero me parecen por un lado muy complicados y por otro que tienen demasiadas cosas para el uso que yo propongo, que no es mas que habrir un hiperterminal en un PC y desde el que está programa delphi mandarle un HOLA MUNDO, tal cual.

ASIAS
Responder Con Cita
  #14  
Antiguo 14-11-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola, lo del memo tendrias que usar el metodo Add :

Código Delphi [-]
memo1.Add('1 linea');
memo1.Add('');

sobre lo del hyperterminal, en 'demos' hay ejemplos de un chat y otros relacionados usando los componentes nativos de delphi. saludos.
Responder Con Cita
  #15  
Antiguo 14-11-2008
vcs vcs is offline
Registrado
 
Registrado: nov 2008
Posts: 9
Poder: 0
vcs Va por buen camino
Ok probaré lo del add pero el efecto supongo que será el mismo, sino tengo creadas las lineas no podré meter nada ¿no?

Por otro lado mi version de delphi es una Lite 2007 y me parece que se han cepillado las demos , estan las carpetas (sample) pero no tiene nada dentro, es de un portatil que me han prestado, ¿sabes si se pueden descargar de algun sitio? no lo veo por la web de Borland.

Gracias
Responder Con Cita
  #16  
Antiguo 14-11-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Aqui el link
Responder Con Cita
  #17  
Antiguo 14-11-2008
vcs vcs is offline
Registrado
 
Registrado: nov 2008
Posts: 9
Poder: 0
vcs Va por buen camino
Muchisisimas Gracias eres el mejor
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
contar numero de palabras en un string lina maria Varios 9 19-05-2008 20:33:50
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 12:38:28.


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