CheckBox na DBGrid - selecionando varios campos e gerando

Delphi

05/10/2005

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.

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

Amarildo

Curtidas 0

Respostas

Amarildo

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

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


GOSTEI 0
Amarildo

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

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

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

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

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

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

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


GOSTEI 0
Amarildo

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

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


GOSTEI 0
Amarildo

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

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


GOSTEI 0
Will

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


GOSTEI 0
Erivando

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
POSTAR