Dados do DbCheckbox em DBGrid

03/09/2004

Estou com mais um problema.
Tenho 7 dbcheckbox que, uma para cada dia da semana. Programei cada um deles para se estiver marcado gravar no BD ´V´ senão ele grava ´F´.
Por exigência da banca examinadora do projeto final eles querem que no dbgrid os campos com F apareçam em branco e com V aparecesse no DBGRid um símbolo, vulgarmente chamado de ´vezinho´. Como que eu faço isso?

Valeu a força!!

JR.


Jrjoliv2003

Respostas

03/09/2004

Sandra

Jr,

Na edição nº 44 da revista ClubeDelphi tem um ótimo artigo do Guinther Pauli - Segredos do DBGrid, explicando como fazer isso.


Responder Citar

03/09/2004

Jrjoliv2003

Infelizmente não sou assinante.

Se puderem me ajudar...

Valeu a força!!

JR.


Responder Citar

03/09/2004

Gandalf.nho

Não precisa ser assinante para comprar a revista, pode comprá-la em banca ou adquiri-la direto da editora.


Responder Citar

06/09/2004

Jrjoliv2003

Alguém teria um código exemplo, por favor!! É muito importante. Moro fora do centro da minha cidade e não encontrei a revista.

Tenho 7 dbcheckbox que, uma para cada dia da semana. Programei cada um deles para se estiver marcado gravar no BD ´V´ senão ele grava ´F´.
Por exigência da banca examinadora do projeto final eles querem que no dbgrid os campos com F apareçam em branco e com V aparecesse no DBGRid um símbolo, vulgarmente chamado de ´vezinho´. Como que eu faço isso?

Valeu a força!!

JR.


Responder Citar

06/09/2004

Jrjoliv2003

Galera!!

Pesquisei no Fórum e encontrei o código abaixo. Porém não estou conseguindo colocá-lo em execução. Estou precisando apenas de colocar dados da dbgrid como checkbox. Se um determinado campo tem valor ´V´ gostaria que aparecesse um checkbox marcado. Se for ´F´ um checkbox desmarcado. É apenas para visualização, não vou fazer edição na dbgrid.

Quem puder ajudar.....

JR.


O código:
No evento OnDrawColumnCell coloque o código:

if (gdFocused in State) and (Column.Field = Campo) then
begin
DBCheckbox1.SetBounds(
Rect.Left + DBGrid1.Left + 1,
Rect.Top + DBGrid1.Top + 1,
Rect.Right - Rect.Left,
Rect.Bottom - Rect.Top);
end;


No evento OnCollEnter:

if DBGrid1.Columns[DBGrid1.SelectedIndex].Field = Campo then
DBCheckbox1.Visible := True
else
DBCheckBox1.Visible :=False;


E por fim, no evento OnKeyPress:

if DBCheckBox1.Visible and (Ord(Key) > 31) then
begin
Key :=#0;
Table1.Edit;
DBCheckBox1.Checked := not DBCheckBox1.Checked;
DBCheckBox1.Field.AsBoolean := DBCheckBox1.Checked;
end;


Responder Citar

07/09/2004

Jrjoliv2003

Pessoal isso é muito importante para mim. Começou a avaliação do meu Projeto Final. Muito coisa que está no porjeto fiz graças ao fórum pois sou novato em programação. A banca examinadora exigiu que resolvesse o probelma abaixo:

Pesquisei no Fórum e encontrei o código abaixo. Porém não estou conseguindo colocá-lo em execução. Estou precisando apenas de colocar dados da dbgrid como checkbox. Se um determinado campo tem valor ´V´ gostaria que aparecesse um checkbox marcado. Se for ´F´ um checkbox desmarcado. É apenas para visualização, não vou fazer edição na dbgrid.

Quem puder ajudar.....

JR.


O código:
No evento OnDrawColumnCell coloque o código:

if (gdFocused in State) and (Column.Field = Campo) then
begin
DBCheckbox1.SetBounds(
Rect.Left + DBGrid1.Left + 1,
Rect.Top + DBGrid1.Top + 1,
Rect.Right - Rect.Left,
Rect.Bottom - Rect.Top);
end;


No evento OnCollEnter:

if DBGrid1.Columns[DBGrid1.SelectedIndex].Field = Campo then
DBCheckbox1.Visible := True
else
DBCheckBox1.Visible :=False;


E por fim, no evento OnKeyPress:

if DBCheckBox1.Visible and (Ord(Key) > 31) then
begin
Key :=#0;
Table1.Edit;
DBCheckBox1.Checked := not DBCheckBox1.Checked;
DBCheckBox1.Field.AsBoolean := DBCheckBox1.Checked;
end;


Responder Citar

11/09/2004

Jrjoliv2003

Pessoal isso é muito importante para mim. Começou a avaliação do meu Projeto Final. Muito coisa que está no porjeto fiz graças ao fórum pois sou novato em programação. A banca examinadora exigiu que resolvesse o problema abaixo:

Pesquisei no Fórum e encontrei o código abaixo. Porém não estou conseguindo colocá-lo em execução. Estou precisando apenas de colocar dados da dbgrid como checkbox. Se um determinado campo tem valor ´V´ gostaria que aparecesse um checkbox marcado. Se for ´F´ um checkbox desmarcado. É apenas para visualização, não vou fazer edição na dbgrid.

Quem puder ajudar.....

JR.


O código:
No evento OnDrawColumnCell coloque o código:

if (gdFocused in State) and (Column.Field = Campo) then
begin
DBCheckbox1.SetBounds(
Rect.Left + DBGrid1.Left + 1,
Rect.Top + DBGrid1.Top + 1,
Rect.Right - Rect.Left,
Rect.Bottom - Rect.Top);
end;


No evento OnCollEnter:

if DBGrid1.Columns[DBGrid1.SelectedIndex].Field = Campo then
DBCheckbox1.Visible := True
else
DBCheckBox1.Visible :=False;


E por fim, no evento OnKeyPress:

if DBCheckBox1.Visible and (Ord(Key) > 31) then
begin
Key :=#0;
Table1.Edit;
DBCheckBox1.Checked := not DBCheckBox1.Checked;
DBCheckBox1.Field.AsBoolean := DBCheckBox1.Checked;
end;


Responder Citar

11/09/2004

Bon Jovi

Se o tipo for string:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
 CtrlState : array[Boolean&93; of Integer = (DFCS_BUTTONCHECK,
     DFCS_BUTTONCHECK or DFCS_CHECKED);
var
  DesenhoCheckBox : TRect;
begin
  if not Assigned(Column.Field) then
    Exit;

  if Column.Field.FieldName = ´CAMPO_TESTE´ then
  begin
    TDBGrid(Sender).Canvas.FillRect(Rect);
    DesenhoCheckBox.Left := Rect.Left + 2;
    DesenhoCheckBox.Right := Rect.Right - 2;
    DesenhoCheckBox.Top := Rect.Top + 2;
    DesenhoCheckBox.Bottom := Rect.Bottom - 2;
    DrawFrameControl(TDBGrid(Sender).Canvas.Handle,
      DesenhoCheckBox,
      DFC_BUTTON,
      CtrlState&91;Column.Field.AsString = ´V´&93;);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  FieldTeste: TStringField;
begin
  DBGrid1.OnDrawColumnCell := DBGrid1DrawColumnCell;
  DBGrid1.DataSource := DataSource1;
  DBGrid1.Options := [dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgConfirmDelete, dgCancelOnExit&93;;
  DBGrid1.ReadOnly := True;
    
  FieldTeste := TStringField.Create(ClientDataSet1);
  FieldTeste.FieldName := ´CAMPO_TESTE´;
  FieldTeste.FixedChar := True;
  FieldTeste.DataSet := ClientDataSet1;
  ClientDataSet1.CreateDataSet;
  DataSource1.DataSet := ClientDataSet1;

  ClientDataSet1.Insert;
  FieldTeste.AsString := ´V´;
  ClientDataSet1.Post;

  ClientDataSet1.Insert;
  FieldTeste.AsString := ´F´;
  ClientDataSet1.Post;

  ClientDataSet1.Insert;
  FieldTeste.AsString := ´F´;
  ClientDataSet1.Post;

  ClientDataSet1.Insert;
  FieldTeste.AsString := ´V´;
  ClientDataSet1.Post;                    
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ClientDataSet1.EmptyDataSet;
  ClientDataSet1.Close;
end;

Se o tipo for boolean:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
 CtrlState : array[Boolean&93; of Integer = (DFCS_BUTTONCHECK,
     DFCS_BUTTONCHECK or DFCS_CHECKED);
var
  DesenhoCheckBox : TRect;
begin
  if not Assigned(Column.Field) then
    Exit;

  if Column.Field.DataType = ftBoolean then
  begin
    TDBGrid(Sender).Canvas.FillRect(Rect);
    DesenhoCheckBox.Left := Rect.Left + 2;
    DesenhoCheckBox.Right := Rect.Right - 2;
    DesenhoCheckBox.Top := Rect.Top + 2;
    DesenhoCheckBox.Bottom := Rect.Bottom - 2;
    DrawFrameControl(TDBGrid(Sender).Canvas.Handle,
      DesenhoCheckBox,
      DFC_BUTTON,
      CtrlState[Column.Field.AsBoolean&93;);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  FieldTeste: TBooleanField;
begin
  DBGrid1.OnDrawColumnCell := DBGrid1DrawColumnCell;
  DBGrid1.DataSource := DataSource1;
  DBGrid1.Options := &91;dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgConfirmDelete, dgCancelOnExit&93;;
  DBGrid1.ReadOnly := True;
    
  FieldTeste := TBooleanField.Create(ClientDataSet1);
  FieldTeste.FieldName := ´CAMPO_TESTE´;
  FieldTeste.DataSet := ClientDataSet1;
  ClientDataSet1.CreateDataSet;
  DataSource1.DataSet := ClientDataSet1;

  ClientDataSet1.Insert;
  FieldTeste.AsBoolean := True;
  ClientDataSet1.Post;

  ClientDataSet1.Insert;
  FieldTeste.AsBoolean := False;
  ClientDataSet1.Post;

  ClientDataSet1.Insert;
  FieldTeste.AsBoolean := False;
  ClientDataSet1.Post;

  ClientDataSet1.Insert;
  FieldTeste.AsBoolean := True;
  ClientDataSet1.Post;                    
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ClientDataSet1.EmptyDataSet;
  ClientDataSet1.Close;
end;


Se quiser testar essa demonstracao, coloque um DBGrid, DataSource e ClientDataSet no Form. Fica melhor fazer um componente com isso.


Responder Citar

11/09/2004

Jrjoliv2003

Galera!!!

Um colega da faculdade conseguiu esse código para colocar a imagem
de um checkbox marcado ou de um check desmarcado. Como eu queria visualizar apenas,
o código serviu.

var
fig:TBitMap;
pos:TRect;

if (DataCol = 8) then
Begin
fig:=TBitMap.Create;
if TabelaCampo.value = ´V´ then
fig.LoadFromFile(´c:\Windows\Desktop\Figuras\check.bmp´)
else
fig.LoadFromFile(´c:\Windows\Desktop\Figuras\uncheck.bmp´);

pos.Left:=(Column.Width + Fig.Width) div 2;
pos.Top:=3;
DBGrid1.Canvas.Draw(pos.left + Rect.left, pos.top + rect.top, Fig);
Fig.Free;
end;

Onde:
DataCOl = 8 é uma coluna que adiciono na Dbgrid para colocar a imagem.´
É necessário ter as figuras do check marcado e do check desmarcado.

Valeu!!!

Mas Obrigado por ter respondido. Copiei o código fornecido e vou testar.

JR.


Responder Citar