Artigo Clube Delphi 60 - 60 dicas e soluções em Delphi

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (3)  (0)

Artigo da Revista Clube Delphi Edição 60.

Esse artigo faz parte da revista Clube Delphi Edição 60. Clique aqui para ler todos os artigos desta edição

imagem_pdf.jpg

60 Dicas e Soluções em Delphi!

Para comemorar a edição 60 da ClubeDelphi, reunimos neste “super” artigo nada mais nada menos que 60 dicas para incrementar suas aplicações Delphi. São segredos, curiosidades, FAQs e exemplos de utilização das principais tecnologias relacionadas ao Delphi: ClientDataSet, dbExpress, BDP, ADO.NET, ASP.NET, Indy, DBGrid, InterBase/Firebird, Quick Report e muito mais! Com certeza você encontrará dicas valiosas para adaptar em suas aplicações! Todos os exemplos e códigos também podem ser encontrados para download no endereço deste artigo. As dicas foram construídas por Guinther Pauli (GP), Luciano Pimenta (LP) e Carlos Cantu (CC).

 

1. Capturando a imagem da tela (screen-shot) e salvando-a para um arquivo

GP - A rotina mostrada na Listagem 1 captura a imagem do desktop, retornando um objeto do tipo TBitmap. A partir dele, é possível salvar a imagem para um arquivo ou apresentar o resultado em um formulário, através de um componente Image. Por exemplo, use esse recurso para criar um relatório de erros, que salve o estado atual da tela do usuário quando uma exceção não tratada ocorrer (uma dica é enviar a imagem por e-mail para o desenvolvedor responsável).

 

Listagem 1. Capturando a imagem da tela

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;

{ Exemplos de utilização }

{ Captura a tela e salva para o disco }

CapturaTela.SaveToFile('tela.bmp');

{ Exibe a tela em um componente Image }

Image1.Picture.Assign(CapturaTela);

 

2. Capturando a imagem da tela (screen-shot) de uma máquina da rede

GP - Esse recurso é bastante utilizado por aplicações estilo “trojan”, permitindo que o intruso possa observar o que a pessoa na outra máquina está fazendo. Deixando o hackerismo de lado, um exemplo prático da técnica é monitorar remotamente a ação de usuários na sua aplicação. Por exemplo, é muito comum utilizar esse recurso em programas que controlam lan-houses, ou aplicações estilo PcAnywhere ou Terminal Services. A idéia é simples, construímos duas aplicações que trocam imagens através de sockets, usando streams.

O primeiro passo é construir a aplicação servidora, que deve ficar em execução em todas as máquinas a serem monitoradas. Em uma nova aplicação VCL, coloque no formulário um IdTCPServer da Indy. Configure seu DefaultPort para 8090 e Active para True. No seu evento OnExecute digite o código da Listagem 2. Observe que fazemos uso da rotina CapturaTela, mostrada no exemplo anterior. Na aplicação cliente, coloque um IdTCPClient da Indy e defina a propriedade Port como 8090. Coloque um Image, um Edit e um Button. No evento OnClick do Button digite o código da Listagem 3. Você pode colocar um Timer e chamar o mesmo código, se quiser que a imagem seja atualizada constantemente. Ao clicar no botão, a imagem mostrará a tela do computador indicado no Edit (digite o endereço IP ou o nome da máquina).

 

Listagem 2. Servidor captura tela da máquina e envia pela rede

procedure TForm1.IdTCPServerExecute(

  AThread: TIdPeerThread);

var

  Stm : TStream;

  Tela: TBitmap;

  cmd: string;

  fn: string;

  r: integer;

begin

  randomize;

  r := Random(MaxInt);

  fn := Format('tela%d.bmp',[r]);

  cmd := AThread.Connection.ReadLn;

  if pos('TELA',cmd) > 0 then

  begin

    Tela := CapturaTela;

    Tela.SaveToFile(fn);

    Tela.Free;

    Stm := TFileStream.Create(fn,

      fmOpenRead + fmShareDenyNone);

    AThread.Connection.OpenWriteBuffer;

    AThread.Connection.WriteStream(Stm);

    AThread.Connection.CloseWriteBuffer;

    FreeAndNil(Stm);

  end;

AThread.Connection.Disconnect;

end;

 

Listagem 3. Aplicação monitora terminais remotamente

procedure TForm1.Button1Click(Sender: TObject);

var

  Stm: TStream;

begin

  IdTCPClient1.Host := Edit1.Text;

  IdTCPClient1.Connect;

  WriteLn('TELA');

  Stm := TFileStream.Create('tela.bmp',fmCreate);

  try

    while IdTCPClient1.Connected do

      IdTCPClient1.ReadStream(Stm,-1,true);

  except

  end;

FreeAndNil(Stm);

Image1.Picture.LoadFromFile('tela.bmp');

end;

 

3. Obtendo dados da Web a partir de uma aplicação Delphi

GP - Hoje em dia, é muito comum sua aplicação precisar de informações ou utilizar serviços disponibilizados por outra aplicação. Não é para menos que surgiram os Web Services. Com essa tecnologia, podemos incluir em nossas aplicações serviços oferecidos por outras empresas. Por exemplo, você pode ter um sistema de controle de estoque que, dada a falta de um determinado produto, conecta-se automaticamente aos fornecedores através de Web Services e pesquisa pela disponibilidade do produto, pelo melhor preço e já faz a encomenda automaticamente.

Porém, a realidade nos mostra que, muitos serviços na Web estão somente disponíveis para acesso via browser. Ou seja, para usar o serviço, é preciso abrir um browser, conectar no site da empresa e usar seu serviço (exemplos: envio de mensagem para celular, consulta à lista telefônica, consulta ao CPF etc.). Uma saída é fazer a requisição “no braço”.

É justamente o que mostrarei aqui. A idéia é simples: montamos uma requisição HTTP (como se nossa aplicação fosse um browser), enviamos a solicitação ao site desejado, obtemos a página de retorno e fazemos o parse do HTML a procura da informação desejada. Vamos a um exemplo simples: em uma nova aplicação, coloque um IdHTTP, um Label e um Button. No evento OnClick do Button digite:

 

var s: string;

begin

  s := IdHTTP1.Get('http://br.invertia.com');

  Label1.Caption := copy(s,pos('Compra',s) + 115,7);

end;

 

O código anterior mostra em um Label a cotação on-line do dólar, obtida através da consulta HTTP ao site indicado no código. Recebido o retorno, procuramos por uma palavra-chave no HTML (de preferência que seja sempre fixa) e fazemos a captura do valor pela posição relativa.

 

4. Preenchendo formulários de Web Sites programaticamente

GP - No exemplo anterior, recuperamos uma página da Web apenas indicando a URL. Muitas vezes, no entanto, o conteúdo de retorno depende da passagem de parâmetros ou do preenchimento de campos de um formulário. Vou dar um exemplo: o site de pesquisa Google possui uma opção para tradução (ferramentas de idiomas). Antes de obter a página com a tradução de uma palavra/texto, precisamos passar o valor do campo desejado na requisição HTTP. É exatamente isso que fiz no código da Listagem 4. Nele, o texto em inglês digitado em um Memo é traduzido para o português. Observe que o parse é feito de forma totalmente manual.

Imagine o leque de opções que você terá agora, sabendo como utilizar esse recurso. Poderá integrar sua aplicação a uma gama enorme de serviços disponibilizados na Web, mesmo que não sejam oferecidos via Web Services.

 

Listagem 4. Preenchendo formulários Web programaticamente

procedure TForm1.Button2Click(Sender: TObject);

var

  s: string;

  Fields: TStrings;

  p: integer;

begin

  Fields := TStringList.Create;

  Fields.Add('text=' + memo1.lines.Text);

  Fields.Add('langpair=en|pt');

  s := IdHTTP1.Post(

    'http://translate.google.com/translate_t',Fields);

  p := pos('PHYSICAL',s) + 9;

"

A exibição deste artigo foi interrompida :(
Este post está disponível para assinantes MVP

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?