quarta-feira, 16 de fevereiro de 2011

Executar o Windows Explorer em uma pasta específica


Veja nesta dica um código simples, capaz de abrir via programação o Windows Explorer, iniciando-o em uma pasta específica. Para compilar, é necessário acrescentar ao uses a unit ShellApi, e codificar a seguinte função:

function ExecExplorer(OpenAtPath: string; OpenWithExplorer,
  OpenAsRoot: Boolean): Boolean;
var
  s: string;
begin
  if OpenWithExplorer then
  begin
    if OpenAsRoot then
      s := ' /e,/root,"' + OpenAtPath + '"'
    else
      s := ' /e,"' + OpenAtPath + '"';
  end
  else
    s := '"' + OpenAtPath + '"';

  result := ShellExecute(
    Application.Handle,
    PChar('open'),
    PChar('explorer.exe'),
    PChar(s),
    nil,
    SW_NORMAL) > 32;
end;
Para testar, podemos fazer, por exemplo:

  ExecExplorer('C:\Temp', True, True);

terça-feira, 15 de fevereiro de 2011

Executável que se auto-deleta


Veja nessa dica de nosso colunista Handem Vogel como implementar a auto-exclusão do programa em execução. Primeiramente, declare o procedimento
procedure TForm1.DeletaExe;
Var
  Arquivo: TextFile;
begin
  AssignFile(Arquivo, ChangeFileExt(ParamStr(0), '.bat'));
  try
    ReWrite(Arquivo);
    WriteLn(Arquivo, ':1');
    WriteLn(Arquivo, Format('Erase "%s"', [ParamStr(0)]));
    WriteLn(Arquivo, Format('If exist "%s" Goto 1', [ParamStr(0)]));
    WriteLn(Arquivo, Format('Erase "%s"', [ChangeFileExt(ParamStr(0), '.bat')]));
  finally
    CloseFile(Arquivo);
  end;
  WinExec(PChar(ChangeFileExt(ParamStr(0), '.bat')), sw_hide);
  Halt;
end;
Agora, no evento onClose do formulário, basta chamar a procedure acima, com o seguinte código:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DeletaExe;
end;
Isto fará com que o executável se "auto-exclua" assim que fechado!

segunda-feira, 14 de fevereiro de 2011

Procedimentos com parâmetros opcionais:

Quando você declara o procedimento:

procedure Esperar(Segundos: Byte);
Você está determinando que todas as vezes que o procedimento. Esperar for chamado, deverá ser passado um valor do tipo Byte. No entanto, esse tipo de declaração exige que em todas as chamadas ao procedimento Esperar seja especificado um parâmetro.

Se você fizer uma chamada do tipo:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Esperar()
end;
Será gerado um erro do tipo: Not enough actual parameters. Mas você pode declarar e implementar o procedimento da seguinte forma:

procedure Esperar(Segundos: Byte = 1);
begin
  Sleep(Segundos * 1000);
end;
A declaração acima faz com que o procedimento Esperar assuma o valor 1 caso nenhum parâmetro seja passado. Assim você poderá fazer uma chamada ao procedimento em qualquer das situações abaixo:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Esperar(); // nenhum parâmetro, será assumido o valor 1
  Esperar(1);
  Esperar // nenhum parâmetro, será assumido o valor 1
end;

Cuidados quando criar procedimentos e funções com parametros

Quando criamos procedimentos e funções podemos introduzir parâmetros com
valores defaultdevemos porém respeitar algumas regras:

Esse parâmetros precisam ocorrer no final da lista;

precisam ser constantes

Não pode fazer por referência(var alguma coisa)

Respeitando essas regras o delphi permite criar sem problemas funções ou
procedimentos do tipo:

function Resizer(X: Real; Y: Real = 2.0): Real;
procedimento Multiplicar(var X:Real;X:Real=1;Resposta:Real=0);
etc...

Se vc chamar "resizer" sem os parâmetros o delphi considera que vc quer
usar os valores default da função....

Tenha MUITA ATENÇÃO PORÉM com funções ou procedimentos que forma
declarados em overload ou "sobrecarga" que permite que dois ou mais
procedimentos ou funções tenham nomes iguais desde que tenham parâmetros
diferentes.Isso criaria problemas na lógica do compilador....Pense, O
que difere um procediemnto do tipo:

1)procedure teste(A:integer);overload

2)procedure teste(A:integer=0);overload;

Se vc chamar teste(x) o compilador não sabe se vc está querendo chamar o
procedimento 1 ou 2...

Função de potenciação - Juros

Segue abaixo uma função para efetuar a potenciação. É útil para compor formulas financeiras, como a de VP ("PV" valor presente) VF ("FV" valor futuro).

Exemplo:
Calcular o valor de um produto para o prazo de 30 dias com a taxa de juros de 5% mês.

var

 i: Real; // taxa de juros
 valor: Real; // valor base para calculo do valor futuro.
 pz: Integer // prazo em dias
begin
  i := 5//100;
  valor:= 1000.00
  pz := 30
  Result:= valor*( Pot( (1+i), (pz/30) ) //Resultado 1.050,00
end;
no excel a Pot é substituída pelo sinal ^ Ex. =E18*((1+C19)^(C20/30))

Function Pot( base, expoente: real ):real; // Potenciação
begin
        { utiliza a função de exponencial e de logaritmo }
     Result:= Exp((expoente * Ln( base )));
end;
 
Dicas:
Não amplie o nome da função, pois as funções financeiras costumam ser bem extensas.

domingo, 13 de fevereiro de 2011

Atualizando Dados em Rede com Zeos


Procurei muito na internet sobre como atualizar as informações de minha aplicação nas estações. Tentei todos os tipos de comandos e funções que eu poderia fazer e não funcionou. Os dados só eram visualizados após reiniciar o programa. Foi aí que descobri a solução
Nas propiedades do ZConnection (deve ser a antepenultima opção, 3ª de baixo para cima no Object Inspector), está a TransactIsolationLevel. Mude-a de itNone para tiReadCommited.
Pronto! Faça a alteração de um registro em qualquer estação e ao fazer uma busca novamente em um outro computador / executável, já verá carregado as novas informações.

sábado, 12 de fevereiro de 2011

Gerando imagem para validação de números.


Gerando imagem para validação de números
Hoje em dia está sendo muito usado a geração de imagens para confirmação de alguma ação. Um exemplo disse é o email da uol, onde você tem uma opção de solicitar a confirmação do envio.
Bom, segue uma função que faz isso:

Primeiro adicione no seu form os componentes TButton, TImage e TEdit.

unit Unit1;
  interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
  Image1: TImage;
  Button1: TButton;
  Edit1: TEdit;
  procedure Button1Click(Sender: TObject);
  procedure FormShow(Sender: TObject);
private
  { Private declarations }
public
 { Public declarations }
  function GeraImagem(Img: TImage): string;
end;
 
var
  Form1: TForm1;
  validapost : string;
implementation
{$R *.dfm}
{ TForm1 }
function TForm1.GeraImagem(Img: TImage): string;
  const
    f: array [0..4] of string =  ('Courier New', 'Impact', 'Times New Roman', 'Verdana', 'Arial');
    s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    C : ARRAY [0..14] OF tcOLOR = (clAqua, clBlack, clBlue, clFuchsia, clGray, clGreen, clLime, clMaroon, clNavy, clOlive, clPurple, clRed, clSilver, clTeal, clYellow);
 
var
  i, x, y : integer;
  r : string;
begin
  randomize;
  Img.Width := 160;
  Img.Height := 60;
  for i := 0 to 3 do
  r := r + s[Random(length(s)-1)+1];
  with Img.Picture.Bitmap do
  begin
    width := Img.Width;
    Height := Img.Height;
    Canvas.Brush.Color := $00EFEFEF;
    Canvas.FillRect(Img.ClientRect);
    for i := 0 to 3 do
    begin
      Canvas.Font.Size := random(20) + 20;
      Canvas.Font.Name := f[High(f)];
      Canvas.Font.Color := c[random(High(c))];
      Canvas.TextOut(i*40,0,r[i+1]);
    end;
    for i := 0 to 2 do
    begin
      Canvas.Pen.Color := c[random(High(c))];
      Canvas.Pen.Width := 2;
      canvas.MoveTo(random(Width),0);
      Canvas.LineTo(random(Width),Height);
      Canvas.Pen.Width := 1;
      x := random(Width-10);
      y := random(Height-10);
      Canvas.Rectangle(x,y,x+10,y+10);
    end;
  end;
  Result := r;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if (Edit1.Text = validapost) then
    Application.MessageBox('Parabéns, muito bem','Sucesso',
  MB_OK + MB_ICONINFORMATION);
  FormShow(self);
end;
 
procedure TForm1.FormShow(Sender: TObject);
begin
  validapost := GeraImagem(Image1);
end;
 
end.

Curso de Delphi: 7.Consultas SQL