quinta-feira, 20 de agosto de 2015

Adicionar o evento OnClick no DBGrid

Problema:

Meu programa precisa processar algo quando o usuário clicar no DBGrid em um determinado form. O problema é que o DBGrid não possui o evento OnClick. É possível adicionar este evento no DBGrid?

Solução:

É possível sim. Afinal é muito simples. Siga os passos abaixo para resolver seu problema:

- Monte seu form normalmente, colocando o DBGrid e demais componentes;

- Vá na seção "private" da unit e declare a procedure abaixo:

private
  procedure DBGridClick(Sender: TObject);
- Logo após a palavra "implementation", escreva a procedure:

implementation
{$R *.DFM}

procedure TForm1.DBGridClick(Sender: TObject);
begin
  ShowMessage('Clicou no DBGrid.');
end;
- Coloque as instruções abaixo no evento OnCreate do Form:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGrid1.ControlStyle :=
  DBGrid1.ControlStyle + [csClickEvents];
  TForm(DBGrid1).OnClick := DBGridClick;
end;
- E pronto. Execute e teste.

Observações
O segredo principal desta dica está OnCreate do Form. A primeira instrução ativa o evento OnClick. A segunda instrução acessa o manipulador do evento OnClick. Para isto precisamos tratar o DBGrid como se fosse Form, pois o evento OnClick está declarado como protegido (protected) na classe TDBGrid. 

segunda-feira, 17 de agosto de 2015

Consultando entre datas utilizando SQL

Coloque no formulário dois componentes TDateTimePicker, um TDbgrid e um TButton. Ligue seu TDbgrid a tabela do teu banco que queres aplicar a consulta, e no  evento onclic do compoenente TButton adicione o código abaixo.

If DateTimePicker2.Date < DateTimePicker1.Date Then
begin
       ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');
       DateTimePicker2.Date := DateTimePicker1.Date;
end
Else
begin
     Inicio := DateToStr(DateTimePicker1.Date);
     Final := DateToStr(DateTimePicker2.Date);
     Query1.Close;
     Query1.SQL.Clear;
     //Campos utilizados somente para exemplo. Utilize os campos que achar necessário apresentação
     //em seu Dbgrid
     Query1.SQL.Text := 'SELECT Nome,Empresa,FoneRes,FoneCom,Mala FROM Contatos
     WHERE Data >=:pInicial and Data<=:pFinal ORDER BY Nome';
     Query1.ParamByName('pInicial').AsDateTime := StrToDate(Inicio);
     Query1.ParamByName('pFinal').AsDateTime := StrToDate(Final);
     Query1.Prepare;
     Query1.Open;
     DBGrid.SetFocus;
end;
Label3.Caption := 'Total de contatos: ' + IntToStr(Query1.RecordCount) ;
  

Consulta SQL que usa a data do sistema

Problema:

Preciso fazer uma consulta com SQL que me retorne todos os registros em que o valor de um campo do tipo data seja igual ou anterior à dada do sistema. Como fazer?

Solução:

Query.Close;
Query.SQL.Text := 'select * from Tabela where CampoData <= :Hoje';
Query.ParamByName('Hoje').AsDate := Date;
Query.Open;

Bloco PL/SQL para inserção de dados

Pergunta 
Criar um bloco pl/sql que insira um novo dep na tabela s_dept 

- use a sequencia s_dept_id para o campo id da tabela 

- solicite ao usuario o nome do dep 

- insira valores nulos p/ o campo region_id 

Resposta 
-> no banco de dados... 
create or replace 
procedure insere_departamento (v_nome char) is 
v_id number; 
begin 
  SELECT sequenciaID.NEXTVAL INTO v_id FROM DUAL; 
  insert into tabela (id,dep,region_id) 
  values (v_id,v_nome,null); 
end insere_departamento; 

-> no delphi..

- coloque o objeto TStoredProc dentro do formulario que ira disparar esta procedure; 
- no evento que voce quiser que dispare coloque o seguinte codigo: 
 var 
  v_nome : String[50]; 
  begin 
{caso vc queira informar o nome do departamento atraves de uma caixa de dialogo} 
  V_nome := inputbox('Informe o nome do departamento.','Depto:',''); 
  .Params[0].AsString := v_nome; 
{caso vc queira buscar o nome atraves de um TEdit já preenchido} 
  .Params[0].AsString := .Text; 
  .ExecProc; 
  end; 

Inserindo uma Imagem no Formulário

A dica abaixo apresenta o código para implementação da função para inserir uma imagem no fundo do formulário. 

A função permite que se especifique as coordenadas da imagem e qual o arquivo que contém a imagem.

Através do componente TBitMap é possível criar uma figura dinamicamente e especificar qual será a imagem, através do método LoadFromFile.

Para desenhar a imagem usa-se o componente Tcanvas, através do método Draw, que desenha um gráfico nas coordenadas especificadas.

Código Completo:

declara após o type junto aos outros procedimentos!

Procedure Desenha(figura:String;H,V:Integer);

Procedure TForm1.Desenha(figura:String;H,V:Integer);
Var 
Imagem :TBitMap;
begin 
Imagem := TBitMap.Create;
Try
Imagem.LoadFromFile(Figura); 
Canvas.Draw(H,V,Imagem); 
Except 
ShowMessage(' Arquivo não foi localizado !'); 
end;
end;
ExemploQuando o botão for clicado, uma imagem será inserida no formulário, nas coordenadas (10,20);

procedure TForm1.Button1Click(Sender: TObject);
begin 
Desenha('c:\windows\bolhas.bmp',10,20);
end;

Como desenhar um Bitmap num form

var
Form1: TForm1;
Bmp: TBitmap;
implementation
{$R *.DFM}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Bmp:=TBitmap.Create;
  Bmp.Loadfromfile('c:\windows\nuvens.bmp');
end;

procedure TForm1.TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Draw(50,50,Bmp);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Bmp.Free;
end;