sábado, 1 de agosto de 2015

Capturar a data da BIOS ( Basic Input Output System ) do computador

Insira um objeto do tipo Button com a propriedade name definica como Button1 e um objeto do tipo Label com a propriedade definida como Label1.

procedure TForm1.Button1Click(Sender: TObject); 
begin
  Label1.Caption := 'Data da Bios: '+String(PChar(Ptr($FFFF5))); 
end; 

Como retornar a uma lista os campos indexados de um tabela

procedure TForm1.Button1Click(Sender: TObject);
var
      i : integer;
begin
     Table1.IndexDefs.Update;
     ListBox1.Items.add
    ('******** Índice Primário ********');
    for i:=0 to Table1.IndexDefs.Count-1 do
    begin
          if Table1.IndexDefs.Items[i].Options = [ixPrimary..ixUnique] then
          ListBox1.Items.add(Table1.IndexDefs.Items[I].Fields)
    else
         begin
              ListBox1.Items.add('');
              ListBox1.Items.add
              ('**** Índice Secundário ****');
              Listbox1.Items.Add(Table1.IndexDefs.Items[I].Name); 
          end;
     end; 
end;
  

Como filtrar registros de uma tabela pelo mês de um campo data

Você pode usar a função DecodeDate( ) no evento onFilterRecord de um componente TTable.

Ex.:

// não se esqueça de mudar a propriedade Filtered para True;
// isto fará com que o evento onFilterRecord seja disparado.

procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
var
  Dia, Mes, Ano: word;
begin
  Accept := false;
  DecodeDate(Table1['Competencia'],Ano,Mes,Dia);
  if Mes=MesFiltrado then
  Accept := True;
end;
Obs.: Você pode usar este mesmo código para filtrar por Ano ou por Dia, basta utilizar a comparação adequada no bloco if ... then

Como diminuir o tempo de abertura do TTable e TQuery

Operação feita quando é executado o método Open do componente TTable ou TQuery, que produz a compilação e execução do comando select. Quando esse método é executado através do componente TTable, o Delphi realiza uma série de outros comandos SQLs para buscar informações do catálogo da tabela necessárias para as operações de seleção e atualização. Essa busca pode ser otimizada através da opção ENABLE SCHEMA CACHE do BDE, fazendo com que essas informações sejam lidas apenas uma vez durante a execução da aplicação. Quando o primeiro acesso é feito, o BDE armazena as informações em um arquivo e qualquer nova necessidade de abertura da mesma tabela não necessita buscar novamente os elementos do catálogo.

Por outro lado, utilizando-se o componente TQuery, pode-se desviar dessa busca desde que não se utilize a propriedade Request Live que torna o "result set" da "query" atualizável automaticamente pelo Delphi. Se o valor da propriedade Request Live for TRUE e o SELECT utilizado obedecer as restrições para que o Delphi consiga atualizar o "result set", as mesmas buscas utilizadas para o componente TTable terão que ser feitas. 

Concluindo, para que a busca de elementos do catálogo não seja feita é necessário utilizar o componente TQuery e controlar as atualizações manualmente ou através de componentes do tipo TUpdateSQL.

sexta-feira, 31 de julho de 2015

Como formatar data para exibição por extenso

O Delphi permite formatar datas para apresentação por extenso de forma bastante simples. Vejamos os seguintes exemplos: 

Para formatar a data 18/03/1999, podemos utilizar: 

No create do form colocar

Shortdateformat :=

dddd, dd/mm/yyyy = Quinta, 18/03/1999 
dd/mmm/yyyy = 18/Mar/1999 
dddd, dd" de "mmmm" de "yyyy = Quinta, 18 de Março de 1999 
dd" de "mmmm" de "yyyy, dddd = 18 de Março de 1999, Quinta 

Função para acrescentar dias uteis a uma data

Retorna uma data acrescida de mais um certo número de dias  uteis descontando os fins de semana.

function Datafinal(dataini:tdatetime; dias_uteis:integer):tdatetime;
var dw:integer;
begin
  dw := DayOfWeek(dataini)-1;
  result := dataini+dias_uteis+((dias_uteis-1+dw) div 5)*2;
end;
  

Função para extrair o mês por extenso

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
function MesExtenso( Mes:Word ) : string;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.MesExtenso( Mês:Word ) : string; const meses : array[0..11] of PChar = ('Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro','Outubro', 'Novembro', 'Dezembro');
begin
result := meses[mes-1];
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption := MesExtenso(3);
end;

end.

Como usar a cláusula UNION em um Query

O uso do componente TQuery gera muitas vantagens e economiza muitas linhas de programação. Mas muitas vezes nos deparamos com situações que parecem não ser resolvidas com sentenças SQL. Vejamos um exemplo:

Você possui 2 tabelas (VendasExternas e VendasInternas) e deseja fazer um resumo de todas as vendas de um vendedor chamado Marcos. Se você usar a sentença

SELECT Nome, Valor FROM VendasExternas, VendasInternas
WHERE Nome = 'Marcos'
você vai obter como resultado uma query com 4 campos (Nome, Valor, Nome_1 e Valor_1) e um resultado bem confuso para ser manipulado.

Para resolver o problema, você poderá usar a sentença

SELECT Nome, Valor FROM VendasExternas
WHERE Nome = 'Marcos'
UNION ALL
SELECT Nome, Valor FROM VendasInternas
WHERE Nome = 'Marcos'
A sentença acima pede para que sejam identificados as vendas de Marcos na tabela VendasExternas, as vendas de Marcos na tabela VendasInternas e que o resultado da primeira seja unido com o resultado da segunda produzindo uma query com apenas 2 colunas.

segunda-feira, 27 de julho de 2015

Enviando informações direto para a impressora

Muitas vezes torna-se necessário, ou até mesmo, imprescindível que você envie informações diretamente para a impressora, uma vez que a utilização da impressão típica do Windows é um pouco demorada e o uso do driver Genérico/Somente Texto não é muito confiável.

Uma boa solução para enviar informações diretamente para a impressora é usar o seguinte código:

Procedure TForm1.Button1Click(Sender: Object);
var
    Imp: TextFile;
begin
    AssignFile(Imp, 'LPT1');
    Rewrite(Imp);
    Write(Imp, 'Isto vai sair na impressora');
    CloseFile(Imp);
end;

COMO ARRASTAR UM FORM SEM CLICAR NO CAPTION?

Quando você pressiona o botão do mouse, o Windows identifica a posição da tela onde o cursor estava no momento do clique. Se a posição é igual a área do Caption do Form, o Windows ativa o modo de movimentação do Form permitindo que este seja arrastado. Portanto, a maneira mais fácil de solucionar esta questão é "enganar" o Windows.
Neste exemplo vamos considerar que o usuário poderá arrastar o Form ao cli-car na área cliente deste Form:

a) Crie uma nova aplicação;
b) Adicione a seguinte declaração na seção private do Form:
procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;
c) Adicione o código deste procedimento na seção implementation do Form:

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;                   { ativa a herança da mensagem }
if M.Result = htClient then { o clique foi na área cliente? }
            M.Result := htCaption;     { se sim, faz o Windows pensar que foi no Cap-tion. }
          end;

      Este exemplo tratou o clique na área cliente. Você pode alterar este código para suas necessidades. Eis os possíveis valores para o Result:

     VALOR - Local do clique
     HTBORDER - Borda da janela que não tem a borda de tamanho
     HTBOTTOM - Borda horizontal inferior da janela
     HTBOTTOMLEFT - Canto inferior esquerdo da janela
     HTBOTTOMRIGHT - Canto inferior direito da janela
     HTCAPTION - Barra de Título(Caption)
     HTCLIENT - Área cliente
     HTERROR - igual ao HTNOWHERE, a diferença é que produz um beep indicando erro
     HTGROWBOX - Caixa de tamanho (igual ao HTSIZE)
     HTHSCROLL - Barra de rolagem horizontal
     HTLEFT - Borda esquerda da janela
     HTMENU - Em um menu
     HTNOWHERE - Plano de fundo da janela ou linha de divisão entre janelas
     HTREDUCE - Botão minimizar
     HTRIGHT - Borda direita da janela
     HTSIZE - Caixa de tamanho (igual ao HTGROWBOX)
     HTSYSMENU - Botão de Sistema/Fechar da janela MDIChild
     HTTOP - Borda horizontal superior da janela
     HTTOPLEFT - Canto superior esquerdo da janela
     HTTOPRIGHT - Canto direito superior da janela
     HTTRANSPARENT - Janela em segundo plano
     HTVSCROLL - Barra de rolagem vertical
     HTZOOM - Botão maximizar