GARANTIR DESCONTO

Fórum Verificar se o foco estar no DBGrid #419242

03/07/2012

0

Olá pessoal! Estou tentando fazer uma verificação usando IF em um DBGrid para vê se o foco estar nele se estiver faz um procedimento se não faz outro.

Já tentei assim: if DBGrid1.Focused = True then
e assim: if DBGrid1.Focused then
mas não deu certo, pois mesmo que o grid esteja selecionado ele executa o código else como se não estivesse selecionado.

Se abaixo o código completo para análise, se alguém puder identificar onde fica o erro e nos dizer, eu agradeço.

if trim(Qry_TipoInsumoCodTpInsmADM.Text)<> then
begin
Qry_consulta.Close;
Qry_consulta.SQL.Clear;
Qry_consulta.SQL.text:= select CodTpInsm from asp_tipoinsumo_tb where CodTpInsmADM= +Qry_TipoInsumoCodTpInsmADM.Text+;
Qry_consulta.Open;
If Qry_consulta.RecordCount > 0 then //Verifica se a query retornou algum registro
Begin
MessageDlg(Tipo de Insumo já existente Cadastro de Tipo de Insumo., mtWarning, [mbOK], 0);
if DBGrid1.Focused then //Se a DBgrig estiver com o foco
begin
DBGrid1.SelectedField := Qry_TipoInsumoCodTpInsmADM; //Seleciona a coluna Tipo Insumo
DBGrid1.SetFocus; //Seta o foco no DBgrid
abort;
exit;
end
else //Se a DBgrig não estiver com o foco é porque está o formulário
begin
frmTipoInsumo.DBEdit1.SetFocus; //Seta o foco na Edit do formulário
abort;
exit;
end;
end;
end;

Grato pela atenção,
Léo Serrão

Léo Serrão

Responder

Posts

03/07/2012

Léo Serrão

Desculpe as aspas sumiram. Agora sim:
if trim(Qry_TipoInsumoCodTpInsmADM.Text)<> then
  begin
        Qry_consulta.Close;
        Qry_consulta.SQL.Clear;
        Qry_consulta.SQL.text:= select CodTpInsm from asp_tipoinsumo_tb where CodTpInsmADM=+Qry_TipoInsumoCodTpInsmADM.Text+;
        Qry_consulta.Open;
        If Qry_consulta.RecordCount > 0 then  //Verifica se a query retornou algum registro
            Begin
                MessageDlg(Tipo de Insumo já existente Cadastro de Tipo de Insumo., mtWarning, [mbOK], 0);
                if DBGrid1.Focused = True then //Se a DBgrig estiver com o foco
                   begin
                        DBGrid1.SelectedField := Qry_TipoInsumoCodTpInsmADM; //Seleciona a coluna Tipo Insumo
                        DBGrid1.SetFocus; //Seta o foco no DBgrid
                        abort;
                        exit;
                   end
                   else //Se a DBgrig não estiver com o foco é porque está o formulário
                   begin
                        frmTipoInsumo.DBEdit1.SetFocus;
                        abort;
                        exit;
                 end;
        end;
  end;
Responder

Gostei + 0

03/07/2012

William

Colega use a propriedade DBGrid.SelectedRows para verificar se existe alguma linha selecionada.
Responder

Gostei + 0

03/07/2012

William

Ops errei o correto é -> DBGrid.SelectedRows.Count
Responder

Gostei + 0

03/07/2012

Joel Rodrigues

Rapaz, onde está esse código? Se estiver no onClick de um botão você terá o seguinte problema: ao clicar no botão, o foco é passado para ele, logo, o DBGrdid não estará realmente selecionado.
Uma ideia para o seu caso seria, no evento onExit do grid, você definir uma variável global como true e usá-la para fazer a verificação que atualmente é feita com DBGrid.Focused.

Não sei se fui claro, mas espero ter ajudado.

Qualquer coisa, estamos aqui.

Abraço.
Responder

Gostei + 0

03/07/2012

Léo Serrão

Testei a sua dica: if DBGrid1.SelectedRows.Count <> 0 then

Mas ocorreu o mesmo problema. Mesmo com o grid selecionado o programa executou o código que está no else e setou o foco no formulário e não no DBgrig.

Mas valeu assim mesmo, a dica é boa. Mas o que ocorre é que em algum momento o foco parece está saindo do grig.
Responder

Gostei + 0

03/07/2012

Léo Serrão

Rapaz, onde está esse código? Se estiver no onClick de um botão você terá o seguinte problema: ao clicar no botão, o foco é passado para ele, logo, o DBGrdid não estará realmente selecionado.
Uma ideia para o seu caso seria, no evento onExit do grid, você definir uma variável global como true e usá-la para fazer a verificação que atualmente é feita com DBGrid.Focused.

Não sei se fui claro, mas espero ter ajudado.

Qualquer coisa, estamos aqui.

Abraço.


O código está no BeforePost da Query
Responder

Gostei + 0

03/07/2012

William

Colega essa Query está no DataModule ou no Formulário?

Dependendo do caso verifique se o formulário está instânciado:
if not Assigned(<Nome_Form>) then
Responder

Gostei + 0

03/07/2012

Léo Serrão

Colega essa Query está no DataModule ou no Formulário?

Dependendo do caso verifique se o formulário está instânciado:
if not Assigned(<Nome_Form>) then



No formulário
Responder

Gostei + 0

03/07/2012

Léo Serrão

Colega essa Query está no DataModule ou no Formulário?

Dependendo do caso verifique se o formulário está instânciado:
if not Assigned(<Nome_Form>) then


Está funcionado normalmente o código que postei exceto o teste: if DBGrid1.Focused then
Responder

Gostei + 0

03/07/2012

William

Cara em alguma parte desse código vc está perdendo o focu desse grid, vc não tem nenhum outro evento sendo disparado em paralelo. Faça um teste com um botão simples só com um ShowMessage() para verificar o focu do DBGrid.
Responder

Gostei + 0

03/07/2012

William

A idéia do SelectedRows.Count funciona mas esqueci de um detalhe, altere a propriedade do DBGrid dgMultiSelect para true assim ele conta quantas linhas estão selecionadas.
Responder

Gostei + 0

03/07/2012

Léo Serrão

A idéia do SelectedRows.Count funciona mas esqueci de um detalhe, altere a propriedade do DBGrid dgMultiSelect para true assim ele conta quantas linhas estão selecionadas.


Aqui na empresa infelizmente trabalhamos ainda com a versão Delphi 6 Enterprise. Não encontrei a propriedade que você citou no DBgrid.
Responder

Gostei + 0

03/07/2012

William

Então Léo, fica o Object Inpector: Options > dgMultiSelect, posso estar enganado mas acho que na versão 6 já existia essa proprieadade.
Responder

Gostei + 0

03/07/2012

Léo Serrão

Então Léo, fica o Object Inpector: Options > dgMultiSelect, posso estar enganado mas acho que na versão 6 já existia essa proprieadade.


Encontrei a propriedade, alterei seu valor para True. Executei e não deu certo a contagem sempre retorna zero mesmo o DBGrid estando selecionado no momento da edição.

Para fazer um teste coloquei o showmessage no evento OnExit do DBGrid e executei linha por linha:

procedure TfrmTipoInsumo.DBGrid1Exit(Sender: TObject);
begin
ShowMessage(Saiu do Grid);
end;

Ele só exibe a mensagem Saiu do Grid depois de na clausula else setar frmTipoInsumo.DBEdit2.SetFocus; .
Uma outra curiosidade que observei foi que ao colocar o código no evento do DBgrid só pra testar:

procedure TfrmTipoInsumo.DBGrid1ColExit(Sender: TObject);
begin
{

// Validação do Tipo Insumo no Grid
if DBGrid1.Fields[0].AsString <> then // Se ao sair do campo Tipo Insumo do Grid o mesmo não estiver vazio
begin
Qry_consulta.Close;
Qry_consulta.SQL.Clear;
Qry_consulta.SQL.text:= select CodTpInsm from asp_tipoinsumo_tb where CodTpInsmADM =+Qry_TipoInsumoCodTpInsmADM.Text+;
Qry_consulta.Open;
If Qry_consulta.RecordCount <> 0 then //Verifica se a query retornou algum registro
Begin
MessageDlg(Tipo de Insumo já existente Cadastro de Tipo de Insumo., mtWarning, [mbOK], 0);
if DBGrid1.Focused then //Se a DBgrig estiver com o foco
begin
DBGrid1.SelectedField := Qry_TipoInsumoCodTpInsmADM; //Seleciona a coluna Tipo Insumo
DBGrid1.SetFocus; //Seta o foco no DBgrid
abort;
exit;
end
else //Se a DBgrig não estiver com o foco é porque está o formulário
begin
frmTipoInsumo.DBEdit1.SetFocus;
abort;
exit;
end;
end;
end;

A falha só ocorre a query estiver em estado de inserção ou edição. Ao mudar de coluna sem está inserindo ou editando registro o teste if DBGrid1.Focused then funciona retornando True e executa a instrução que desejava.

Responder

Gostei + 0

03/07/2012

William

Vamos apelar então, acredito que problema seja nessa mudança de estado do DataSet, parece que do modo convencional não está funcionando.

//Verificar o estado do DataSet
if (Qry.DataSet.State in [dsinsert, dsedit])then
begin
  if not Assgned(frmTipoInsumo) then
  begin
     //O form não está carregado, significa que o focu está no DBGrid.
  end
  else
  begin
     //Senão, se o formulário estiver carregado na memória então passa o focu para o DBEdit1.
  end;
end;
Responder

Gostei + 0

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

Aceitar