Clique aqui para ler esse artigo em PDF.
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
4." [...] continue lendo...