Verificar se o foco estar no DBGrid
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,
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
Curtidas 0
Respostas
Léo Serrão
03/07/2012
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;GOSTEI 0
William
03/07/2012
Colega use a propriedade DBGrid.SelectedRows para verificar se existe alguma linha selecionada.
GOSTEI 0
William
03/07/2012
Ops errei o correto é -> DBGrid.SelectedRows.Count
GOSTEI 0
Joel Rodrigues
03/07/2012
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.
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.
GOSTEI 0
Léo Serrão
03/07/2012
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.
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.
GOSTEI 0
Léo Serrão
03/07/2012
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.
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
GOSTEI 0
William
03/07/2012
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
Dependendo do caso verifique se o formulário está instânciado:
if not Assigned(<Nome_Form>) then
GOSTEI 0
Léo Serrão
03/07/2012
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
Dependendo do caso verifique se o formulário está instânciado:
if not Assigned(<Nome_Form>) then
No formulário
GOSTEI 0
Léo Serrão
03/07/2012
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
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
GOSTEI 0
William
03/07/2012
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.
GOSTEI 0
William
03/07/2012
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.
GOSTEI 0
Léo Serrão
03/07/2012
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.
GOSTEI 0
William
03/07/2012
Então Léo, fica o Object Inpector: Options > dgMultiSelect, posso estar enganado mas acho que na versão 6 já existia essa proprieadade.
GOSTEI 0
Léo Serrão
03/07/2012
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.
GOSTEI 0
William
03/07/2012
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;
GOSTEI 0
Léo Serrão
03/07/2012
Encontrei uma solução para contorna o problema:
Coloquei os edits do formulário em um GroupBox e a DBGrid em outro.
Criei uma variável chamada GroupBxFocus:
private
{ Private declarations }
GroupBxFocus : TObject;
No evento OnEnter de cada GroupBox coloquei o seguinte:
GroupBxFocus := Sender;
Usei o mesmo código postado aqui inicialmente, alterando apenas a linha:
If DBGrid1.Focused then
Por :
if GroupBxFocus = GroupBox2 then
E tudo funcionou que foi uma maravilha. Segue o código corrigido que foi incluído no BeforePost da query:
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 GroupBxFocus = GroupBox2 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;
Muito obrigado a todos que ajudaram
Teoricamente o código postado aqui inicialmente estava certo, mas, por algum motivo não estava funcionando.
Grato,
Coloquei os edits do formulário em um GroupBox e a DBGrid em outro.
Criei uma variável chamada GroupBxFocus:
private
{ Private declarations }
GroupBxFocus : TObject;
No evento OnEnter de cada GroupBox coloquei o seguinte:
GroupBxFocus := Sender;
Usei o mesmo código postado aqui inicialmente, alterando apenas a linha:
If DBGrid1.Focused then
Por :
if GroupBxFocus = GroupBox2 then
E tudo funcionou que foi uma maravilha. Segue o código corrigido que foi incluído no BeforePost da query:
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 GroupBxFocus = GroupBox2 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;
Muito obrigado a todos que ajudaram
Teoricamente o código postado aqui inicialmente estava certo, mas, por algum motivo não estava funcionando.
Grato,
GOSTEI 0
Joel Rodrigues
03/07/2012
Pois é, cara, o código estava certo, tanto que foi feita uma adaptação tecnológica, vulga gambiarra. Enfim, funcionou.
GOSTEI 0