Simular a tecla CTRL ao clicar o DbGrid

Delphi

23/07/2005

[b:a44d72d4b2]Tenho um dbgrid com a opção DgMultSelect em True[/b:a44d72d4b2]

Sabemos que o usuário , para selecionar dois os mais registros tem que segurar a tecla CTRL.


:idea: :idea: :idea: :idea: :idea:
Minha idéia é fazer com que o próprio click do mouse sobre a grid , marque e desmarque os registros .. sem precisar que o CTRL seje simultaneamente Pressionado
.


[b:a44d72d4b2]Pensei em simular o pressionamento da tecla CTRL toda vez que o usuário clicar na Grade[/b:a44d72d4b2]

:arrow: :arrow: :arrow:
Então escrevi o código abaixo:

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
keybd_event(VK_CONTROL,0,0,0); // Ctrl Release
end;


:cry: :cry: :cry: :cry: :cry: :cry:
O Problema , é que funciona bem , mas ao fechar o aplicativo, o Computador fica Doido... Parece que o CTRL continua ativado , mesmo após a finalização do executável... [b:a44d72d4b2]Isto é incrível ... Teste para conferir[/b:a44d72d4b2]

[b:a44d72d4b2]Quem quiser mais detalhes pode fazer o teste e muito interresante (Não esqueça das opções DgMultSelect em True e dgAlwaysShowSelection := true e dgRowSelect, Também em True[/b:a44d72d4b2]

Pois bem , definitivamente , não estou conseguindo simular o pressionamento da tecla CTRL quando se clica sobre a GRID
:cry: :cry: :cry: :cry:


:lol: :lol: :lol: :lol:
[b:a44d72d4b2]Seguindo esta linha de raciocíneo , alguem tem alguma observação a fazer sobre o que foi exposto[/b:a44d72d4b2]

:lol: :lol: :lol: :lol:
[b:a44d72d4b2]Ou ainda , alguem tem uma outra idéia ou ja fez algo parecido , quando se trabalhou com vários Registros seleconados simultaneamente na Grid[/b:a44d72d4b2]

P:S Minha grid esta com estas opçoes [dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit, dgMultiSelect] Meu sistema operacional e o XP Profissional, caso alguem teste o código que passei anteriormente


Estou ansioso por resposta , pois ja faz um tempo que estou com este problema

Obrigado.....


Marco Salles

Marco Salles

Curtidas 0

Respostas

Carlosrm

Carlosrm

23/07/2005

Marco Salles,

Se a questão é exclusivamente fazer multiseleção na grid, sem usar o CTRL, eu resolvi meio na marretada assim, usando o W98, D6:

No evento OnMouseUp da grid,

procedure ...MouseUp...
begin
   if (button = mbRight) then
      if (dbgrid1.fields[0].AsString = ´  ´ ) then
         dbgrid1.fields[0].AsString := ´X´
      else
         dbgrid1.fields[0].AsString := ´ ´;
end;


O primeiro campo que aparece na grid, no meu caso, é o campo que vai defnir se está ou não selecionado. Depois é só filtrar, usar sql, manipular o relatório... antes de usar, imprimir.
Eu preferi usar o botão direito para selecionar (ou não) um registro, pois assim o usuário pode continuar usando o botão esquerdo sem marcar/desmarcar as seleções. E ignorei solenemente a propriedade Multiselect. Num volume de 1000 registros não teve problemas. Não digo nada para outras situações.

carlosrm :wink:


GOSTEI 0
Carlosrm

Carlosrm

23/07/2005

Marco Salles,

só complementando:

Se eu me lembro bem, num dos seus sistemas os usuários terão pouco espaço para usar o mouse.
Nesse caso, o uso de qualquer tecla de função resolveria facilmente, ao invés de usar o botão direito do mouse.
|sso, supondo que minha sugestão seja útil...he he he ...

carlosrm :wink:


GOSTEI 0
Marco Salles

Marco Salles

23/07/2005

:P :P :P :P :P
[b:f7f8251d6c]carlosrm , muitissimo obrigado pela sua sugestão[/b:f7f8251d6c]... e veja se foi isto que eu entendi::::

´Eu não sei se entendi direiro a sua colocação , mas acho que voce criou um campo , onde voce marca e desmarca este campo a fim de que apos uma consulta sql , somente esse registros selecionados seriam parte integrante de um relatorio´


se foi isto que eu entendi , é uma estrategia a ser considerada , apesar deu me sentir fragilizado , não conseguindo simular o pressionamento da tecla CTRL sobre o GRID..... :cry: :cry: :cry: :cry:

Alem de não conseguir , obtive um comportamento esquesito, como eu coloquei na mensagem anterior:::

Então escrevi o código abaixo:
Código: 
procedure TForm1.DBGrid1CellClick(Column: TColumn); 
begin 
keybd_event(VK_CONTROL,0,0,0); // Ctrl Release 
end; 
[b:f7f8251d6c]O Problema , é que funciona bem , mas ao fechar o aplicativo, o Computador fica Doido... [/b:f7f8251d6c]Parece que o CTRL continua ativado , mesmo após a finalização do executável... Isto é incrível ... Teste para conferir



sobre a simulação de teclas , isto pode ser verificado em:

http://www.codeproject.com/system/keyboard.asp

Se eu me lembro bem, num dos seus sistemas os usuários terão pouco espaço para usar o mouse. Nesse caso, o uso de qualquer tecla de função resolveria facilmente, ao invés de usar o botão direito do mouse. |sso, supondo que minha sugestão seja útil...he he he ...


realmente , voce esta com uma memoria vertigiosa , mas este sistema do presente tópico , faz parte de um outro programa... [b:f7f8251d6c]E esta dúvida , esta me deixando impaciente [/b:f7f8251d6c], :cry: :cry: :cry:


GOSTEI 0
Marco Salles

Marco Salles

23/07/2005

agora o problema é outro

consegui marcar usando o click do teclado

procedure TForm1.Query1BeforeScroll(DataSet: TDataSet);
begin
dBgRID1.SelectedRows.CurrentRowSelected:=true;
keybd_event(VK_CONTROL,0,0 , 0);// Ctrl
end;


procedure TForm1.Query1AfterScroll(DataSet: TDataSet);
begin
DbGrid1.SelectedRows.CurrentRowSelected:=true;
keybd_event(VK_CONTROL, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;


O Problema agora , é que apos marcado , não consigo desmarcar :cry: :cry: :cry: :cry: :cry:

a propriedade BookMarkList Infelismente parece ser ReadOnly , alem disso eu não conheço nen um método de Add e elinação dos Regsitros marcados :cry: :cry: :cry: :cry: :cry:

Alguem tem uma idéia como desmarcar os registros marcados...

por favor....


GOSTEI 0
Bruno Belchior

Bruno Belchior

23/07/2005

ela realmente é [b:f02b812a50]ReadOnly[/b:f02b812a50] mas vc pode fazer o seguinte... usar a propriedade booleana [b:f02b812a50]CurrentRowSelected[/b:f02b812a50] para selecionar a parcela... um exemplo para selecionar todos os registros...
DataSet.First;
while not DataSet.Eof do
begin
  DbGrid1.SelectedRows.CurrentRowSelected := True;
  DataSet.Next;
end;



GOSTEI 0
Marco Salles

Marco Salles

23/07/2005

ela realmente é ReadOnly mas vc pode fazer o seguinte... usar a propriedade booleana CurrentRowSelected para selecionar a parcela... um exemplo para selecionar todos os registros...Código:
DataSet.First; 
while not DataSet.Eof do 
begin 
  DbGrid1.SelectedRows.CurrentRowSelected := True; 
  DataSet.Next; 
end;


eu gostaria de selecionar item a item de acordo com o clik do mouse sobre o registro do Grid...Isto eu ja ate consegui como me expressei anteriormente.Inclusive uso a propriedade boolean CurentRowSelect

O Problema é desmarcar esses items..Assim o usuário clica para marcar e clica novamente para desmarcar ...e vice-versa..


GOSTEI 0
Isabelct

Isabelct

23/07/2005

[quote:8bc9716298=´Marco Salles´]O Problema é desmarcar esses items..Assim o usuário clica para marcar e clica novamente para desmarcar ...e vice-versa..[/quote:8bc9716298]

Tente assim:

DbGrid1.SelectedRows.CurrentRowSelected := not DbGrid1.SelectedRows.CurrentRowSelected;


Ou seja, a cada click no DBGrid, inverte o status de CurrentRowSelected.


GOSTEI 0
Marco Salles

Marco Salles

23/07/2005

-------------------------------------------------------------------------------- Marco Salles escreveu: O Problema é desmarcar esses items..Assim o usuário clica para marcar e clica novamente para desmarcar ...e vice-versa.. Tente assim: Código: DbGrid1.SelectedRows.CurrentRowSelected := not DbGrid1.SelectedRows.CurrentRowSelected;


Não sei aonde voce esta sugerindo colocar este código :?: :?: :?:

e qual evento :?: :?: :?:

Mas acho que ja tentei isto :cry: :cry: :cry:

procedure TForm1.Query1BeforeScroll(DataSet: TDataSet); 
begin 
dBgRID1.SelectedRows.CurrentRowSelected:=not dBgRID1.SelectedRows.CurrentRowSelected; 
keybd_event(VK_CONTROL,0,0 , 0);// Ctrl 
end; 



Código:
procedure TForm1.Query1AfterScroll(DataSet: TDataSet); 
begin 
DbGrid1.SelectedRows.CurrentRowSelected:=true; 
keybd_event(VK_CONTROL, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); 
end; 


[b:5d00d1b1bc]mas vou tentar novamente eu posto a seguir...[/b:5d00d1b1bc]


GOSTEI 0
Marco Salles

Marco Salles

23/07/2005

Tem uns cinco dias que eu to nessa :cry: :cry: :cry: :cry:

Resolvo de um lado , da erro de outro e assim vai :cry: :cry: :cry:

[b:e6cf7ef97d]Marcar e desmarcar , no cilk de um mouse aparentemente eu consegui...[/b:e6cf7ef97d]


Mas para isto , foi necessárioo, simular o Pressionamento da Tecla CTRL
quando se clica na grid atravez desta Instrução

procedure TForm1.Query1BeforeScroll(DataSet: TDataSet); 
begin 
dBgRID1.SelectedRows.CurrentRowSelected:=not dBgRID1.SelectedRows.CurrentRowSelected; 
//aqui simulo o pressionamento da Tecla CTRL
keybd_event(VK_CONTROL,0,0 , 0);// Ctrl 
end; 


[b:e6cf7ef97d]o problema é que este comando , fica ativado e mesmo após o encerramento do aplicativo , o Computador se comporta como se a tecla CTRL estivesse pressionado...[/b:e6cf7ef97d]

Pesquisei no forum e achei uma dica de Liberar a tecla CTRL e usei esta dica no codigo abaixo
procedure TForm1.Query1AfterScroll(DataSet: TDataSet); 
begin 
DbGrid1.SelectedRows.CurrentRowSelected:=true; 
//Libera a tecla CTRL.. Pelo menos é o que a dica fala
keybd_event(VK_CONTROL, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP
, 0);
end;

so que para minha infelicidade , este código de liberar o pressionamento da tecla CTRL , não acontece :cry: :cry: :cry: :cry:

Então eu apelo , para quem souber uma instrução , que simule o pressionamento da tecla CTRL e saiba também fazer o processo oposto
, isto é liberar esta tecla...

To ha cinco dias.... :cry: :cry: :cry: :cry:


GOSTEI 0
Michael Gurraro

Michael Gurraro

23/07/2005

Tem uns cinco dias que eu to nessa :cry: :cry: :cry: :cry:

Resolvo de um lado , da erro de outro e assim vai :cry: :cry: :cry:

Marcar e desmarcar , no cilk de um mouse aparentemente eu consegui...

Mas para isto , foi necessárioo, simular o Pressionamento da Tecla CTRL
quando se clica na grid atravez desta Instrução

procedure TForm1.Query1BeforeScroll(DataSet: TDataSet);
begin
dBgRID1.SelectedRows.CurrentRowSelected:=not dBgRID1.SelectedRows.CurrentRowSelected;
//aqui simulo o pressionamento da Tecla CTRL
keybd_event(VK_CONTROL,0,0 , 0);// Ctrl
end;

o problema é que este comando , fica ativado e mesmo após o encerramento do aplicativo , o Computador se comporta como se a tecla CTRL estivesse pressionado..

Pesquisei no forum e achei uma dica de Liberar a tecla CTRL e usei esta dica no codigo abaixo
procedure TForm1.Query1AfterScroll(DataSet: TDataSet);
begin
DbGrid1.SelectedRows.CurrentRowSelected:=true;
//Libera a tecla CTRL.. Pelo menos é o que a dica fala
keybd_event(VK_CONTROL, , KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;

so que para minha infelicidade , este código de liberar o pressionamento da tecla CTRL , não acontece :cry: :cry: :cry: :cry:

Então eu apelo , para quem souber uma instrução , que simule o pressionamento da tecla CTRL e saiba também fazer o processo oposto
, isto é liberar esta tecla...

To ha cinco dias.... :cry: :cry: :cry: :cry:


Boa tarde, já tentou passar o seguinte parametro:
keybd_event(VK_CONTROL, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
Aparentemente para limpar o " Ctrl " precisa passar o " $45 ".
Estou com o mesmo problema, pois quando disparo a função que simula a tecla clicada não para mais, mesmo saindo fora do GRID.
Esse evento citado está no FormClose para liberar o " Ctrl ".
GOSTEI 0
POSTAR