DbEdit.SetFocus = Access Violation

07/11/2005

0

Coloquei a função dbEdit2.SETFOCUS, no ONCHANGE da DBEDIT1.
Mas ele gera um access violation.
Não estou conseguinmdo saber o por que.

Agradeço a Ajuda.
Obrigado;


Buck

Buck

Responder

Posts

08/11/2005

Emerson Nascimento

faça algo assim:

OnEnterDoDBEdit1
Application.CreateForm(TForm2,Form2);
Form2.ShowModal;
DBEdit1.Field.Value := Form2.ItemClicado;
FreeAndNil(Form2);
DBEdit2.SetFocus;

e não use mais o OnChange


Responder

08/11/2005

Martins

faça algo assim: OnEnterDoDBEdit1 Application.CreateForm(TForm2,Form2); Form2.ShowModal; DBEdit1.Field.Value := Form2.ItemClicado; FreeAndNil(Form2); DBEdit2.SetFocus; e não use mais o OnChange


Mais ou menos assim [b:492c90fff5]emerson.en[/b:492c90fff5]

  Application.CreateForm(TForm2, Form2);
  Form2.ShowModal;
  DBEdit1.Text:= Form2.DBGrid1.Fields[0].AsString;
  DBEdit2.Text:= Form2.DBGrid1.Fields[1].AsString;
  FreeAndNil(Form2);
  DBEdit2.SetFocus;



Responder

10/11/2005

Buck

Pessoal, tentei o FREEANDNIL, mas gerou a mesma excessão...


Responder

10/11/2005

Cabelo

Pq vc não usa o evento OnShow do form1 para dar o setfocus no dbedit2????????


assim funciona..


Responder

10/11/2005

Martins

Pessoal, tentei o FREEANDNIL, mas gerou a mesma excessão...


Cara isso aí tá complicado, dá pra explicar com mais detalhes o q vc tá fazendo, pq nós estamos cegos, e aí fica complicado, já tentamos n soluções e nada. Queremos ajudar mais precisamos de detalhes, de código.


Responder

10/11/2005

Buck

FORM1 - FrmVenda_Atac
OnEnter - DbEdit1

if DBComboBox1.Text = ´´ then
begin
messageDlg(´Selecione o Tipo da Venda´, mtError, [mbOk],0);
DBComboBox1.SetFocus;
end
else
if (dmVendas.tblVenda_Atac.State = dsEdit) or (dmVendas.tblVenda_Atac.State = dsInsert) then
dmVendas.tblVenda_Atac.Post;

frmCons_Produto.showmodal;

FORM2 - frmCons_Produto

if frmVenda_Atac.Showing = true then
begin
if (dmVendas.tblVenda_Prod_Atac.State = dsInsert) or (dmVendas.tblVenda_Prod_Atac.State = dsEdit) then
begin
close;
dmVendas.tblVenda_Prod_AtacProduto.Value := dmVendas.tblProdutoNome.Value;

end
else
begin
close;
dmVendas.tblVenda_Prod_Atac.Insert;
dmVendas.tblVenda_Prod_AtacProduto.Value := dmVendas.tblProdutoNome.Value;
frmVenda_Atac.dbEdit2.setFotcus;

end
end
else
frmCad_Produto.showmodal;


Responder

10/11/2005

Emerson Nascimento

FORM1 - FrmVenda_Atac 
OnEnter - DbEdit1 

  if DBComboBox1.Text = ´´ then 
  begin 
    messageDlg(´Selecione o Tipo da Venda´, mtError, [mbOk],0); 
    DBComboBox1.SetFocus; 
  end 
  else 
  if (dmVendas.tblVenda_Atac.State = dsEdit) or (dmVendas.tblVenda_Atac.State = dsInsert) then 
    dmVendas.tblVenda_Atac.Post; 

  frmCons_Produto.showmodal; 
  FORM2 - frmCons_Produto 

  if frmVenda_Atac.Showing = true then 
  begin 
    if (dmVendas.tblVenda_Prod_Atac.State = dsInsert) or (dmVendas.tblVenda_Prod_Atac.State = dsEdit) then 
    begin 
      close; 
      dmVendas.tblVenda_Prod_AtacProduto.Value := dmVendas.tblProdutoNome.Value; 
    end 
    else 
    begin 
      close; 
      dmVendas.tblVenda_Prod_Atac.Insert; 
      dmVendas.tblVenda_Prod_AtacProduto.Value := dmVendas.tblProdutoNome.Value; 
      frmVenda_Atac.dbEdit2.setFotcus; 
    end 
  end 
  else 
    frmCad_Produto.showmodal;


creio que o erro esteja nos CLOSE mal utilizados (ou utilizados em momento impróprio)

  if frmVenda_Atac.Showing = true then 
  begin 
    if (dmVendas.tblVenda_Prod_Atac.State = dsInsert) or (dmVendas.tblVenda_Prod_Atac.State = dsEdit) then 
    begin 
      close; /**** ESSE CLOSE ESTÁ FECHANDO O frmVenda_Atac ****/
      dmVendas.tblVenda_Prod_AtacProduto.Value := dmVendas.tblProdutoNome.Value; 
    end 
    else 
    begin 
      close; /**** ESSE CLOSE ESTÁ FECHANDO O frmVenda_Atac ****/
      dmVendas.tblVenda_Prod_Atac.Insert; 
      dmVendas.tblVenda_Prod_AtacProduto.Value := dmVendas.tblProdutoNome.Value; 
      frmVenda_Atac.dbEdit2.setFotcus; /**** frmVenda_Atac ESTÁ FECHADO ****/
    end 
  end 
  else 
    frmCad_Produto.showmodal;



Responder

10/11/2005

Buck

não não.
O CLOSE está fechando o ´frmCons_Venda_Atac´


Responder

10/11/2005

Emerson Nascimento

esse código (OnEnter) está num terceiro form?


Responder

10/11/2005

Emerson Nascimento

então tente assim:

FORM1 - FrmVenda_Atac 
OnEnter - DbEdit1 

  if DBComboBox1.Text = ´´ then 
  begin 
    messageDlg(´Selecione o Tipo da Venda´, mtError, [mbOk],0); 
    DBComboBox1.SetFocus; 
  end 
  else 
  if (dmVendas.tblVenda_Atac.State = dsEdit) or (dmVendas.tblVenda_Atac.State = dsInsert) then 
    dmVendas.tblVenda_Atac.Post; 

  frmCons_Produto.showmodal; 
  FORM2 - frmCons_Produto 

  if frmVenda_Atac.Showing = true then 
  begin 
    if (dmVendas.tblVenda_Prod_Atac.State = dsInsert) or (dmVendas.tblVenda_Prod_Atac.State = dsEdit) then 
    begin 
      close; 
      dmVendas.tblVenda_Prod_AtacProduto.Value := dmVendas.tblProdutoNome.Value; 
    end 
    else 
    begin 
      close;
      frmVenda_Atac.SetFocus; /*** PÕE O frmVenda_Atac EM FOCO ***/
      dmVendas.tblVenda_Prod_Atac.Insert; 
      dmVendas.tblVenda_Prod_AtacProduto.Value := dmVendas.tblProdutoNome.Value; 
      frmVenda_Atac.dbEdit2.setFotcus; 
    end 
  end 
  else 
    frmCad_Produto.showmodal;



Responder

10/11/2005

Buck

já tinha tentado isso tb...
o mesmo erro -- Access Violation


Responder

10/11/2005

Emerson Nascimento

rapaz... complicado...

se você quiser mande seu projeto para emerson.en@gmail.com

porque eu não consegui simular esse erro.


Responder

10/11/2005

Vitor Rubio

algumas perguntas:
você debugou o programa passo a passo para ver em qual linha que ocorre o access violation?

você dá free ou release em alguma form quando fecha?

os componentes de acesso a dados, tipo datasets e datasources onde esses dbedits estão ligados, ficam na mesma form q o dbedits, na outra form ou num datamodule?

tudo que vc está acessando está devidamente criado?

se o access violation for no endereço 00000000... ou FFFFFFF.... quer dizer que você usou uma variavel de uma classe qualquer sem criar ou instanciar. ou a destruiu sem ela estar criada.

se o endereço for diferente disso, quer dizer que você está tentando acessar um objeto que existia e estava instanciado, mas você o destruiu antes do tempo, sem saber que precisaria dele depois.


espero ter ajudado...


Responder

10/11/2005

Martins

por favor colega, com base nos códigos postados aqui destaque a posição apartir da qual o erro é disparado dentro do seu programa.

FORM1 - FrmVenda_Atac 

OnEnter - DbEdit1 

if DBComboBox1.Text = ´´ then 
begin 
messageDlg(´Selecione o Tipo da Venda´, mtError, [mbOk],0); 
DBComboBox1.SetFocus; 
end 
else 
if (dmVendas.tblVenda_Atac.State = dsEdit) or (dmVendas.tblVenda_Atac.State = dsInsert) then 

dmVendas.tblVenda_Atac.Post; // Salva a tabela Venda_atacado

frmCons_Produto.showmodal; // Abri o form2

FORM2 - frmCons_Produto 

if frmVenda_Atac.Showing = true then 
begin 
if (dmVendas.tblVenda_Prod_Atac.State = dsInsert) or (dmVendas.tblVenda_Prod_Atac.State = dsEdit) then 
begin 

close; //Esse close aqui vai fechar esse form2

dmVendas.tblVenda_Prod_AtacProduto.Value := dmVendas.tblProdutoNome.Value; 

end 

else 

begin 
close;  //Fecha aqui tb ... Form1.

dmVendas.tblVenda_Prod_Atac.Insert; 
dmVendas.tblVenda_Prod_AtacProduto.Value := dmVendas.tblProdutoNome.Value; 
frmVenda_Atac.dbEdit2.setFotcus;  //vc não pode ir para cá, pq vc fechou. 

end 
end 
else 
frmCad_Produto.showmodal;



Reveja estes close, esse código precisa ser refeito.


Responder

10/11/2005

Vitor Rubio

por favor colega, com base nos códigos postados aqui destaque a posição apartir da qual o erro é disparado dentro do seu programa.
 
...
else 

begin 
close;  //Fecha aqui tb ... Form1.

dmVendas.tblVenda_Prod_Atac.Insert; 
dmVendas.tblVenda_Prod_AtacProduto.Value := dmVendas.tblProdutoNome.Value; 
frmVenda_Atac.dbEdit2.setFotcus;  //vc não pode ir para cá, pq vc fechou. 

end 
end 
else 
frmCad_Produto.showmodal;
Reveja estes close, esse código precisa ser refeito.


Martins, se ele está numa procedure da form2 e não está usando with form1 ou form1.close, esse close que você citou vai fechar a propria form2 q ele está trabalhando mesmo, a form 1 continua aberta.


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar