sábado, 2 de abril de 2011

Destacando título da coluna ativa no DBGrid


Alterar as cores do título de um DBGrid em tempo execução dará mais vida ao seu programa e trará uma aparência mais profissional ao sistema. Para que última coluna clicada tenha o título com um estilo diferente, faça no evento onTitleClick do DBGrid:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  i: integer;
begin
  //para todas as colunas
  for i:=0 to DBGrid1.Columns.count-1 do
  begin
    DBGrid1.Columns[i].Title.Color := clBtnFace; //fundo padrão
    DBGrid1.Columns[i].Title.Font.Color := clBlack; //texto preto
    DBGrid1.Columns[i].Title.Font.Style := []; //sem efeito
  end;

  //para a coluna atual
  Column.Title.color := ClYellow; //fundo amarelo
  Column.Title.Font.Color := clRed; //texto vermelho
  Column.Title.Font.Style := [fsBold, fsItalic]; //negrito e itálico
end;

sexta-feira, 1 de abril de 2011

Formatando a visualização do tamanho de um arquivo

Fonte: www.activedelphi.com.br

Quando se trabalha com arquivos no Delphi pode ser necessário exibir o tamanho de um arquivo, como é feito no Explorer, onde o valor não é mostrado em bytes, mas sim de acordo com o seu tamanho atual. Para a maioria, "45.678.123 Bytes" é confuso, mas "43,56 MB" não!
A seguir, temos uma função chamada FormatByteSize, que converte um valor em bytes para uma String que representa o número expressado em Bytes, Kilobytes Megabytes ou Gigabytes, dependendo do seu tamanho:

//Formata o tamanho de um arquivo
function FormatByteSize(const bytes: Longint): string;
const
  B = 1; //byte
  KB = 1024 * B; //kilobyte
  MB = 1024 * KB; //megabyte
  GB = 1024 * MB; //gigabyte
begin
  if bytes > GB then
    result := FormatFloat('#.## GB', bytes / GB)
  else
    if bytes > MB then
      result := FormatFloat('#.## MB', bytes / MB)
    else
      if bytes > KB then
        result := FormatFloat('#.## KB', bytes / KB)
      else
        result := FormatFloat('#.## bytes', bytes) ;
end;
Para usá-la, basta fazer no evento onClick de um button, por exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
  TamanhoEmBytes: Longint;
begin
  with TFileStream.Create(
    'C:\Windows\System32\calc.exe',
    fmOpenRead or fmShareExclusive)
  do try
    TamanhoEmBytes := Size;
  finally
    Free;
  end;

  ShowMessage( FormatByteSize(TamanhoEmBytes) );
end;

terça-feira, 29 de março de 2011

Ajustando a Data e a Hora do Computador

Fonte: www.activedelphi.com.br


Esta dica apresenta uma função simples, porém útil, para ajustar a data e a hora do sistema operacional. Ela foi postada pelo membro Rubem Rocha, na lista de discussão lista-delphi (link no final da dica). Fiz os testes e agora compartilho com vocês.
Segue o código da função:


function SetComputerDateTime(ADateTime: TDateTime): boolean;
const
  SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
var
  hToken: THandle;
  ReturnLength: DWORD;
  tkp, PrevTokenPriv: TTokenPrivileges;
  luid: TLargeInteger;
  dSysTime: TSystemTime;
begin
  Result := False;
  if Win32Platform = VER_PLATFORM_WIN32_NT then
    if OpenProcessToken(GetCurrentProcess,
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
    try
      if not LookupPrivilegeValue(nil, SE_SYSTEMTIME_NAME, luid) then
        Exit;

      tkp.PrivilegeCount := 1;
      tkp.Privileges[0].luid := luid;
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

      if not AdjustTokenPrivileges(hToken, False, tkp,
        SizeOf(TTOKENPRIVILEGES), PrevTokenPriv, ReturnLength) then
        Exit;

      if GetLastError <> ERROR_SUCCESS then
      begin
        raise Exception.Create(SysErrorMessage(GetLastError));
        Exit;
      end;
    finally
      CloseHandle(hToken);
    end;

  DateTimeToSystemTime(ADateTime, dSysTime);
  Result := SetLocalTime(dSysTime);
  if Result then
    PostMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0);
end;
Para testá-la, faça no onClick de um Button, por exemplo, o seguinte código:


procedure TForm1.Button1Click(Sender: TObject);
var
  Correta, Nova: TDateTime;
begin
  Correta := Now; //recupera a hora correta
  Nova := StrToDateTime('01/01/2011 12:34:56'); //gera uma nova data qualquer
  SetComputerDateTime(Nova); //altera a data
  ShowMessage('Clique em OK para voltar a data correta!'); //alerta o usuário
  SetComputerDateTime(Correta); //volta a data correta
end;