Pega a última linha de um Rich e jogar em outro Rich
13/09/2004
0
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
Posts
13/09/2004
Gandalf.nho
13/09/2004
Redoctober
Exatamente!
So que eu nao consegui fazer isso... Sera que alguem pode me dar exemplos de como eu devo fazer?
Valeu a atencao.
14/09/2004
Sandra
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], 15, 13) + ´ ´ + copy(RichEdit1.Lines[i], 46, 14)); end;
Boa sorte! :D
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], 15, 13) + ´ ´ + copy(RichEdit1.Lines[i], 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!
14/09/2004
Redoctober
Sandra se vc puder ajudar....
Abraços
14/09/2004
Redoctober
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í?
14/09/2004
Sandra
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]; 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;
14/09/2004
Redoctober
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]; 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
21/09/2004
Redoctober
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]; 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?
21/09/2004
Sandra
Como assim, ´separar por espaço´? Pode explicar melhor?
22/09/2004
Redoctober
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]
22/09/2004
Redoctober
23/09/2004
Nildo
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 ] ).Bytes PegarInfo( RichEdit1.Lines[ 1 ] ).IP PegarInfo( RichEdit1.Lines[ 1 ] ).icmp_seq PegarInfo( RichEdit1.Lines[ 1 ] ).Ttl PegarInfo( RichEdit1.Lines[ 1 ] ).Time
Qualquer dúvida responde o tópico ou deixe-me saber se funcionou. Um abraço.
23/09/2004
Redoctober
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;
PegarInfo( RichEdit1.Lines[ 1 ] ).Bytes PegarInfo( RichEdit1.Lines[ 1 ] ).IP PegarInfo( RichEdit1.Lines[ 1 ] ).icmp_seq PegarInfo( RichEdit1.Lines[ 1 ] ).Ttl PegarInfo( RichEdit1.Lines[ 1 ] ).Time
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.
23/09/2004
Redoctober
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
¬
===============
Clique aqui para fazer login e interagir na Comunidade :)