Selecionar linhas CXGRID somente com com Control

16/03/2018

0

Bom dia,
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

Joao Santos

Responder

Post mais votado

16/03/2018

João Santos, tudo bom!
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

Luiz Vichiatto
Responder

Mais Posts

16/03/2018

Joao Santos

Luiz tudo bem,
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.
Responder

16/03/2018

Luiz Vichiatto

Você tem que utilizar o Bookmark do componente dataset
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;
Responder

16/03/2018

Joao Santos

Luiz,
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.
Responder

26/08/2020

Mauricio Zatt

Bom dia,
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.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar