Autor
Mensagem
Informações sobre o chamado:
Criado em: 3/9/2010 8:59:22 AM
Status deste chamado: Concluído (mensagens novas após conclusão)
Última ação ref. este chamado: Chamado resp. pelo usuario
Ver histórico do chamado
Criado em: 3/9/2010 8:59:22 AM
Status deste chamado: Concluído (mensagens novas após conclusão)
Última ação ref. este chamado: Chamado resp. pelo usuario
Ver histórico do chamado
#ID: 385592
Postado em: 3/9/2010 8:59:22 AM
De fato um componente bem interessante e util, mas sobre o componente eu queria fazer 2 situações para o mesmo,a primeira é clicar com botão esquerdo do mouse e chama um formulário para aquele determinado registro clicado e a segunda é clicar com o botão direito em um registro e abrir um popupmenu e modifica-lo,no primeiro caso, o componente funciona, ao clicar ele aponta para o registro desejado, mas já no segundo caso, ele só pega o primeiro registro ou algum outro que eu tenha clicado antes com o botão esquerdo do mouse, resumindo, como faço para acessar aquele registro do DBCtrlGrid usando o botão direito do mouse?
Mas no caso eu ja realizei teste com o DBGrid e ao clicar com o botao direito em outro registro o foco vai para este registro desejado, sem ter clicado com o botão esquerdo neste registro, com o DBCtrlGrid tentei a mesma situação e não deu certo, quero saber se falta algo a configurar ou se tem como fazer o foco ir para aquele registro via código mesmo.
Uso ele para controle de quartos para um sistema de motel, de acordo com o número de registros no banco, porque é para 2 estabelecimentos com números de quartos diferentes, usando o mesmo sistema mas com banco de dados independentes. A idéia seria clicar com o botão esquerdo e abrir um formulário para cadastrar o cliente naquele quarto, no DBCtrlGrid já coloquei ele fazendo controle de quarto, Disponível,Ocupado ou Manutenção, mas para colocar em manutenção(Limpeza ou desativado) eu queria abrir uma PopupMenu com a opção de colocar em manutenção o quarto clicado com o botão direito. Não queria ter que abrir um outro formulário para o usuário escolher qual quarto vai por em manutenção. Exigência do cliente foi simplificar ao máximo. ERILEY você tem alguma outra sugestão de como proceder com esta idéia?
Deu um pouco de trabalho, mas acho que tenho a solução para você.
Eu coloquei um panel dentro da primeira linha do dbctrlgrid, limpei o caption e coloquei o Align Alclient para este panel.
Depois coloquei os componentes dentro do panel.
Depois liguei o popupmenu ao panel.
Depois no evento onmousemove do panel, coloquei o seguinte código:
var
Pt : TPoint;
begin
Application.ProcessMessages;
{Obtém o point no centro do Button1}
Pt.x := panel1.Left + (panel1.Width div 2);
Pt.y := panel1.Top + (panel1.Height div 2);
{Converte Pt para as coordenadas da tela }
Pt := ClientToScreen(Pt);
Pt.x := Round(Pt.x * (65535 / Screen.Width));
Pt.y := Round(Pt.y * (65535 / Screen.Height));
{Simula o pressionamento do botão esquerdo do mouse}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);
{ Simula soltando o botão esquerdo do mouse }
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
end;
Pt : TPoint;
begin
Application.ProcessMessages;
{Obtém o point no centro do Button1}
Pt.x := panel1.Left + (panel1.Width div 2);
Pt.y := panel1.Top + (panel1.Height div 2);
{Converte Pt para as coordenadas da tela }
Pt := ClientToScreen(Pt);
Pt.x := Round(Pt.x * (65535 / Screen.Width));
Pt.y := Round(Pt.y * (65535 / Screen.Height));
{Simula o pressionamento do botão esquerdo do mouse}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);
{ Simula soltando o botão esquerdo do mouse }
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
end;
Mas atenção só funcionara se estiver em cima do panel, aqui deu certo tente ai.
Você só terá de explicar para o seu cliente que ele deve clicar na parte cinza do componente.
Esta quase la, o click com o botão direito funciono, mas a outra parte de clicar com o botão esquerdo esta sendo ativado junto com ele por simular o pressionamento, que no caso eu utilizo ele para abrir um formulário para inserir o cliente no quarto,como poderia ser feito o controle diferenciando? tem como? o duplo click também é acionado, tentei aqui e não consegui.
Bom então você não vai poder utilizar um evento de mouse e sim de teclado:
Apenas vai ter de orientar seu cliente a teclar enter no dbctrlgrid, no evento onkeypress do dbctrlgrid ou do panel, digite:
if key = #13 then
ShowMessage('Teste');
ShowMessage('Teste');
Altere a propriedade KeyPreview para True do form
Obs.: consegui fazer funcionar tudo sem o panel, direto no dctrlgrid:
procedure TFrmSeuForm.DBCtrlGrid1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
Pt : TPoint;
begin
Application.ProcessMessages;
{Obtém o point no centro do Button1}
Pt.x := DBCtrlGrid1.Left + (DBCtrlGrid1.Width div 2);
Pt.y := DBCtrlGrid1.Top + (DBCtrlGrid1.Height div 2);
{Converte Pt para as coordenadas da tela }
Pt := ClientToScreen(Pt);
Pt.x := Round(Pt.x * (65535 / Screen.Width));
Pt.y := Round(Pt.y * (65535 / Screen.Height));
{Simula o pressionamento do botão esquerdo do mouse}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);
{ Simula soltando o botão esquerdo do mouse }
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
end;
Shift: TShiftState; X, Y: Integer);
var
Pt : TPoint;
begin
Application.ProcessMessages;
{Obtém o point no centro do Button1}
Pt.x := DBCtrlGrid1.Left + (DBCtrlGrid1.Width div 2);
Pt.y := DBCtrlGrid1.Top + (DBCtrlGrid1.Height div 2);
{Converte Pt para as coordenadas da tela }
Pt := ClientToScreen(Pt);
Pt.x := Round(Pt.x * (65535 / Screen.Width));
Pt.y := Round(Pt.y * (65535 / Screen.Height));
{Simula o pressionamento do botão esquerdo do mouse}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);
{ Simula soltando o botão esquerdo do mouse }
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
end;
procedure TFrmSeuForm.DBCtrlGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
ShowMessage('Teste');
end;
begin
if key = #13 then
ShowMessage('Teste');
end;







