Array
(
)

Dados do DbCheckbox em DBGrid

Jrjoliv2003
   - 03 set 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.


Sandra
   - 03 set 2004

Jr,

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


Jrjoliv2003
   - 03 set 2004

Infelizmente não sou assinante.

Se puderem me ajudar...

Valeu a força!!

JR.


Gandalf.nho
   - 03 set 2004

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


Jrjoliv2003
   - 06 set 2004

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.


Jrjoliv2003
   - 06 set 2004

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;


Jrjoliv2003
   - 07 set 2004

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;


Jrjoliv2003
   - 11 set 2004

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;


Bon Jovi
   - 11 set 2004

Se o tipo for string: #Código


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:
#Código

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.


Jrjoliv2003
   - 11 set 2004

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.