IdTCPServer, idTCPCliente
Estou usando esses dois componentes , e estou tentando enviar uma imagem um PrintScreen, funciona assim
O servidor solicita o PrintScreen, o cliente recebe a solicitação, da o PrintScreen, cria a imagem e envia como Stream, o servidor recebe o Stream, grava a imagem, e ler a imagem apartir da TImage
O cliente gera a imagem e manda mas quando o servidor recebe e grava, a imagem não aparece, fica como se tive-se vazia.
O que pode ser??
O servidor solicita o PrintScreen, o cliente recebe a solicitação, da o PrintScreen, cria a imagem e envia como Stream, o servidor recebe o Stream, grava a imagem, e ler a imagem apartir da TImage
O cliente gera a imagem e manda mas quando o servidor recebe e grava, a imagem não aparece, fica como se tive-se vazia.
O que pode ser??
Rudá
Curtidas 0
Respostas
Paullsoftware
04/01/2006
[quote:947d3e646a=´Rudá´]Estou usando esses dois componentes , e estou tentando enviar uma imagem um PrintScreen, funciona assim
O servidor solicita o PrintScreen, o cliente recebe a solicitação, da o PrintScreen, cria a imagem e envia como Stream, o servidor recebe o Stream, grava a imagem, e ler a imagem apartir da TImage
O cliente gera a imagem e manda mas quando o servidor recebe e grava, a imagem não aparece, fica como se tive-se vazia.
O que pode ser??[/quote:947d3e646a]
Eu to precisando fazer isso que vc já fez, me mostra o teu código ai :idea: :wink:
O servidor solicita o PrintScreen, o cliente recebe a solicitação, da o PrintScreen, cria a imagem e envia como Stream, o servidor recebe o Stream, grava a imagem, e ler a imagem apartir da TImage
O cliente gera a imagem e manda mas quando o servidor recebe e grava, a imagem não aparece, fica como se tive-se vazia.
O que pode ser??[/quote:947d3e646a]
Eu to precisando fazer isso que vc já fez, me mostra o teu código ai :idea: :wink:
GOSTEI 0
Rudá
04/01/2006
Você envia por stream só que tem que disconectar para enviar!
GOSTEI 0
Paullsoftware
04/01/2006
não entendi, como assim... tenho que desconectar do servidor para poder enviar a tela...
enviar a tela do servidor para o cliente eu fiz numa boa
não consigo é, enviar do cliente para o servidor. da erro.
pode postar teu código ae! :lol:
enviar a tela do servidor para o cliente eu fiz numa boa
não consigo é, enviar do cliente para o servidor. da erro.
pode postar teu código ae! :lol:
GOSTEI 0
Kroki
04/01/2006
O componente indy tem esse exemplo mas é lento demais.
Melhor vc salvar a tela em JPG e copiar o arquivo JPG normalmente pela rede.
Melhor vc salvar a tela em JPG e copiar o arquivo JPG normalmente pela rede.
GOSTEI 0
Paullsoftware
04/01/2006
O componente indy tem esse exemplo mas é lento demais.
Melhor vc salvar a tela em JPG e copiar o arquivo JPG normalmente pela rede.
certo, copiar eu sei, mais salvar como jpg não! :wink:
GOSTEI 0
Paulocesar1301
04/01/2006
Capturando Tela:
No Execute do Server:
Com isso aki você consegue um arquivo muito pequeno com uma qualidade boa... ótimo para transferência via rede:
Aki trabalho com telas quase que em :!: ´tempo real´ :!: , pois uso um timer com temporização de apenas 1000 e roda beleza
function CapturaTela: TBitmap; var dc:hdc; cv:TCanvas; begin result := TBitmap.Create; result.Width := Screen.Width; result.Height := Screen.Height; dc := GetDc(0); cv := TCanvas.Create; cv.Handle := DC; result.Canvas.CopyRect(Rect(0, 0,Screen.Width,Screen.Height), cv,Rect(0,0,Screen.Width, Screen.Height)); cv.Free; ReleaseDC (0, DC); end;
No Execute do Server:
s := AThread.Connection.ReadLn; sCommand := uppercase(copy(s,1,3)); if sCommand = ´SRN´ then begin tBM := TBitmap.Create; tBM := CapturaTela; jpg := TJPEGImage.Create; Try jpg.PixelFormat := jf8Bit; Except End; Try jpg.CompressionQuality := 30; Except End; Try jpg.Compress; Except End; jpg.Assign(tBM); DeleteFile(Tmp + ´Tela.jpg´); jpg.SaveToFile(Tmp + ´Tela.jpg´); jpg.Free; tBM.Free; Stm := TFileStream.Create(Tmp + ´Tela.jpg´, fmOpenRead + fmShareDenyNone); AThread.Connection.OpenWriteBuffer; AThread.Connection.WriteStream(Stm); AThread.Connection.CloseWriteBuffer; FreeAndNil(Stm); AThread.Connection.Disconnect; End
Com isso aki você consegue um arquivo muito pequeno com uma qualidade boa... ótimo para transferência via rede:
Try jpg.PixelFormat := jf8Bit; Except End; Try jpg.CompressionQuality := 30; Except End; Try jpg.Compress; Except End;
Aki trabalho com telas quase que em :!: ´tempo real´ :!: , pois uso um timer com temporização de apenas 1000 e roda beleza
GOSTEI 0
Paullsoftware
04/01/2006
Capturando Tela:
No Execute do Server:
Com isso aki você consegue um arquivo muito pequeno com uma qualidade boa... ótimo para transferência via rede:
Aki trabalho com telas quase que em :!: ´tempo real´ :!: , pois uso um timer com temporização de apenas 1000 e roda beleza
function CapturaTela: TBitmap; var dc:hdc; cv:TCanvas; begin result := TBitmap.Create; result.Width := Screen.Width; result.Height := Screen.Height; dc := GetDc(0); cv := TCanvas.Create; cv.Handle := DC; result.Canvas.CopyRect(Rect(0, 0,Screen.Width,Screen.Height), cv,Rect(0,0,Screen.Width, Screen.Height)); cv.Free; ReleaseDC (0, DC); end;
s := AThread.Connection.ReadLn; sCommand := uppercase(copy(s,1,3)); if sCommand = ´SRN´ then begin tBM := TBitmap.Create; tBM := CapturaTela; jpg := TJPEGImage.Create; Try jpg.PixelFormat := jf8Bit; Except End; Try jpg.CompressionQuality := 30; Except End; Try jpg.Compress; Except End; jpg.Assign(tBM); DeleteFile(Tmp + ´Tela.jpg´); jpg.SaveToFile(Tmp + ´Tela.jpg´); jpg.Free; tBM.Free; Stm := TFileStream.Create(Tmp + ´Tela.jpg´, fmOpenRead + fmShareDenyNone); AThread.Connection.OpenWriteBuffer; AThread.Connection.WriteStream(Stm); AThread.Connection.CloseWriteBuffer; FreeAndNil(Stm); AThread.Connection.Disconnect; End
Try jpg.PixelFormat := jf8Bit; Except End; Try jpg.CompressionQuality := 30; Except End; Try jpg.Compress; Except End;
a função para criar a tela eu já tenho CapturaTela, mais não ta compilando o código do onServerExecute não tá compilando...
nessa linha
jpg := TJPEGImage.Create;
dúvida...
AThread.Connection.Disconnect;
GOSTEI 0
Paulocesar1301
04/01/2006
Coloque Jpeg na Uses :wink:
GOSTEI 0
Paullsoftware
04/01/2006
Coloque Jpeg na Uses :wink:
desculpa a demora na resposta, eu já tinha conseguido, mais tira outra dúvida minha...
esse código é pra pegar a imagem do server ou do cliente?
GOSTEI 0
Paullsoftware
04/01/2006
Cara consegui fazer... valeu mesmo pela dica!
agora vamos lá... temo como fazer uma espécie de painel onde eu possa monitrar todos os terminais de uma única vez???
tipo coloco 4 tImage e cada um deles eu mostrar a tela de um terminal, claro, seria carregado cada um de uma vez, mais gostaria de fazer isso a cada 30 segundos... :roll:
agora vamos lá... temo como fazer uma espécie de painel onde eu possa monitrar todos os terminais de uma única vez???
tipo coloco 4 tImage e cada um deles eu mostrar a tela de um terminal, claro, seria carregado cada um de uma vez, mais gostaria de fazer isso a cada 30 segundos... :roll:
GOSTEI 0
Rudá
04/01/2006
É só colocar um timer com o interval de 30000 (30 segundos);
GOSTEI 0
Paulocesar1301
04/01/2006
Bom... acredito que seu Client (maq que solicitará as imagens) precisará ser um equipamento razoavelmente bom para isso funcionar sem problemas, mas em tese, a idéia é a mesma, basta solicitar a screen 4 vezes aos 4 IPs diferentes:
Agora, sinceramente não testei e desculpem amigos do forum se falei besteira... mas se colocares 4 IdTCPClients em seu form... podes fazer assim:
... onde tiver 01 basta alterar para a estação que quiser carregar ... ou trabalhas com [b:7aed5dc757]For[/b:7aed5dc757] ou duplicas o códigos estaticamente 4 vezes... vai depender do quanto seu sistema deverá ser dinâmico... no meu caso, acabei de saber que precisarei fazer tipo uma recepção (câmeras de segurança) então na minha tela o bendito do usuário terá a opção de selecionar quantas e quais as telas que ele quer ver ao mesmo tempo na tela... ainda estou pensando no código, mas já sei de antemão que terei que criar tudo em tempo de execução !!! Vai dar um trabalho !!! :cry:
Agora, sinceramente não testei e desculpem amigos do forum se falei besteira... mas se colocares 4 IdTCPClients em seu form... podes fazer assim:
MeuForm.IdTCPClient01.Host := IPUsu; MeuForm.IdTCPClient01.Connect; MeuForm.IdTCPClient01.WriteLn(´SRN´); Stm := TFileStream.Create(Tmp + ´telaest01.jpg´,fmCreate); try while MeuForm.IdTCPClient01.Connected do MeuForm.IdTCPClient01.ReadStream(Stm,-1,true); except end; FreeAndNil(Stm); If FileExists(Tmp + ´telaest01.jpg´) Then begin MeuForm.ImagemTela01.Picture := nil; MeuForm.ImagemTela01.Picture.LoadFromFile(Tmp + ´telaest01.jpg´); Application.ProcessMessages; MeuForm.Refresh; end Else begin MeuForm.ImagemTela01.Picture := nil; end; MeuForm.IdTCPClient01.Disconnect;
... onde tiver 01 basta alterar para a estação que quiser carregar ... ou trabalhas com [b:7aed5dc757]For[/b:7aed5dc757] ou duplicas o códigos estaticamente 4 vezes... vai depender do quanto seu sistema deverá ser dinâmico... no meu caso, acabei de saber que precisarei fazer tipo uma recepção (câmeras de segurança) então na minha tela o bendito do usuário terá a opção de selecionar quantas e quais as telas que ele quer ver ao mesmo tempo na tela... ainda estou pensando no código, mas já sei de antemão que terei que criar tudo em tempo de execução !!! Vai dar um trabalho !!! :cry:
GOSTEI 0
Paullsoftware
04/01/2006
Bom... acredito que seu Client (maq que solicitará as imagens) precisará ser um equipamento razoavelmente bom para isso funcionar sem problemas, mas em tese, a idéia é a mesma, basta solicitar a screen 4 vezes aos 4 IPs diferentes:
Agora, sinceramente não testei e desculpem amigos do forum se falei besteira... mas se colocares 4 IdTCPClients em seu form... podes fazer assim:
... onde tiver 01 basta alterar para a estação que quiser carregar ... ou trabalhas com [b:01f2286447]For[/b:01f2286447] ou duplicas o códigos estaticamente 4 vezes... vai depender do quanto seu sistema deverá ser dinâmico... no meu caso, acabei de saber que precisarei fazer tipo uma recepção (câmeras de segurança) então na minha tela o bendito do usuário terá a opção de selecionar quantas e quais as telas que ele quer ver ao mesmo tempo na tela... ainda estou pensando no código, mas já sei de antemão que terei que criar tudo em tempo de execução !!! Vai dar um trabalho !!! :cry:
MeuForm.IdTCPClient01.Host := IPUsu; MeuForm.IdTCPClient01.Connect; MeuForm.IdTCPClient01.WriteLn(´SRN´); Stm := TFileStream.Create(Tmp + ´telaest01.jpg´,fmCreate); try while MeuForm.IdTCPClient01.Connected do MeuForm.IdTCPClient01.ReadStream(Stm,-1,true); except end; FreeAndNil(Stm); If FileExists(Tmp + ´telaest01.jpg´) Then begin MeuForm.ImagemTela01.Picture := nil; MeuForm.ImagemTela01.Picture.LoadFromFile(Tmp + ´telaest01.jpg´); Application.ProcessMessages; MeuForm.Refresh; end Else begin MeuForm.ImagemTela01.Picture := nil; end; MeuForm.IdTCPClient01.Disconnect;
não meu amigo, eu não quero solicitar as imagens através do cliente e sim através do servidor como faço hoje sem problemas...
hoje eu faço assim: como eu tenho uma lista dos clientes conectados, faço tenho um timer q a cada segundo paça para um novo cliente na lista (listbox) e solicito a imagem do cliente selecionado, sendo que, a imagem fica em um único timage, mais gostaria de colocar cada imagem em seu devido tImage, e estou tendo dor de cabeça para tals...
entendeu agora?
vlw :lol:
GOSTEI 0
Paulocesar1301
04/01/2006
Posso estar escrevendo besteira, mas no idTCP(Client/Server) o Server é que fica nas máquinas cliente e vice-versa... então quem solicita as imagens é o Client :wink:
GOSTEI 0
Paullsoftware
04/01/2006
Posso estar escrevendo besteira, mas no idTCP(Client/Server) o Server é que fica nas máquinas cliente e vice-versa... então quem solicita as imagens é o Client :wink:
[list=]O Sistema que fica nas estações possui apenas um idTcpClient
O Sistema que fica no Servidor possui apenas um idTcpServer[/list]
funciona perfeitamente o envio e recebimento de imagem por stream, como mencionei...
não meu amigo, eu não quero solicitar as imagens através do cliente e sim através do servidor como faço hoje sem problemas...
como eu disse já estou enviando numa boa a imagem do client para o server sem problemas, o quero que quero é uma ideia de como criar uma área de monitoramento para exibir as telas de todos os terminais em um form com 4 timages por exemplo. esse é meu problema! :cry:
GOSTEI 0
Paulocesar1301
04/01/2006
Brow... é exatamente igual a trabalhar com apenas um ... o único detalhe é que irás gastar mais recursos do equipamento ... fora isso funciona igual... fiz um teste básico com o que tinha aki (estático mesmo, sem intervenção do usuário... eu mesmo indiquei quais equipamentos deveria monitorar) e funcionou na boa...
PS.: se vai utilizar TImage com Stretch... aconselho colocar um duplo clique para o usuário poder ver a tela monitorada ocupando toda a screen, pq a imagem não fica lá essas coisas... no mais funcionou igual... sem muito trabalho em código, só copy and paste...
PS.: se vai utilizar TImage com Stretch... aconselho colocar um duplo clique para o usuário poder ver a tela monitorada ocupando toda a screen, pq a imagem não fica lá essas coisas... no mais funcionou igual... sem muito trabalho em código, só copy and paste...
GOSTEI 0
Paullsoftware
04/01/2006
a ideia seria essa aqui
[img]http://img66.imageshack.us/my.php?image=imagem4vb.jpg[/img]
nas telas menores teria todas as estações e se o administrador desejar ver alguma delas em um tamanho maior, é só clicar e seria mostrada na janela maior, mais v disse que conseguiu fazer pra mostrar a tela de mais de um micro, posta ai o código de como vc fez...
[img]http://img66.imageshack.us/my.php?image=imagem4vb.jpg[/img]
nas telas menores teria todas as estações e se o administrador desejar ver alguma delas em um tamanho maior, é só clicar e seria mostrada na janela maior, mais v disse que conseguiu fazer pra mostrar a tela de mais de um micro, posta ai o código de como vc fez...
GOSTEI 0
Paullsoftware
04/01/2006
a ideia seria essa aqui
[img]http://img66.imageshack.us/my.php?image=imagem4vb.jpg[/img]
nas telas menores teria todas as estações e se o administrador desejar ver alguma delas em um tamanho maior, é só clicar e seria mostrada na janela maior, mais v disse que conseguiu fazer pra mostrar a tela de mais de um micro, posta ai o código de como vc fez...
não funcionou a imagem...
a ideia seria essa aqui
[url=http://img56.imageshack.us/my.php?image=imagem3qy.jpg][img:e1b2571937]http://img56.imageshack.us/img56/7900/imagem3qy.th.jpg[/img:e1b2571937][/url]
nas telas menores teria todas as estações e se o administrador desejar ver alguma delas em um tamanho maior, é só clicar e seria mostrada na janela maior, mais v disse que conseguiu fazer pra mostrar a tela de mais de um micro, posta ai o código de como vc fez...
GOSTEI 0