Selecionar linhas CXGRID somente com com Control
16/03/2018
0
Sou novo em programação e estou com um impasse, quero que os usuários selecione linhas na CXGRID usando somente o CONTROL do teclado, aparentemente não encontrei nenhum propriedade na CXGRID que faz isso. Por exemplo a TwwDBGrid (paleta IPControl) tem a propriedade msoShiftSelect que faz esse efeito.
Por acaso alguém sabe como posso fazer isso na CXGRID ??
Joao Santos
Post mais votado
16/03/2018
Então, para selecionar sempre há uma ação, então verifique no componente se há o keypress, assim você testa a tecla que foi pressionada quando o foco estiver no componente TwwDBGrid, se a tecla pressionada for o Control (verificar o código para a tecla) for acionada e o item não estiver selecionado então é você seleciona.
Todos os componentes que tem o grid tem este controle, ao menos o que eu já utilizei.
O conceito é este, como sugestão analise um pouco e faça testes.
Luiz Vichiatto
Mais Posts
16/03/2018
Joao Santos
A minha questão é o seguinte eu quero que a unica opção do usuário selecionar ou retirar a seleção uma linha no CXGRID é com o auxilio do control, eu até achei uma programação.
Criei essa função que me retorna true ou false para a tecla que estou passando como parâmetro
function TF_Doc_Cobranca.tbKeyIsDown(const Key: integer): boolean;
var teste : integer ;
begin
Result := GetKeyState(Key) and 128 > 0;
end;
No evento OnCanSelectRecord da minha CXGRID (view) eu coloquei a seguinte verificação
AAllow := tbKeyIsDown(VK_CONTROL) ;
ou seja, se esta clicando na linha e o control não esta pressionado, essa função vai retornar FALSE e essa propriedade AAllow não vai deixar o registro ficar selecionado, já, quando estiver com o control pressionado essa função retorna TRUE e ai sim ele deixa selecionar a linha.
Porém se depois sem mesmo estar com o control pressionado eu clicar em outra linha, além de não selecionar(isso é correto) ele apaga a seleção das linhas anteriores, e é isso que eu não quero. Preciso descobrir um evento ou propriedade que impede da CXGRID perde essa seleção quando clico em outra linha.
Espero ter conseguido explicar duvida.
16/03/2018
Luiz Vichiatto
Eu tenho essa situação que a cada duplo clique eu gravo em um TstringList, o código
marco no componente da Grid os itens selecionados
A stringlist fica ativa até o fim do processo
procedure TfrmMain.SelecionaRegistrosParaTransmissao; var bkmTemporario : TBookmark; i : Integer; bExisteRegistroATransmitir: boolean; begin //-- Aplica a seleção automática de todos os pedidos a enviar FPedidosMarcadosAtransmitir.Clear; bExisteRegistroATransmitir:= False; dsTransmissao.DataSet.DisableControls; bkmTemporario := dsTransmissao.DataSet.GetBookmark; try with dsTransmissao.DataSet do begin First; while not EOF do begin i := FPedidosMarcadosAtransmitir.IndexOf( FieldByName( 'PED' ).AsString ); if (FieldByName('VLR_1').AsCurrency >0) or (FieldByName('VLR_3').AsCurrency >0) then begin if (i < 0) and not (FieldByName( 'STATUS' ).AsString[1] in ['E']) then//(FieldByName( 'STATUS' ).AsString[1] in ['D', 'E']) then FPedidosMarcadosAtransmitir.Append( FieldByName( 'PED' ).AsString ) else bExisteRegistroATransmitir := bExisteRegistroATransmitir or (FieldByName( 'STATUS' ).AsString[1] in ['D', 'S']); end; Next; end; end; finally dsTransmissao.DataSet.GotoBookmark(bkmTemporario); dsTransmissao.DataSet.EnableControls; end; end;
16/03/2018
Joao Santos
Muito obrigado pelo retorno, para a minha situação eu consegui achar uma possível solução.
Como tinha dito no inicio criei uma função que testa se a tecla desejada esta pressionada ou não
function TF_Doc_Cobranca.tbKeyIsDown(const Key: integer): boolean;
var teste : integer ;
begin
Result := GetKeyState(Key) and 128 > 0;
end;
então testei o retorno dessa função no evento OnCanFocusRecord da cxgrid, passando para a propriedade AAllowo seu retorno, esse evento é responsável por determinar se foca ou não linha da grid AAllow = False não foca e AAllow = True foca. Então fiz a seguinte chamada
procedure TF_Doc_Cobranca.view_Doc_CobrancaCanFocusRecord(
Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
var AAllow: Boolean);
begin
inherited;
AAllow := tbKeyIsDown(VK_CONTROL) ;
end;
Dessa forma tive o efeito desejado, onde ele somente vai conseguir clicar na linha se apertar o control.
Muito obrigado pelo auxilio
Como sou novo não sei se devo e como colocar esse forum como enviado.
26/08/2020
Mauricio Zatt
Sou novo em programação e estou com um impasse, quero que os usuários selecione linhas na CXGRID usando somente o CONTROL do teclado, aparentemente não encontrei nenhum propriedade na CXGRID que faz isso. Por exemplo a TwwDBGrid (paleta IPControl) tem a propriedade msoShiftSelect que faz esse efeito.
Por acaso alguém sabe como posso fazer isso na CXGRID ??
No CXGrid existe uma propriedade do grupo OptionsView chamada MultiSelect, se marcar essa opção vc já ira conseguir selecionar os registros utilizando o CTRL + Cliclk do mouse.
Clique aqui para fazer login e interagir na Comunidade :)