Sobre Seleção no DBGrid...

Delphi

03/10/2005

Pessoal vi um programa feito em VB e achei muito interessante a maneira como ele utilizou o multi-select no DBGrid... o usuário simplismente dá um duplo clique no Indicador e a linha fica selecionada, evitando ter q apertar o Cntrl... visto q a maioria dos usuários desse sitema gostam dessa forma (e não como o meu está trabalhando, q é o normal do DBGrid do delphi) gostaria de uma luz de como fazer isso... só lembrando q ele não muda a cor, das linhas selecionadas, somente deixa uma bolinha na coluna do indicador mostrando q ela está indicada...


Bruno Belchior

Bruno Belchior

Curtidas 0

Respostas

Michael

Michael

03/10/2005

Olá Bruno!

Vc pode simular isso no DBGrid do Delphi. Faça assim: crie um campo calculado no dataset que alimenta a grid, do tipo Boolean. Então, no duplo clique de uma linha da DBGrid, vc muda o valor deste campo, para false ou true. E, no evento OnDrawColumn da grade vc pinta a imagem que quiser: uma bolinha, uma seta, etc.

A única consideração é que, ao trabalhar sobre os registros selecionados, vc terá que verificar quais campos estão com o valor true.

[]´s


GOSTEI 0
Bruno Belchior

Bruno Belchior

03/10/2005

Michael é uma grande idéia... na verdade não trabalho com o DBGrid default do delphi... tenho meu DBGrid herdando dele que já implementa o tipo booleano com CheckListBox... é como o Cantú disse um vez no livro dele sobre uma dessas idéias simples...[quote:5ec2a725e3=´Cantu, Dominando o Delphi 7´]É lógico, desde que você pense nisso antes... :lol:[/quote:5ec2a725e3]


GOSTEI 0
Yallebr

Yallebr

03/10/2005

Michael,

Mas com campo calculado isso não funcionaria, pois a cada vez q mudar a linha o campo calculado perde os valores e recalcula, ai não será possível fazer isso com campo calculado. Ou estou errado, vc já implementou esse sua ideia?

obrigado

Yalle


GOSTEI 0
Michael

Michael

03/10/2005

Olá!

Com um campo calculado não, mas com [b:1878494d2d]InternalCalc[/b:1878494d2d] sim. ;-)

[]´s


GOSTEI 0
Firekiller

Firekiller

03/10/2005

Cara, pra por os desenhos, pra ficar com uma aparência melhor, adicione o desenho que você quer em um ImageList, e no evento OnDrawColumnCell coloque:

ImageList1.Draw( DBGrdi1.Canvas, 0, Rect.Top, 0 ), que seria

ImageList.Draw( Canvas, Coluna, Linha, IndiceImagem).

Apenas uma dicazinha.... defina as propriedades height e width da grid como 11 antes de adicionar as imagens na lista.

Espero que te ajude.


GOSTEI 0
Diogoalles

Diogoalles

03/10/2005

olá Michael

a respeito desse internalCalc, eu poderia utilizar ele na seguinte situação?
ou como se utiliza?

[i:cb0fdba6fa]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. [/i:cb0fdba6fa]


[url]http://forum.clubedelphi.net/viewtopic.php?p=225684#225684[/url]

obrigado


GOSTEI 0
Firekiller

Firekiller

03/10/2005

Colega, o campo do tipo InternalCalc, se não me engano só está disponível nos ClientDataSets... e no caso do exemplo que você citou, ficaria meio complicado funcionar, porque um campo do tipo Calculated só é alterado no evento OnCalcFields. Para você fazer funcionar, você teria que ter tipo um vetor onde a quantidade de elementos fosse igual a quantidade de linhas da dbgrid, então, a cada clic na coluna especificada, o valor do elemento do vetor respectivo a essa linha é alterado, e, por exemplo se for um vetor de inteiros, você poderia colocar mais ou menos assim no evento OnCalcFields (meio que aproveitando seu código):

//Supondo que o campo calculado que vc criou se chame Check
Table1Check.Value := ( vetor[ linhaCorrespondente ] = 1);

Onde, se o valor for 1, o campo será setado como verdadeiro, e se for diferente disso, o campo será falso. Então a idéia seria, no click do mouse, o valor de vetor[ linhaCorrespondente ] seria alterado, e não diretamente o valor do campo.


GOSTEI 0
POSTAR