Pega a última linha de um Rich e jogar em outro Rich

13/09/2004

Vamos ao problema.


Imaginem a situação:

Pegue um exemplo que executa pings em um determinado host, porem a resposta do ping é em um RichEdit.

[b:87dfad8715]OBS:

A resposta é em tempo real do comando
[/b:87dfad8715]

Dentro do RichEdit fica assim quando termina do o comando.

=============================

PING 200.195.24.32 (200.195.24.32): 56 data bytes
64 bytes from 200.195.24.32: icmp_seq=0 ttl=255 time=0.1 ms
64 bytes from 200.195.24.32: icmp_seq=1 ttl=255 time=0.1 ms
64 bytes from 200.195.24.32: icmp_seq=2 ttl=255 time=0.1 ms
64 bytes from 200.195.24.32: icmp_seq=3 ttl=255 time=0.1 ms
64 bytes from 200.195.24.32: icmp_seq=4 ttl=255 time=0.1 ms

--- 200.195.24.32 ping statistics ---
5 packets transmitted, 5 packets received, 0¬ packet loss
round-trip min/avg/max = 0.1/0.1/0.1 ms

=============================


Eu coloquei um segundo RichEdit onde eu só quero pegar o IP e o tempo de resposta ficando assim:

200.195.24.32 time=0.1 ms
200.195.24.32 time=0.1 ms
200.195.24.32 time=0.1 ms
200.195.24.32 time=0.1 ms


Tentei de várias máneiras e não consegui!

Agradeço qualquer ajuda.

Abraços


Redoctober

Respostas

13/09/2004

Gandalf.nho

Acho que você teria que processar linha por linha do RichEdit e pegar só o que você quer.


Responder Citar

13/09/2004

Redoctober

Acho que você teria que processar linha por linha do RichEdit e pegar só o que você quer.


Exatamente!

So que eu nao consegui fazer isso... Sera que alguem pode me dar exemplos de como eu devo fazer?

Valeu a atencao.


Responder Citar

14/09/2004

Sandra

redoctober,

Veja se é isto que quer fazer:
procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
begin
  RichEdit2.Clear;
  for i := 1 to RichEdit1.Lines.Count -5 do
    RichEdit2.Lines.Add(copy(RichEdit1.Lines[i&93;, 15, 13) + ´ ´ + 
                        copy(RichEdit1.Lines&91;i&93;, 46, 14));
end;


Boa sorte! :D


Responder Citar

14/09/2004

Redoctober

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
begin
  RichEdit2.Clear;
  for i := 1 to RichEdit1.Lines.Count -5 do
    RichEdit2.Lines.Add(copy(RichEdit1.Lines[i&93;, 15, 13) + ´ ´ + 
                        copy(RichEdit1.Lines&91;i&93;, 46, 14));
end;



Sandra,

É exatamente isso, porém surgem alguns problemas tipo:

1) 64 bytes from 200.202.223.4: icmp_seq=49 ttl=60 time=128.7 ms

2) 64 bytes from 200.202.223.4: icmp_seq=49 ttl=255 time=128.7 ms

3) 200 bytes from 200.202.223.4: icmp_seq=2 ttl=255 time=128.7 ms


Veja que nos 3 exemplos de respota acima, as posições de TTL do bytes e do ICMP_SEQ mudaram...

Não tem como fazer a separação das colunas pelos espaços não? Tentei aqui fazer pelos espaços e não consegui!


Responder Citar

14/09/2004

Redoctober

Aí pessoal, até agora ainda não conseguir dividir as linha pelo espaço nela...

Sandra se vc puder ajudar....

Abraços


Responder Citar

14/09/2004

Redoctober

Pessoal,

tentei utilizar os métodos abaixo, mais não tive êxito nenhum
parte : TStringList;
begin

parte := TStringList.Create;
parte.Delimiter := ´ ´;
parte.DelimitedText := linha;


Seria mais ou menos por aí?


Responder Citar

14/09/2004

Sandra

redoctober,

Após muitas e muitas tentativas, veja se assim funciona da maneira que quer (ou gostaria que ficasse):

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  TextoLinha: string;
begin
  RichEdit2.Clear;
  For i := 1 to RichEdit1.Lines.Count -5 do begin
    TextoLinha := RichEdit1.Lines[i&93;;
    RichEdit2.Lines.Add(copy(TextoLinha,
                             Pos(´from´, TextoLinha)+5,
                             Pos(´icmp´, TextoLinha)-3-(Pos(´from´, TextoLinha)+4))
                        + ´ ´ +
                        copy(TextoLinha,
                             Pos(´time´, TextoLinha),
                             Length(TextoLinha)-Pos(´time´, TextoLinha)));
  end;
end;



Responder Citar

14/09/2004

Redoctober

redoctober, Após muitas e muitas tentativas, veja se assim funciona da maneira que quer (ou gostaria que ficasse):
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  TextoLinha: string;
begin
  RichEdit2.Clear;
  For i := 1 to RichEdit1.Lines.Count -5 do begin
    TextoLinha := RichEdit1.Lines[i&93;;
    RichEdit2.Lines.Add(copy(TextoLinha,
                             Pos(´from´, TextoLinha)+5,
                             Pos(´icmp´, TextoLinha)-3-(Pos(´from´, TextoLinha)+4))
                        + ´ ´ +
                        copy(TextoLinha,
                             Pos(´time´, TextoLinha),
                             Length(TextoLinha)-Pos(´time´, TextoLinha)));
  end;
end;


É isso aí Sandra, matou a pauladas o meu problema!!!

Valeu mesmo.

Obrigado e até mais


Responder Citar

21/09/2004

Redoctober

redoctober, Após muitas e muitas tentativas, veja se assim funciona da maneira que quer (ou gostaria que ficasse):
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  TextoLinha: string;
begin
  RichEdit2.Clear;
  For i := 1 to RichEdit1.Lines.Count -5 do begin
    TextoLinha := RichEdit1.Lines[i&93;;
    RichEdit2.Lines.Add(copy(TextoLinha,
                             Pos(´from´, TextoLinha)+5,
                             Pos(´icmp´, TextoLinha)-3-(Pos(´from´, TextoLinha)+4))
                        + ´ ´ +
                        copy(TextoLinha,
                             Pos(´time´, TextoLinha),
                             Length(TextoLinha)-Pos(´time´, TextoLinha)));
  end;
end;



Desse jeito deu certo... Mais eu vou precisar de separar por espaço.

Você pode me ajudar?


Responder Citar

21/09/2004

Sandra

Desse jeito deu certo... Mais eu vou precisar de separar por espaço. Você pode me ajudar?

Como assim, ´separar por espaço´? Pode explicar melhor?


Responder Citar

22/09/2004

Redoctober

[quote:5315f419bf=´redoctober´]Desse jeito deu certo... Mais eu vou precisar de separar por espaço. Você pode me ajudar?

Como assim, ´separar por espaço´? Pode explicar melhor?[/quote:5315f419bf]

Tipo:

64 bytes from 200.195.24.32: icmp_seq=0 ttl=255 time=0.1 ms
64 bytes from 200.195.24.32: icmp_seq=0 ttl=255 time=0.1 ms
64 bytes from 200.195.24.32: icmp_seq=0 ttl=255 time=0.1 ms
64 bytes from 200.195.24.32: icmp_seq=0 ttl=255 time=0.1 ms

depois de cada texto, tem um espaço, então gostaria de dividir as colunas por espaço entendeu?

tipo

label1.caption := variavel[3];

o resultado seria -> [b:5315f419bf]200.195.24.32:[/b:5315f419bf]


Responder Citar

22/09/2004

Redoctober

[quote=´sandra´][quote:9c457f3e8a=´redoctober´]Desse jeito deu certo... Mais eu vou precisar de separar por espaço. Tipo: 64 bytes from 200.195.24.32: icmp_seq=0 ttl=255 time=0.1 ms 64 bytes from 200.195.24.32: icmp_seq=0 ttl=255 time=0.1 ms 64 bytes from 200.195.24.32: icmp_seq=0 ttl=255 time=0.1 ms 64 bytes from 200.195.24.32: icmp_seq=0 ttl=255 time=0.1 ms depois de cada texto, tem um espaço, então gostaria de dividir as colunas por espaço entendeu? tipo label1.caption := variavel[3]; o resultado seria -> [b:9c457f3e8a]200.195.24.32:[/b:9c457f3e8a]



Responder Citar

23/09/2004

Nildo

Olha, eu fiz uma funçãozinha pra você. Vale lembrar que ela está bastante tosca e pode ser melhorada, mas eu fiz na pressa e funciona. Ela pdoeria ser bem menor mas eu levei em consideração que as posições não tem tamanho fixo. Segue o código:

type
   TResultado = record
      Bytes: Integer;
      IP: string;
      icmp_seq: Integer;
      Ttl: Integer;
      Time: String;
   end;

function PegarInfo( linha: string ): TResultado;
var
   posByte: Integer;
   posFrom: Integer;
   posIcmp: Integer;
   PosIcmpEsp: Integer;
   posTtl : Integer;
   PosTtlEsp: Integer;
   posTime: Integer;
   PosTimeEsp: Integer;
begin
   posByte := Pos( ´bytes´, linha );
   if posByte = 0 then
      Result.Bytes := 0
   else
      Result.Bytes := StrToInt( Copy( linha, 0, posByte - 2 ) );

   posFrom := Pos( ´from´, linha );
   if posFrom = 0 then
      Result.IP := ´´
   else
      Result.IP := Copy( linha, PosFrom + 5, ( Pos( ´:´, linha ) ) - ( PosFrom + 5 ) );

   posIcmp := Pos( ´icmp_seq=´, linha );
   PosIcmpEsp := Pos( ´ ´, Copy( linha, posIcmp, Length( linha ) - posIcmp + 1 ) ) - 9;

   if posIcmp = 0 then
      Result.icmp_seq := 0
   else
      Result.icmp_seq := StrToInt( Copy( linha, posIcmp + 9, PosIcmpEsp - 1 ) );

   posTtl := Pos( ´ttl=´, linha );
   PosTtlEsp := Pos( ´ ´, Copy( linha, posTtl, Length( linha ) - posTtl + 1 ) ) - 4;

   if posTtl = 0 then
      Result.Ttl := 0
   else
      Result.Ttl := StrToInt( Copy( linha, posTtl + 4, PosTtlEsp - 1 ) );

   posTime := Pos( ´time=´, linha );
   PosTimeEsp := Pos( ´ ´, Copy( linha, posTime, Length( linha ) - posTime + 1 ) ) - 5;

   if posTime = 0 then
      Result.Time := ´0´
   else
      Result.Time := Copy( linha, posTime + 5, PosTimeEsp - 1 );

end;


Você deve passar como parâmetro para ela, a string contendo o resultado. No caso seria uma linha do RichEdit. Feito isso, o retorno possui variaveis, que são elas: Bytes, IP, Icmp_seq, Ttl e Time. A função já separa para você cada valor em seu local.

   PegarInfo( RichEdit1.Lines[ 1 &93; ).Bytes
   PegarInfo( RichEdit1.Lines&91; 1 &93; ).IP
   PegarInfo( RichEdit1.Lines&91; 1 &93; ).icmp_seq
   PegarInfo( RichEdit1.Lines&91; 1 &93; ).Ttl
   PegarInfo( RichEdit1.Lines&91; 1 &93; ).Time


Qualquer dúvida responde o tópico ou deixe-me saber se funcionou. Um abraço.


Responder Citar

23/09/2004

Redoctober

Olha, eu fiz uma funçãozinha pra você. Vale lembrar que ela está bastante tosca e pode ser melhorada, mas eu fiz na pressa e funciona. Ela pdoeria ser bem menor mas eu levei em consideração que as posições não tem tamanho fixo. Segue o código:
type
   TResultado = record
      Bytes: Integer;
      IP: string;
      icmp_seq: Integer;
      Ttl: Integer;
      Time: String;
   end;

function PegarInfo( linha: string ): TResultado;
var
   posByte: Integer;
   posFrom: Integer;
   posIcmp: Integer;
   PosIcmpEsp: Integer;
   posTtl : Integer;
   PosTtlEsp: Integer;
   posTime: Integer;
   PosTimeEsp: Integer;
begin
   posByte := Pos( ´bytes´, linha );
   if posByte = 0 then
      Result.Bytes := 0
   else
      Result.Bytes := StrToInt( Copy( linha, 0, posByte - 2 ) );

   posFrom := Pos( ´from´, linha );
   if posFrom = 0 then
      Result.IP := ´´
   else
      Result.IP := Copy( linha, PosFrom + 5, ( Pos( ´:´, linha ) ) - ( PosFrom + 5 ) );

   posIcmp := Pos( ´icmp_seq=´, linha );
   PosIcmpEsp := Pos( ´ ´, Copy( linha, posIcmp, Length( linha ) - posIcmp + 1 ) ) - 9;

   if posIcmp = 0 then
      Result.icmp_seq := 0
   else
      Result.icmp_seq := StrToInt( Copy( linha, posIcmp + 9, PosIcmpEsp - 1 ) );

   posTtl := Pos( ´ttl=´, linha );
   PosTtlEsp := Pos( ´ ´, Copy( linha, posTtl, Length( linha ) - posTtl + 1 ) ) - 4;

   if posTtl = 0 then
      Result.Ttl := 0
   else
      Result.Ttl := StrToInt( Copy( linha, posTtl + 4, PosTtlEsp - 1 ) );

   posTime := Pos( ´time=´, linha );
   PosTimeEsp := Pos( ´ ´, Copy( linha, posTime, Length( linha ) - posTime + 1 ) ) - 5;

   if posTime = 0 then
      Result.Time := ´0´
   else
      Result.Time := Copy( linha, posTime + 5, PosTimeEsp - 1 );

end;
Você deve passar como parâmetro para ela, a string contendo o resultado. No caso seria uma linha do RichEdit. Feito isso, o retorno possui variaveis, que são elas: Bytes, IP, Icmp_seq, Ttl e Time. A função já separa para você cada valor em seu local.
   PegarInfo( RichEdit1.Lines[ 1 &93; ).Bytes
   PegarInfo( RichEdit1.Lines&91; 1 &93; ).IP
   PegarInfo( RichEdit1.Lines&91; 1 &93; ).icmp_seq
   PegarInfo( RichEdit1.Lines&91; 1 &93; ).Ttl
   PegarInfo( RichEdit1.Lines&91; 1 &93; ).Time
Qualquer dúvida responde o tópico ou deixe-me saber se funcionou. Um abraço.


Aí Nildo, rodou certinho.

Aí, aparece no messenger para eu te explicar esse sistema, pois estou fazendo ele como eu disse pra ti a um tempo.

Sandra, não posso deixar de agradeçer a sua atenção. Valeu mesmo!

Abraço a todos.


Responder Citar

23/09/2004

Redoctober

Nildo,

Com já disse funcionou...

Mas estou com um problema, tipo:

Tenho 2 Forms

FormPrincipal e FormPing

No FormPrincipal tem um Edit1, um Memo1, e um Button1.

No FormPrincipal tem um menu que chama o FormPing. No FormPing tem um Edit2, um Memo2 e um ok. No edit2 do FormPing eu digito o IP e a quantidade de pings e quando eu clico em OK, a tela FormPing continua aberto e envia o ip para o FormPrincipal e começa a disparar. A resposta do Ping ta no memo1 do FormPrincipal, eu gostaria de enviar essa resposta para o Memo2 dentro FormPing que esta aberto em cima do FormPrincipal.

Só que preciso que seja em tempo real. Tentei com Timer mais deu muito erro.

Como eu faço isso Nildo?

===============
ping -c 5 10.10.1.1
PING 10.10.1.1 (10.10.1.1): 56 data bytes
64 bytes from 10.10.1.1: icmp_seq=0 ttl=64 time=0.105 ms
64 bytes from 10.10.1.1: icmp_seq=1 ttl=64 time=0.075 ms
64 bytes from 10.10.1.1: icmp_seq=2 ttl=64 time=0.063 ms
64 bytes from 10.10.1.1: icmp_seq=3 ttl=64 time=0.080 ms
64 bytes from 10.10.1.1: icmp_seq=4 ttl=64 time=0.068 ms

--- 10.10.1.1 ping statistics ---
5 packets transmitted, 5 packets received, 0¬ packet loss
round-trip min/avg/max/stddev = 0.063/0.078/0.105/0.015 ms
¬
===============


Responder Citar