Array
(
)

DbEdit.SetFocus = Access Violation

Buck
   - 07 nov 2005

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;


Rafael Santana
   - 07 nov 2005

os dois Edits estão no mesmo form???


Wiltonfenix
   - 07 nov 2005

Tem certeza que o dbedit para onde você está enviando o foco existe?


Martins
   - 07 nov 2005


Citação:
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;


Verifique se esse edit está no mesmo local, pq caso ele esteja em outro form (pouco provavel), caso vc esteja usando PageControl ou se esse edit estiver invisivel, esse erro será apresentado.

verifique.

Boa sorte!!!


Martins
   - 07 nov 2005


Citação:
Tem certeza que o dbedit para onde você está enviando o foco existe?


Acredito q deva existir esse Edit2, caso contrário o código dele não compilaria, tá estranho isso, pq mesmo q estive invisivel para o controle o erro apresentado deveria ser outro, e não esse de violação de acesso.

Precisamos de mais detalhes para avaliar o paciente, hehehe!!!


Wiltonfenix
   - 07 nov 2005

Quando eu disse ´existe´, entenda-se: criado, instanciado,...

Porque como o Martins disse, ele pode estar em outro Form ou outro componente que não foi criado.


Buck
   - 07 nov 2005

Os dbEdits estão no mesmo Form, estão Visiveis, e Ativadas.
Mas a função está no OnChange da dbEdit1, pois há o Form da ´Consulta´ em cima. Ao Clicar no Grid do Form ´Consulta´, ele volta com o Nome na dbEDIT1.
É aí que o SetFocus tá dando pau...


Wiltonfenix
   - 08 nov 2005

Já tentou form_do_edit.dbEdit2.Setfocus ?


Buck
   - 08 nov 2005

sim, ja tentei...


Anfm
   - 08 nov 2005

Esse erro está acontecendo qdo vc cria o form??


Buck
   - 08 nov 2005

sim, mas aí ´cannot focus a invisible or disabled window´.
mas se colocar ´if form.showing = true then´, aí ele roda, mas dá aquele erro de access violation depois.


Anfm
   - 08 nov 2005

pq vc está usando o evento onchange? Sempre q o usuário digitar uma letra vc quer q ele vá para o DBEdit2??? Não seria melhor vc colocar isto qdo o usuário pressionar enter?


Martins
   - 08 nov 2005


Citação:
Os dbEdits estão no mesmo Form, estão Visiveis, e Ativadas.
Mas a função está no OnChange da dbEdit1, pois há o Form da ´Consulta´ em cima. Ao Clicar no Grid do Form ´Consulta´, ele volta com o Nome na dbEDIT1.
É aí que o SetFocus tá dando pau...


Vc chama o form de consulta de onde? vamos supor.

form1 -> o q tem seus dbedits
form2 -> o q tem o dbgrid

vc chama o form2 através do form1? Se for, é só vc colocar assim.
#Código


Form2.ShowModal;
DBEdit1.Text := Form2.DBGrid1.Fields[0].AsString;
Assim quando vc fechar o form de consulta ele trará o registro setado no dbgrid, sendo 0 o primeiro campo, vc pode alterar para sua necessidade.

se vc estiver selecionando o campo com OnDbClick no grid, para q ele retorne para form1 com o valor e automaticamente vá para DbEdit2. tente assim
#Código

Form1.Edit1.Text:= DbGrid1.Fields[0].AsString;
close;


Ou então pode o código q vc tá usando, fica bem mais fácil.


Martins
   - 08 nov 2005


Citação:
sim, mas aí ´cannot focus a invisible or disabled window´.
mas se colocar ´if form.showing = true then´, aí ele roda, mas dá aquele erro de access violation depois.


Como vc está fazendo essa chamada dos forms, e carregando o valor nos DbEdit´s, entendo q o evento no OnChage é para ser disparado ao receber um valor, valor este q virá da consulta para DbEdit1, recebendo esse valor vá para DbEdit2, mesmo assim não sei se é bom negócio deixar desse jeito, pq vc poderia setar isso condicionalmente, mas vamos ao erro aos forms. Se vc puder postar o código aqui fica mais fácil de chagarmos a uma solução caso vc ainda não tenha encontrado.


Buck
   - 08 nov 2005

fica meio dificil de postar os codigos, pois estão em outro pc, mas vamos lá.

no form1, ficam as DbEdits.
no Form2, fica o dbGrid.

onEnter da dbEdit1, ele chama o Form2 (consulta)

onCellClick do dbGrid, ele fecha o Form2 e preenche a dbEdit1.

OnChange dbEdit1 (Form1)
dbEdit2.SetFocus;

mas se colocar assim no ONChange ele nem roda,

então:
if form1.showing = true then
OnChange dbEdit1 (Form1)
dbEdit2.SetFocus;

........
é isso pessoal,
muito estranho esse erro.
Agradeço a cooperação de vocês...
Abraço !


Martins
   - 08 nov 2005


Citação:
fica meio dificil de postar os codigos, pois estão em outro pc, mas vamos lá.

no form1, ficam as DbEdits.
no Form2, fica o dbGrid.

onEnter da dbEdit1, ele chama o Form2 (consulta)

onCellClick do dbGrid, ele fecha o Form2 e preenche a dbEdit1.

OnChange dbEdit1 (Form1)
dbEdit2.SetFocus;

mas se colocar assim no ONChange ele nem roda,

então:
if form1.showing = true then
OnChange dbEdit1 (Form1)
dbEdit2.SetFocus;

........
é isso pessoal,
muito estranho esse erro.
Agradeço a cooperação de vocês...
Abraço !


Vc viu e testou o q eu postei, pq vc tem os dois forms do jeito q eu imaginei.

veja novamente.

form1 -> o q tem seus dbedits
form2 -> o q tem o dbgrid

Código:
#Código


procedure TForm1.DBEdit1Enter(Sender: TObject);
begin
Form2.ShowModal;
DBEdit1.Text:= Form2.DBGrid1.Fields[0].AsString;
DBEdit2.Text:= Form2.DBGrid1.Fields[1].AsString;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
DBEdit2.SetFocus;
end;

Assim quando vc fechar o form de consulta ele trará o registro setado no dbgrid, sendo 0 o primeiro campo, vc pode alterar para sua necessidade.

Ao clicar em OnCellClick, será disparado o close, pq o registro é setado
no momento em q vc clicar sobre a célula.
#Código

close;


Qualquer coisa, te mando um exemplo por e-mail, posta aí teu e-mail q eu mando.


Emerson
   - 08 nov 2005

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


Martins
   - 08 nov 2005


Citação:
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 emerson.en

#Código


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



Buck
   - 10 nov 2005

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


Cabelo
   - 10 nov 2005

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


assim funciona..


Martins
   - 10 nov 2005


Citação:
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.