Array
(
)

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

Redoctober
   - 13 set 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.

OBS:

A resposta é em tempo real do comando


Dentro do RichEdit fica assim quando termina do o comando.

Gandalf.nho
   - 13 set 2004

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


Redoctober
   - 13 set 2004


Citação:
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.


Sandra
   - 14 set 2004

redoctober,

Veja se é isto que quer fazer:
#Código

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


Redoctober
   - 14 set 2004

#Código

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!


Redoctober
   - 14 set 2004

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

Sandra se vc puder ajudar....

Abraços


Redoctober
   - 14 set 2004

Pessoal,

tentei utilizar os métodos abaixo, mais não tive êxito nenhum
#Código


parte : TStringList;
begin

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


Seria mais ou menos por aí?


Sandra
   - 14 set 2004

redoctober,

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

#Código

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;



Redoctober
   - 14 set 2004


Citação:
redoctober,

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

#Código

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


Redoctober
   - 21 set 2004


Citação:
redoctober,

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

#Código

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?


Sandra
   - 21 set 2004


Citação:
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?


Redoctober
   - 22 set 2004


Citação:

Citação:
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?


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 -> 200.195.24.32:


Redoctober
   - 22 set 2004


Citação:
=´redoctober´]
Citação:
=´sandra´]
Citação:
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 -> 200.195.24.32:



Nildo
   - 23 set 2004

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:

#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.

#Código

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.


Redoctober
   - 23 set 2004


Citação:
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:

#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.

#Código

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.

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.


Redoctober
   - 23 set 2004

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?

Nildo
   - 23 set 2004

quando você adicionar no Form1 o resultado, adiciona no Form2.memo2 também


Redoctober
   - 23 set 2004


Citação:
quando você adicionar no Form1 o resultado, adiciona no Form2.memo2 também


Por uma série de fatores isso não é possível!

A função que vc me passou vai ser usado é nesse esquema. Vou usar a função para ler o memo na tela principal, pegar somente o IP e o TEMPO e enviar para o memo2 na Tela FormPing... Entendeu agora?

Só que preciso que faça isso em tempo real, tipo, apareceu no memo da tela principal a seguinte linha:

64 bytes from 10.10.1.1: icmp_seq=0 ttl=64 time=0.105 ms

Então o script vai tratar e mandar para o memo2 no FromPring o seguinte:

Alvo: 10.10.1.1 Tempo: 0.105

E assim com as outras linhas se tiver.

Entendeu agora?


Nildo
   - 23 set 2004

Mas não há dificuldade nisso.
Você não dá um Lines.ADD no richedit principal? Na linha de baixo você já coloca para adicionar no Form2 o resultado da minha função