quinta-feira, 2 de junho de 2011

Criando atalhos rápidos no sistema

Uma dica bem rápida e simples de ser implementada, imaginando sua tela de cadastro de Clientes, onde um dos campos se refere a entrada de CEP e você vai implementar um formulário para pesquisa de Cidades e CEPs, a forma comum é colocar um pequeno botão ao lado do Edit e adicionar o código que chama a janela de consulta, mas e agilizando isso sem usar o mouse, com teclas de atalho, iria ajudar?

Neste mesmo Edit, vamos fazer que quando o mesmo estiver com o foco, ao pressionar a tecla F2 a janela de busca será exibida, basta que adicione ao evento OnKeyDown o seguinte trecho de código:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_F2 then
begin
frmbusca := Tfrmbusca.Create(Self);
frmbusca.ShowModal;
FreeAndNil(frmbusca);
{Ou substitua as 3 linhas por SeuForm.Show se o mesmo já foi criado}
end;
end;

Pronto, execute a aplicação, posicione o foco dentro com componente Edit1 e pressione a tecla F2, o formulário de consulta será exibido. Abraço e até o próximo post.

Controlar ou limitar caracteres no Edit

O titulo do tópico acaba sendo um pouco limitado, mas o recurso que irei mostrar a seguir é muito simples e pode ser aplicado em qualquer componente utilizado para digitação de caracteres. Partindo do exemplo de um edit, denominado por exemplo para receber o CPF de uma pessoa, obviamente pode aceitar a digitação de números do "0" ao "9" e também o "." (Ponto) e o "-" (hífen), não permitindo mais nenhum outro caractere, ou sim, o "#8", ou seja, o comando de apagar da direita para esquerda (Backspace).

Em qualquer componente que deseja atribuir o controle, basta que adicione ao evento OnKeyPress o seguinte trecho de códigos:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9','.','-',#8]) then
abort;
end;

Pronto, em qualquer componente que você irá adicionar o código ao evento mencionado, será controlada a digitação destes caracteres. Abraço, até o próximo post.

quinta-feira, 26 de maio de 2011

Capturar Imagem do Form e transformar em JPG

Salve galera, estou estendendo meu dia hoje, ou melhor, minha madrugada para compartilhar uma dica talvez não tão importante, mas que em casos iguais a este que me fez usar o recurso, pode ser interessante. Tenho uma situação de um sistema onde ocorrem casos do cliente dizer "...mas eu tinha colocado o valor certo, foi o sistema que alterou", e já cansado de procurar pelo dito erro no sistema, vou passar a desconfiar do usuário e dar um "Print" no formulário dele a hora que ele salvar e guardar o jpg, ou seja, vou capturar a imagem do form, transformar em jpg e salvar no diretório do sistema. Se ele apagar os arquivos, bom, ai acho que é possível interpretar que ele está assumindo a culpa, caso contrário, vou ter pelo menos uma prova que ele digitou mesmo o valor correto e voltar a bater cabeça procurando o erro no sistema.

A solução é bem simples, declare nas uses a classe "jpeg" e em seguida crie uma função ou adicione o código no próprio botão "Salvar", conforme segue abaixo:

procedure TfrmReservas.BitBtn2Click(Sender: TObject);
var
JpgSave: TJPEGImage;
begin
{aqui minha rotina de salvar o registro, cálculos, atualiza estoque, reserva quantidades, etc...}
//Cria um objeto do tipo Jpeg
JpgSave := TJPEGImage.Create;
try
//Captura a imagem do form
JpgSave.Assign((frmReservas as TForm).GetFormImage);
//Verifica se existe o diretório para salvar a imagem, se não existir, é criado
if not DirectoryExists(ExtractFilePath(Application.ExeName)+'jpg') then
CreateDir(ExtractFilePath(Application.ExeName)+'jpg');
//Salva a imagem no diretório, usando como nome o próprio código do registro salvo no banco
JpgSave.SaveToFile(ExtractFilePath(Application.ExeName)+'jpg\'+LblNumReserva.Caption+'.jpg');
finally
//Limpa objeto da memória
FreeAndNil(JpgSave);
end;
End;

Pronto, após isso, ao executar o sistema e clicar sobre o botão onde o código foi adicionado, observe que uma pasta jpg foi criada no mesmo diretório do executável do sistema e que lá estará o print do formulário. O print a seguir é da tela do sistema onde implementei a função, trata-se da reserva de sementes de grãos para associados de um sindicato, onde o sistema faz uma projeção do estoque disponível e vincula um associado à quantidade solicitada.

Espero que tenha ajudado, abraços.