CheckBox na DBGrid - selecionando varios campos e gerando
Ola Pessoal, tenho baixado um exemplo em anexo, pois preciso que em vez de selecionar com ctrl+mouse gostaria apenas de usar o check box para apenas selecionar as linhas desejadas, por gentileza alguem tem esta função ou exemplo para me enviar, agradeço a todos que postarem.
[color=blue:0cc65fcf24][b:0cc65fcf24]Movido de Interbase/Firebird para Delphi[/b:0cc65fcf24][/color:0cc65fcf24]
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key in [1, 4, 22] then
begin
DBGrid1.DataSource.DataSet.First;
while not DBGrid1.DataSource.DataSet.Eof do
begin
{Ctrl+A}
if key = 1 then
DBGrid1.SelectedRows.CurrentRowSelected := true;
{Ctrl+D}
if key = 4 then
DBGrid1.SelectedRows.CurrentRowSelected := false;
{Ctrl+I}
if key = 22 then
DBGrid1.SelectedRows.CurrentRowSelected := not DBGrid1.SelectedRows.CurrentRowSelected;
DBGrid1.DataSource.DataSet.Next;
end;
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
if FileExists(ClientDataSet1.FileName) then ClientDataSet1.LoadFromFile()
else ClientDataSet1.CreateDataSet;
end;
procedure TForm1.ClientDataSet1AfterDelete(DataSet: TDataSet);
begin
ClientDataSet1.SaveToFile();
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
With DBGrid1 do
Begin
if SelectedRows.Count > 0 then
for i := 0 to Pred(SelectedRows.Count) do
Begin
{posiciona nos registros selecionados do DBGrid}
DataSource1.Dataset.Bookmark := SelectedRows[i];
Memo1.Lines.Add(´Selecionado: ´+ClientDataSet1bairro_nome.AsString)
end;
end;
end;[color=blue:0cc65fcf24][b:0cc65fcf24]Movido de Interbase/Firebird para Delphi[/b:0cc65fcf24][/color:0cc65fcf24]
Amarildo
Curtidas 0
Respostas
Amarildo
05/10/2005
Por gentileza, alguem poderia me orientar no procedimento de como montar, ou caso, tenha algum exemplo para enviar-me, agradeço
GOSTEI 0
Marcio.theis
05/10/2005
De uma olhada neste link, podera lhe ajudar, eu não testei ainda se funciona ou não....
http://delphi.about.com/od/usedbvcl/l/aa082003a.htm
http://delphi.about.com/od/usedbvcl/l/aa082003a.htm
GOSTEI 0
Amarildo
05/10/2005
Ola Marcio, é este exemplo no qual estou necessitando, voce saberia me dizer se teria condicoes de baixa-lo no site, pois nao encontrei nenhuma opção, no aguardo.
GOSTEI 0
Marcio.theis
05/10/2005
Na página tem um item ´More of this Feature´ onde tem os link´s... mas acho que não estão funcionando...
GOSTEI 0
Massuda
05/10/2005
...é este exemplo no qual estou necessitando...
Esse exemplo mostra como usar um DBCheckBox para mostrar o valor de um campo Boolean existente no DataSet ligado ao DBGrid (via DataSource).Você tem um campo na tabela para indicar que o registro vai ser impresso?
GOSTEI 0
Amarildo
05/10/2005
Ola Massuda, eu criei um campo virtual pelo newfield, camp calculado e joguei aquele exemplo acima na bdgrid só que esta desalinhando o campo na dbgrid, o campo do checkbox, caso tenha interesse posso estar enviando o projeto para dar uma olhada. grato
GOSTEI 0
Massuda
05/10/2005
...criei um campo virtual pelo newfield, camp calculado...
Não deve estar funcionando... um campo calculado é somente leitura, você só pode modificar o valor do campo no evento OnCalcFields do dataset.GOSTEI 0
Amarildo
05/10/2005
Ola Massuda, este programa estará rodando no CD, onde seleciono varios itens da dbgrid, marcando os que realmente o cliente selecionar e posteriomente estará gerando um relatorio no Word. Este metodo tenho feito com o comando ctrl+enter para estar marcando, e esta funcionando, só que percebi que a dificuldade do cliente estar teclando varias teclas simultaneamente esta tornando dispendioso, fazendo com que o cliente fique descobrindo onde esta as teclas para estar usando-as. Caso queira posso estar direcionando para voce o programa para dar uma olhada, desde já agradeço novamente pela atenção a minha pessoa, no aguardo por maiores informações.
GOSTEI 0
Diogoalles
05/10/2005
olá amarildo
eu já havia postado um tópico com o que você quer e não consegui.
você poderia me dizer se conseguiu com o que foi passado?
como você para que o campo calculado mude de valor ao clicar no check q está no grid ?
obrigado
Diogo
eu já havia postado um tópico com o que você quer e não consegui.
você poderia me dizer se conseguiu com o que foi passado?
como você para que o campo calculado mude de valor ao clicar no check q está no grid ?
obrigado
Diogo
GOSTEI 0
Amarildo
05/10/2005
Ola Diogo, tenho feito funcionar com o comando ctrl+enter, achei muito bom este metodo, só que, o cliente deseja que seja com um simples click num determinado campo na dbgrid que passa a selecionar as linhas que ele deseja, então pensei em usar o mesmo metodo do ctrl mas usando com o click do mouse para facilitar a selecao das linhas na dbgrid, optei pelo checkbox, aparentemente nao esta dando resultado como eu esperava, muitos erros e duvidas que foram surgindo no decorrer da programação, que estou quase desistindo de usar checkbox na dbgrid, peguei varios exemplos na internet e inseri no contexto do programa funcionou em partes mais depois começou gerar varios outros erros ocasionais que nao tive paciencia em estar solucionando. Por este motivo gostaria de saber quem teria condições de me orientar qual comando posso SUBSTITUIR O CTRL+ENTER pelo CKICK DO MOUSE.
GOSTEI 0
Diogoalles
05/10/2005
É amarildo, você parou no mesmo ponto que eu. Porque realmente o usuário final quer funcionalidade e é isso que preciso. Inclusive criei um tópico tempos atraz e não consegiram me ajudar e não consegui resolver.
Do meu ponto de vista parece simples. Eu já tenho um componente de grid que exibe os campos booelan no formato check.
Você tem um TAble com um Datasource, este ligado ao DBGrid. Aí você cria um campo calculado ´check´ do tipo boolean;
Ai coloquei no Oncalcfields da tabela para check = false. Então todos os registros não estão checados.
Assim pensei numa rotina no DBGrid.OnCellClick. Se for igual a coluna ´check´ então, Table1.Check := not(Table1.Check).
Só que não funciona porque a tabela não está em edição.
Então o unico problema nessa minha idéia é saber com calcular o valor deste campo só para o registro que cliquei, fazendo ele receber conforme acima.
Está ai a ideia, de repente com a ajuda da galera conseguiremos.
o componente DBGrid com check q utilizo é do pacote TCF (www.elivaldo.com.br).
abraço
Diogo
Do meu ponto de vista parece simples. Eu já tenho um componente de grid que exibe os campos booelan no formato check.
Você tem um TAble com um Datasource, este ligado ao DBGrid. Aí você cria um campo calculado ´check´ do tipo boolean;
Ai coloquei no Oncalcfields da tabela para check = false. Então todos os registros não estão checados.
Assim pensei numa rotina no DBGrid.OnCellClick. Se for igual a coluna ´check´ então, Table1.Check := not(Table1.Check).
Só que não funciona porque a tabela não está em edição.
Então o unico problema nessa minha idéia é saber com calcular o valor deste campo só para o registro que cliquei, fazendo ele receber conforme acima.
Está ai a ideia, de repente com a ajuda da galera conseguiremos.
o componente DBGrid com check q utilizo é do pacote TCF (www.elivaldo.com.br).
abraço
Diogo
GOSTEI 0
Amarildo
05/10/2005
Ola Diogo, voce saberia me dizer se existe alguma funcao para passar o comando ctrl+enter para um click do mouse conforme encontra-se este exemplo em anexo, se caso soubesse como resolver esta funcao, ai sim, estariamos concretizando as nossas duvidas, nao e mesmo, no aguardo por maiores informacoes, obrg pelas idéias e dicas, valeu.
GOSTEI 0
Diogoalles
05/10/2005
olá amarildo e pessoal
estou tentando retomar essa questão do checkbox no dbgrid para selecionar os registros ao inves de usar o ´Ctrl+clique mouse´
alguem descobriu alguma alternativa ?
alguma novidade, ideia, dica :
abraço
Diogo
estou tentando retomar essa questão do checkbox no dbgrid para selecionar os registros ao inves de usar o ´Ctrl+clique mouse´
alguem descobriu alguma alternativa ?
alguma novidade, ideia, dica :
abraço
Diogo
GOSTEI 0
Will
05/10/2005
Olá Amarildo,
Vamos supor que o nome do dbgrid é DBGrid1 então faça o seguinte:
- Deixe desmarcada a opção gbMultiSelect em Options do DBGrid
- Deixe marcada a opção ReadOnly
- Coloque como primeira coluna do DBGrid um campo que você não irá mostrar (no exemplo eu usei ´CODIGO´);
- no evento OnDrawDataCell coloque
[color=green:ece5d8fe96][b:ece5d8fe96]procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if (Field.FieldName = ´CODIGO´) and (not (gdFixed in State)) then
begin
// Desenha um campo em branco
DBGrid1.Canvas.FillRect(Rect);
// Testa de a linha está selecionada ou não
if DBGrid1.SelectedRows.IndexOf(DBGrid1.DataSource.DataSet.Bookmark) >= 0 then
DrawFrameControl(DBGrid1.Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_CHECKED) // Desenha o CheckBox desmarcado
else
DrawFrameControl(DBGrid1.Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONCHECK); // Desenha o CheckBox marcado
end;
end;[/b:ece5d8fe96][/color:ece5d8fe96]
- no evento OnCellClick coloque
[color=green:ece5d8fe96][b:ece5d8fe96]procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
DBGrid1.SelectedRows.CurrentRowSelected := not DBGrid1.SelectedRows.CurrentRowSelected;
end;[/b:ece5d8fe96][/color:ece5d8fe96]
Caso deseje marcar somente quando clicar na coluna que for CheckBox faça o teste da coluna no OnCellClick
Vamos supor que o nome do dbgrid é DBGrid1 então faça o seguinte:
- Deixe desmarcada a opção gbMultiSelect em Options do DBGrid
- Deixe marcada a opção ReadOnly
- Coloque como primeira coluna do DBGrid um campo que você não irá mostrar (no exemplo eu usei ´CODIGO´);
- no evento OnDrawDataCell coloque
[color=green:ece5d8fe96][b:ece5d8fe96]procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if (Field.FieldName = ´CODIGO´) and (not (gdFixed in State)) then
begin
// Desenha um campo em branco
DBGrid1.Canvas.FillRect(Rect);
// Testa de a linha está selecionada ou não
if DBGrid1.SelectedRows.IndexOf(DBGrid1.DataSource.DataSet.Bookmark) >= 0 then
DrawFrameControl(DBGrid1.Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_CHECKED) // Desenha o CheckBox desmarcado
else
DrawFrameControl(DBGrid1.Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONCHECK); // Desenha o CheckBox marcado
end;
end;[/b:ece5d8fe96][/color:ece5d8fe96]
- no evento OnCellClick coloque
[color=green:ece5d8fe96][b:ece5d8fe96]procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
DBGrid1.SelectedRows.CurrentRowSelected := not DBGrid1.SelectedRows.CurrentRowSelected;
end;[/b:ece5d8fe96][/color:ece5d8fe96]
Caso deseje marcar somente quando clicar na coluna que for CheckBox faça o teste da coluna no OnCellClick
GOSTEI 0
Erivando
05/10/2005
Olá Amarildo,
Vamos supor que o nome do dbgrid é DBGrid1 então faça o seguinte:
- Deixe desmarcada a opção gbMultiSelect em Options do DBGrid
- Deixe marcada a opção ReadOnly
- Coloque como primeira coluna do DBGrid um campo que você não irá mostrar (no exemplo eu usei ´CODIGO´);
- no evento OnDrawDataCell coloque
[color=green:232d96230b][b:232d96230b]procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if (Field.FieldName = ´CODIGO´) and (not (gdFixed in State)) then
begin
// Desenha um campo em branco
DBGrid1.Canvas.FillRect(Rect);
// Testa de a linha está selecionada ou não
if DBGrid1.SelectedRows.IndexOf(DBGrid1.DataSource.DataSet.Bookmark) >= 0 then
DrawFrameControl(DBGrid1.Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_CHECKED) // Desenha o CheckBox desmarcado
else
DrawFrameControl(DBGrid1.Canvas.Handle, Rect, DFC_BUTTON, DFCS_BUTTONCHECK); // Desenha o CheckBox marcado
end;
end;[/b:232d96230b][/color:232d96230b]
- no evento OnCellClick coloque
[color=green:232d96230b][b:232d96230b]procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
DBGrid1.SelectedRows.CurrentRowSelected := not DBGrid1.SelectedRows.CurrentRowSelected;
end;[/b:232d96230b][/color:232d96230b]
Caso deseje marcar somente quando clicar na coluna que for CheckBox faça o teste da coluna no OnCellClick
será que dar para adicionar algum nome ao lado do chek?
GOSTEI 0