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 11-03-2015
Jovalca Jovalca is offline
Miembro
NULL
 
Registrado: sep 2013
Ubicación: Madrid - España
Posts: 30
Poder: 0
Jovalca Va por buen camino
Bucle while sólo devuelve un valor

Hola a todos.

Ante todo y como siempre, gracias por leer este post y a ver si alguien puede echarme una mano.

Estoy desarrollando una aplicación, en principio sencilla, que obtiene el código fuente HTML de un sitio web y lo guarda en un TMemoryStream. Posteriormente, este código lo cargo en un TStringList para poder manipularlo y extraer la información que necesito mediante algunas funciones que ya tengo preparadas. Hasta aquí bien.

Lo que ocurre ahora es que los resultados son varios a lo largo del código fuente y para cogerlos todos he creado el siguiente código:

Código Delphi [-]
var
  i: integer;
begin
  for i:= 0 to Lista.Count -1 do
    begin
    i:= i+1;
    Memo2.Lines.Add(ExtractTagAndTextInsideGivenTagEx('tr',Lista[i]));
  end;
end;

Tambien he probado con:

Código Delphi [-]
while i < Lista.Count -1 do
  begin
    i:= i+1;
    Memo2.Lines.Add(ExtractTagAndTextInsideGivenTagEx('tr',Lista[i]));
  end;

Lo que me ocurre con ambos es que sólo me devuelve el primer resultado que hay en el código... Y al menos hay 7 resultados. Si es capaz de sacar el primer resultado, porqué se detiene y no obtiene los siguientes? Que estoy haciendo mal?

Gracias de antemano.
Saludos.

Última edición por nlsgarcia fecha: 11-03-2015 a las 16:39:03. Razón: Sintaxis Delphi
Responder Con Cita
  #2  
Antiguo 11-03-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Jovalca,

Cita:
Empezado por Jovalca
...Bucle (For/While)...sólo devuelve un valor...Y al menos hay 7 resultados...¿Porqué se detiene y no obtiene los siguientes?...


Revisa esta código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function ExtractTagAndTextInsideGivenTagEx(TR, Lista : String) : String;
begin
   Result := UpperCase(TR) + '-' + Lista;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   i : integer;
   Lista : TStringList;

begin

   Lista := TStringList.Create;

   for i := 1 to 10 do
      Lista.Add('Item-' + IntToStr(i));

   Memo1.Clear;

   for i := 0 to Lista.Count -1 do
   begin
      Memo1.Lines.Add(ExtractTagAndTextInsideGivenTagEx('tr',Lista[i]));
   end;

   Lista.Free;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
   i : integer;
   Lista : TStringList;

begin

   Lista := TStringList.Create;

   for i := 1 to 10 do
      Lista.Add('Item-' + IntToStr(i));

   Memo1.Clear;

   i := 0;

   while i <= Lista.Count - 1 do
   begin
      Memo1.Lines.Add(ExtractTagAndTextInsideGivenTagEx('tr',Lista[i]));
      i := i + 1;
   end;

   Lista.Free;

end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, genera valores en un TStringList, los procesa y muestra posteriormente en un TMemo para simular la aplicación descrita en el Msg #1.

Espero sea útil

Nelson.
Responder Con Cita
  #3  
Antiguo 11-03-2015
Jovalca Jovalca is offline
Miembro
NULL
 
Registrado: sep 2013
Ubicación: Madrid - España
Posts: 30
Poder: 0
Jovalca Va por buen camino
Muchas gracias por tu respuesta Nelson.

Lo único es que no veo si puede ayudarme ya que es prácticamente lo que tengo yo.

En tu mensaje:
Código Delphi [-]
begin

   Lista := TStringList.Create; //Creas la lista

   for i := 1 to 10 do
      Lista.Add('Item-' + IntToStr(i)); // Añades 10 lineas

   Memo1.Clear; 

   i := 0;

   while i <= Lista.Count - 1 do //mientras i sea igual o menor que los elementos de la lista
   begin
      Memo1.Lines.Add(ExtractTagAndTextInsideGivenTagEx('tr',Lista[i])); // buscamos "tr" en cada linea
      i := i + 1; // incrementamos i
   end;

   Lista.Free;

end;

Lo unico que no comprendo es esto:

Código Delphi [-]
Result := UpperCase(TR) + '-' + Lista;

La verdad, se me mezcla todo un poco en la cabeza porque hacia tiempo que no cogía este lenguaje ya que últimamente ando con php,html,css...

Esta es la funcion que uso para encontrar y extraer la etiqueta en la lista.
Es posible que algo esté mal aquí?

Código Delphi [-]
function ExtractTagAndTextInsideGivenTagEx(const Tag, Text: string): string;
var
  StartPos, EndPos: integer;
begin
  result := '';
  StartPos := Pos('<' + Tag, Text);
  EndPos:= Pos('<' + '/' + Tag + '>', Text);
  if (StartPos > 0) and (EndPos > StartPos) then
    result := Copy(Text, StartPos, EndPos - StartPos + length(Tag) + 3);
end;

Gracias de nuevo.

Última edición por nlsgarcia fecha: 11-03-2015 a las 20:16:48. Razón: Sintaxis Delphi
Responder Con Cita
  #4  
Antiguo 11-03-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Jovalca,

Cita:
Empezado por Jovalca
...Lo único es que no veo si puede ayudarme ya que es prácticamente lo que tengo yo...


Te comento:

1- El código propuesto en el Msg #2 tiene como único objetivo simular la aplicación mencionada del Msg #1 y mostrar como utilizar los ciclos For y While en dicha simulación.

2- Este es el ciclo For del Msg #1:
Código Delphi [-]
var
  i: integer;
begin
  for i:= 0 to Lista.Count -1 do
    begin
    i:= i+1;
    Memo2.Lines.Add(ExtractTagAndTextInsideGivenTagEx('tr',Lista[i]));
  end;
end;
La línea destacada en rojo produce un error de compilación : [DCC Error] Unit1.pas(32): E2081 Assignment to FOR-Loop variable 'i', no se puede modificar el índice del ciclo For durante su ejecución.

3- Este es el ciclo While del Msg #1:
Código Delphi [-]
while i < Lista.Count -1 do
  begin
    i:= i+1;
    Memo2.Lines.Add(ExtractTagAndTextInsideGivenTagEx('tr',Lista[i]));
  end;
La línea destacada en rojo, incrementa el contador del indice antes de obtener el primer valor de Lista, debe ser después y no indica en que punto fue inicializada a cero dado que en Delphi los indices inician generalmente en dicho valor.

4- La función ExtractTagAndTextInsideGivenTagEx del Msg #2, tiene como único objetivo simular dicha función para efectos de los ciclos For y While.

5- Te sugiero hacer un Debug a la función ExtractTagAndTextInsideGivenTagEx del Msg #3 y verificar si esta retorna en todos casos los valores esperados.

Cita:
Empezado por Jovalca
...hacia tiempo que no cogía este lenguaje ya que últimamente ando con php, html, css...
Revisa esta información:
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 11-03-2015 a las 19:04:14.
Responder Con Cita
  #5  
Antiguo 11-03-2015
Jovalca Jovalca is offline
Miembro
NULL
 
Registrado: sep 2013
Ubicación: Madrid - España
Posts: 30
Poder: 0
Jovalca Va por buen camino
Hola de nuevo Nelson.

Otra vez, gracias por tu tiempo.

Entiendo ahora tus ejemplos.
He reescrito el código y ahora creo que está correcto, al menos no hay advertencias ni corta en ningún momento. Este es el código completo.
Código Delphi [-]
function ExtractCode(const Tag, Text: String): string;
var
  StartPos, EndPos: integer;
begin
  Result:= '';
  StartPos:= Pos('<' + Tag, Text);
  EndPos:= Pos('<' + '/' + Tag + '>', Text);
  if (StartPos > 0) and (EndPos > StartPos) then
    Result:= Copy(Text, StartPos, EndPos - StartPos + Length(Tag) + 3);
end;   

procedure TForm1.StartClick(Sender: TObject);
var
  URL: string;
  SearchParams: string;
  httpClient: THTTPSend;
  Page: TMemoryStream;
  Line: integer;
begin
  URL:= 'http://webpage.com';
  SearchParams:= SearchBox.Text;
  httpClient:= THTTPSend.Create;
  if httpClient.HTTPMethod('GET', (URL+SearchParams)) then
    Page:= TMemoryStream.Create;
    httpClient.Document.SaveToStream(Page);
    httpClient.Free;
    Page.Position:=0;
    PageStrings:= TStringList.Create;
    PageStrings.LoadFromStream(Page);
    Page.Position:=0;
    Memo1.Lines.LoadFromStream(Page);
    Line:= 0;
    while Line <= PageStrings.Count -1 do
      begin
        Memo2.Lines.Add(ExtractCode('tr',PageStrings[Line]));
        Line:= Line+1;
      end;
end;
He hecho una prueba con este html en vez de cargar la página.

Código:
<t>115451</t><t>fgfdgdfg<dfg/tdfdsf>fdgfdnkjghrehiu4yi5yuihgfjdrgjkbdfnjgkndfjkngjkndfkjgnkjdfnjkgjkdfngjkdnfjkgkjdfngh<t>45345456gdf</t><t>wwwwwwwwwwwwwwwww</t>



<t>00000000</t><t>534fdgfd45345</t><t>gdfdfg</t>

<t>24981vvvvvvvvv</t>       <t>21f5f1eeeeeeeeee</t>

<t>24981vvvvvvvvv</t> <t>21f5f1eeeeeeeeee</t>
El resultado es el siguiente:

Código:
<t>115451</t>
<t>115451</t>
<t>115451</t>
<t>115451</t>
<t>115451</t>
<t>115451</t>
<t>115451</t> 

// El primer valor repetido 7 veces.
En cambio si cargo la pagina completa, el resultado solo se muestra una vez, pero siempre es el primero y no carga mas.

No se, quizá pueda ser algo relacionado con el formato de html? Es que parece como si no incrementara el indice y parara nada mas encontrar la primera.

Yo sigo probando y probando, pero si se te ocurre alguna cosa, te lo agradecería.

Gracias.

Última edición por nlsgarcia fecha: 11-03-2015 a las 20:15:39. Razón: Sintaxis Delphi
Responder Con Cita
  #6  
Antiguo 11-03-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Jovalca,

Cita:
Empezado por Jovalca
...si se te ocurre alguna cosa...


Pregunto:

1- ¿Que versión de Windows utilizas?, ¿Es de 32 o 64 bits?.

2- ¿Que versión de Delphi utilizas?.

3- ¿Estas usando la librería Synapse para obtener la página web?.

4- ¿Cuales son los parámetros de búsqueda en SearchParams?.

5- ¿Cual es la página real que quieres obtener?.

6- ¿Haz realizado un Debug a tu aplicación para verificar su funcionamiento?.

Espero sea útil

Nelson.
Responder Con Cita
  #7  
Antiguo 12-03-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Jovalca
Cita:
Empezado por Jovalca Ver Mensaje
...
He hecho una prueba con este html en vez de cargar la página.

Código:
<t>115451</t><t>fgfdgdfg<dfg/tdfdsf>fdgfdnkjghrehiu4yi5yuihgfjdrgjkbdfnjgkndfjkngjkndfkjgnkjdfnjkgjkdfngjkdnfjkgkjdfngh<t>45345456gdf</t><t>wwwwwwwwwwwwwwwww</t>



<t>00000000</t><t>534fdgfd45345</t><t>gdfdfg</t>

<t>24981vvvvvvvvv</t>       <t>21f5f1eeeeeeeeee</t>

<t>24981vvvvvvvvv</t> <t>21f5f1eeeeeeeeee</t>
El resultado es el siguiente:

Código:
<t>115451</t>
<t>115451</t>
<t>115451</t>
<t>115451</t>
<t>115451</t>
<t>115451</t>
<t>115451</t> 

// El primer valor repetido 7 veces.
¿ Deseas que el resultado también muestre <t> y </t> al inicio y final del texto que comprenden ? , es decir:
Código:
<t>115451</t>
o solamente
Código:
115451
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
Consulta SQL devuelve valor erroneo satelit SQL 6 18-04-2014 19:40:59
Store Procedure solo devuelve un registro Rockin Firebird e Interbase 2 17-10-2011 18:43:31
RecNo devuelve valor -1 jandok238 MySQL 1 27-11-2009 22:01:23
Uso de SUSPEND; Solo cuando el SP devuelve valores Paoti Firebird e Interbase 1 27-05-2006 07:16:57
Select Max siempre devuelve valor FernanGil Conexión con bases de datos 3 06-10-2003 15:55:36


La franja horaria es GMT +2. Ahora son las 11:39:31.


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