IdTCPServer, idTCPCliente
04/01/2006
0
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á
Posts
26/03/2006
Paullsoftware
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:
26/03/2006
Paullsoftware
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:
26/03/2006
Kroki
Melhor vc salvar a tela em JPG e copiar o arquivo JPG normalmente pela rede.
27/03/2006
Paullsoftware
certo, copiar eu sei, mais salvar como jpg não! :wink:
27/03/2006
Paulocesar1301
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
27/03/2006
Paullsoftware
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
dúvida...
AThread.Connection.Disconnect;
27/03/2006
Paullsoftware
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?
28/03/2006
Paullsoftware
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:
28/03/2006
Paulocesar1301
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:
29/03/2006
Paullsoftware
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:
29/03/2006
Paulocesar1301
29/03/2006
Paullsoftware
[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...
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:
Clique aqui para fazer login e interagir na Comunidade :)