60 dicas delphi

Upload: jose-nelson-guindo

Post on 06-Jul-2015

1.810 views

Category:

Documents


6 download

TRANSCRIPT

Esse artigo faz parte da revista Clube Delphi Edio 60. Clique aqui para ler todos os artigos desta edio

60 Dicas e Solues em Delphi!Para comemorar a edio 60 da ClubeDelphi, reunimos neste super artigo nada mais nada menos que 60 dicas para incrementar suas aplicaes Delphi. So segredos, curiosidades, FAQs e exemplos de utilizao 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 aplicaes! Todos os exemplos e cdigos tambm podem ser encontrados para download no endereo deste artigo. As dicas foram construdas 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, possvel salvar a imagem para um arquivo ou apresentar o resultado em um formulrio, atravs de um componente Image. Por exemplo, use esse recurso para criar um relatrio de erros, que salve o estado atual da tela do usurio quando uma exceo no tratada ocorrer (uma dica enviar a imagem por e-mail para o desenvolvedor responsvel).

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 utilizao } { 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 mquina da rede

GP - Esse recurso bastante utilizado por aplicaes estilo trojan, permitindo que o intruso possa observar o que a pessoa na outra mquina est fazendo. Deixando o hackerismo de lado, um exemplo prtico da tcnica monitorar remotamente a ao de usurios na sua aplicao. Por exemplo, muito comum utilizar esse recurso em programas que controlam lan-houses, ou aplicaes estilo PcAnywhere ou Terminal Services. A idia simples, construmos duas aplicaes que trocam imagens atravs de sockets, usando streams. O primeiro passo construir a aplicao servidora, que deve ficar em execuo em todas as mquinas a serem monitoradas. Em uma nova aplicao VCL, coloque no formulrio umIdTCPServer da Indy. Configure seu DefaultPort para 8090 e Active para True. No seu eventoOnExecute digite o cdigo da Listagem 2. Observe que fazemos uso da rotina CapturaTela, mostrada no exemplo anterior. Na aplicao cliente, coloque um IdTCPClient da Indy e defina a propriedade Port como 8090. Coloque um Image, um Edit e um Button. No evento OnClick doButton digite o cdigo da Listagem 3. Voc pode colocar um Timer e chamar o mesmo cdigo, se quiser que a imagem seja atualizada constantemente. Ao clicar no boto, a imagem mostrar a tela do computador indicado no Edit (digite o endereo IP ou o nome da mquina).

Listagem 2. Servidor captura tela da mquina 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. Aplicao 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 aplicao Delphi GP - Hoje em dia, muito comum sua aplicao precisar de informaes ou utilizar servios disponibilizados por outra aplicao. No para menos que surgiram os Web Services. Com essa tecnologia, podemos incluir em nossas aplicaes servios 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 atravs de Web Services e pesquisa pela disponibilidade do produto, pelo melhor preo e j faz a encomenda automaticamente. Porm, a realidade nos mostra que, muitos servios na Web esto somente disponveis para acesso via browser. Ou seja, para usar o servio, preciso abrir um browser, conectar no site da empresa e usar seu servio (exemplos: envio de mensagem para celular, consulta lista telefnica, consulta ao CPF etc.). Uma sada fazer a requisio no brao. justamente o que mostrarei aqui. A idia simples: montamos uma requisio HTTP (como se nossa aplicao fosse um browser), enviamos a solicitao ao site desejado, obtemos a pgina de retorno e fazemos o parse do HTML a procura da informao desejada. Vamos a um exemplo simples: em uma nova aplicao, coloque um IdHTTP, um Label e um Button. No evento OnClickdo Button digite:

var s: string; begin s := IdHTTP1.Get('http://br.invertia.com'); Label1.Caption := copy(s,pos('Compra',s) + 115,7); end;

O cdigo anterior mostra em um Label a cotao on-line do dlar, obtida atravs da consulta HTTP ao site indicado no cdigo. Recebido o retorno, procuramos por uma palavra-chave no HTML (de preferncia que seja sempre fixa) e fazemos a captura do valor pela posio relativa.

4. Preenchendo formulrios de Web Sites programaticamente GP - No exemplo anterior, recuperamos uma pgina da Web apenas indicando a URL. Muitas vezes, no entanto, o contedo de retorno depende da passagem de parmetros ou do preenchimento de campos de um formulrio. Vou dar um exemplo: o site de pesquisa Googlepossui uma opo para traduo (ferramentas de idiomas). Antes de obter a pgina com a traduo de uma palavra/texto, precisamos passar o valor do campo desejado na requisio HTTP. exatamente isso que fiz no cdigo da Listagem 4. Nele, o texto em ingls digitado em um Memo traduzido para o portugus. Observe que o parse feito de forma totalmente manual. Imagine o leque de opes que voc ter agora, sabendo como utilizar esse recurso. Poder integrar sua aplicao a uma gama enorme de servios disponibilizados na Web, mesmo que no sejam oferecidos via Web Services.

Listagem 4. Preenchendo formulrios 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; Memo1.lines.Clear; while s[p] '