Dados do DbCheckbox em DBGrid
03/09/2004
0
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
Posts
03/09/2004
Sandra
Na edição nº 44 da revista ClubeDelphi tem um ótimo artigo do Guinther Pauli - Segredos do DBGrid, explicando como fazer isso.
03/09/2004
Jrjoliv2003
Se puderem me ajudar...
Valeu a força!!
JR.
03/09/2004
Gandalf.nho
06/09/2004
Jrjoliv2003
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.
06/09/2004
Jrjoliv2003
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;
07/09/2004
Jrjoliv2003
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;
11/09/2004
Jrjoliv2003
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;
11/09/2004
Bon Jovi
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); const CtrlState : array[Boolean] 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[Column.Field.AsString = ´V´]); 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]; 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] 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]); end; end; procedure TForm1.FormCreate(Sender: TObject); var FieldTeste: TBooleanField; begin DBGrid1.OnDrawColumnCell := DBGrid1DrawColumnCell; DBGrid1.DataSource := DataSource1; DBGrid1.Options := [dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgConfirmDelete, dgCancelOnExit]; 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.
11/09/2004
Jrjoliv2003
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.
Clique aqui para fazer login e interagir na Comunidade :)