Selecionar linhas CXGRID somente com com Control

Delphi

16/03/2018

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

Curtidas 0

Melhor post

Luiz Vichiatto

Luiz Vichiatto

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.
GOSTEI 1

Mais Respostas

Joao Santos

Joao Santos

16/03/2018

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.
GOSTEI 1
Luiz Vichiatto

Luiz Vichiatto

16/03/2018

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;
GOSTEI 1
Joao Santos

Joao Santos

16/03/2018

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.
GOSTEI 0
Mauricio Zatt

Mauricio Zatt

16/03/2018

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.
GOSTEI 0
POSTAR