onShow maluco... Estranho!

Delphi

25/08/2005

Olá pessoal,

Alguém pode me ajudar a desvendar este segredo. É o seguinte vou primiro explicar como é minha aplicação. Estou desenvolvendo um sistema para Paróquias, minha aplicação é em MDI, no menu principal uso para chamar os forms com este código:

Try
   Try
    Screen.CUrsor := crSQLWait;
    DM.qPastoral.Open;
    
    Application.CreateForm(TFPastoral, FPastoral);
    FPastoral.Top := 15;
   Finally
    Screen.CUrsor := crDefault;
   End;
 Except
   DM.qPastoral.Close;
 End;


ele não carrega os forms no DM.

Quero fazer o seguinte, quando entro no form Pastoral ele carrega no onShow os código que verifica se tem o dado na tabela e se tiver ´SIM´ ele marca o CheckBox como State = cbChecked, se tiver NAO ele marca State = cbUnchecked. Uso este código:

 
procedure TFPastoral.FormShow(Sender: TObject);
begin
   if DM.qPastoralCATEQUISTA.Value = ´SIM´ Then
   Begin
    CheckBox1.State := cbChecked;
   End;
    if DM.qPastoralCATEQUISTA.Value = ´NAO´ Then
   Begin
    CheckBox1.State := cbGrayed;
   End;


Mas as vezes quando abre funciona e as vezes não, QUANDO PESQUISO UM PESSOA ELE FUNCIONA E AS VEZES NÃO. PQ????
ESTOU COLOCANDO PARA CARREGAR NO LOCAL ERRADO? NÃO É NO onShow? Mas no onCreate dá a mesma coisa.


Obrigado
Rodrigo[/code]


Rodrigorpb

Rodrigorpb

Curtidas 0

Respostas

Rodrigorpb

Rodrigorpb

25/08/2005

pessoal esquici de dizer, uso IBX e F.B 1.5.

Rodrigo.


GOSTEI 0
Massuda

Massuda

25/08/2005

Eu não entendi direito... você faz uma pesquisa usando DM.qPastoral e mostra o resultando em um form TFPastoral?

Pelo que você escreveu, dá impressão que o form TFPastoral mostra os dados de uma única pessoa. Tem garantia que o resultado da sua pesquisa é único?

Esse form TFPastoral tem algum componente data aware?

ESTOU COLOCANDO PARA CARREGAR NO LOCAL ERRADO? NÃO É NO onShow? Mas no onCreate dá a mesma coisa.
Pode ser em qualquer dos dois eventos, eu prefiro usar o OnCreate.

Uma outra coisa... eu prefiro o seguinte código ao invés do que você postou...
Screen.CUrsor := crSQLWait;
Try
  DM.qPastoral.Open;
  Try
    Application.CreateForm(TFPastoral, FPastoral);
    FPastoral.Top := 15;
  except
    DM.qPastoral.Close;
  End;
Finally
  Screen.CUrsor := crDefault;
End;
Imagino que a query DM.qPastoral seja fechada em algum outro ponto do código e não apenas quando algo dá errado.


GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Olá,

Eu não uso nenhum componente data aware.
E eu não expliquei direito, tenho o form Pastoral que eu cadastro os dados Nome, Endereço, e um CheckBox que coloco se é ou não CATEQUISTA, e outra somente para fazer pesquisa destas pessoas, quando eu clico no botão pesquisa que está no form Pastoral ele fecha a o o form FPastoral, não sei se pode sei por isso. Ai ele abre o Form pesquisa e dentro do form pesquisa tenho outra query para fazer as pesquisas, quando fecho o Form pesquisa ele fecha a query do form pesquisa e abre novamente com este código:

Botão Visualizar
 Try
   Try
    Screen.CUrsor := crSQLWait;
    DM.qPastoral.Open;
    Application.CreateForm(TFPastoral, FPastoral);
    FPastoral.Top := 15;
   Close;
   Finally
    Screen.CUrsor := crDefault;
   End;
 Except
   DM.qPastoral.Close;
 End; 


Repare q coloquei apenas um close de baixo do Pastoral.

E tb gostaria de saber mais qual é a diferença entre meu código e o seu, as vezes o erro pode estar ai.


Obrigado.
Rodrigo.


GOSTEI 0
Massuda

Massuda

25/08/2005

O que você explicou me deixou mais confuso...

Afinal, o form TFPastoral mostra os dados de uma única pessoa?

Tem garantia que o resultado da sua pesquisa é único?

Porque quando a pessoa [b:1313d7a53b]não[/b:1313d7a53b] é catequista você deixa o checkbox desabilitado (grayed) ao invés de deixá-lo desmarcado (unchecked)?


GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Olá Massuda,

O Form mostra dados apenas de uma única pessoa.
Sobre o CheckBox foi engano meu, eu já arrumei isto.
Copiei as imagens da tela para vc dar uma olhada mas naum tenho como postar no forum, se vc puder passar seu e-mail, eu te envio.

Obrigado.
Rodrigo.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

25/08/2005

esse é um problema característico dos forms MDIChild. como sua visualização é automática (ao criar) ele não passa pelo OnShow. para contornar esse problema chame a procedure Show explicitamente:

Try
  Try 
    Screen.CUrsor := crSQLWait; 
    DM.qPastoral.Open; 
    
    Application.CreateForm(TFPastoral, FPastoral); 
    FPastoral.Top := 15;
    FPastoral.FormShow(FPastoral);
  Finally 
    Screen.CUrsor := crDefault; 
  End; 
Except 
  DM.qPastoral.Close; 
End;



GOSTEI 0
Massuda

Massuda

25/08/2005

...como sua visualização é automática (ao criar) ele não passa pelo OnShow.
Provavelmente você tem razão... uma outra alternativa é preencher o checkbox no OnCreate do form.


GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Massuda,
Como faço para monstrar as telas para vc, está no formato JPEG.
Outra, as vezes o CheckBox funciona e as vezes não, é muito entranho.

Rodrigo.


GOSTEI 0
Massuda

Massuda

25/08/2005

Neste [url=http://forum.clubedelphi.net/viewtopic.php?t=67135]tópico[/url] tem um post meu sobre como por imagens no fórum.

[color=red:cf0ded7a26]Por favor, tenha dó de quem está numa conexão discada... [b:cf0ded7a26]não coloque imagens grandes[/b:cf0ded7a26].[/color:cf0ded7a26]


GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Estas são as telas, troquei o nome do form para Pessoas.
Vou colocar o código em baixo a imagem dos seguintes botões, Pesquisa no Form Pessoas, Visualizar do Form Pesquisa, e tb onshow e oncreate dos dois.
O checkbox marcado no Dizimista é que eu esquci de colocar no botão inserir, para ficar como os outros.

[img]http://img386.imageshack.us/my.php?image=tala17dn.jpg[/img]

[img]http://img397.imageshack.us/my.php?image=telapesq6yl.jpg[/img]

FORM PESSOA BOTÃO PESQUISA

   Try
    Screen.CUrsor := crSQLWait;
    Application.CreateForm(TFConsFieis, FConsFieis);
    FConsFieis.Top := 10;
    FPessoas.Close;
   Finally
    Screen.CUrsor := crDefault;
   End



FORM PESQUISA BOTÃO VISUALIZAR
Try
   Try
    Screen.CUrsor := crSQLWait;
    DM.qPessoas.Open;
    DM.qEstcivil.Open;
    DM.qEstcivil.FetchAll;
    DM.qProfissao.Open;
    DM.qProfissao.FetchAll;
    DM.qCidades.Open;
    DM.qCidades.FetchAll;
    DM.qComunidades.Open;
    DM.qComunidades.FetchAll;
    DM.qGruporeflexao.Open;
    DM.qGruporeflexao.FetchAll;
    DM.qMinisterio.Open;
    DM.qMinisterio.FetchAll;
    DM.qMovimento.Open;
    DM.qMovimento.FetchAll;
    DM.qPastoral.Open;
    DM.qPastoral.FetchAll;
    DM.qSexo.Open;
    DM.qSexo.FetchAll;
    Application.CreateForm(TFPessoas, FPessoas);
    FPessoas.Top := 5;
            //Catequista
    if FPessoas.edCatequista.Text = ´CATEQUISTA´ Then
   Begin
    FPessoas.cbCatequista.State := cbChecked;
   End;
    if FPessoas.edCatequista.Text = ´´ Then
   Begin
    FPessoas.cbCatequista.State := cbGrayed;
   End;


   //Dizimista
    if FPessoas.edDizimista.Text = ´SIM´ Then
   Begin
    FPessoas.cbDizimista.State := cbChecked;
   End;
    if FPessoas.edDizimista.Text = ´NAO´ Then
   Begin
    FPessoas.cbDizimista.State := cbUnchecked;
   End;
    if FPessoas.edDizimista.Text = ´´ Then
   Begin
    FPessoas.cbDizimista.State := cbGrayed;
   End;

   //Eucaristia
    if FPessoas.edEucaristia.Text = ´SIM´ Then
   Begin
    FPessoas.cbEucaristia.State := cbChecked;
   End;
    if FPessoas.edEucaristia.Text = ´NAO´ Then
   Begin
    FPessoas.cbEucaristia.State := cbUnchecked;
   End;
    if FPessoas.edEucaristia.Text = ´´ Then
   Begin
    FPessoas.cbEucaristia.State := cbGrayed;
   End;

   //Batismo
    if FPessoas.edBatismo.Text = ´SIM´ Then
   Begin
    FPessoas.cbBatismo.State := cbChecked;
   End;
    if FPessoas.edBatismo.Text = ´NAO´ Then
   Begin
    FPessoas.cbBatismo.State := cbUnchecked;
   End;
    if FPessoas.edBatismo.Text = ´´ Then
   Begin
    FPessoas.cbBatismo.State := cbGrayed;
   End;

   //Crisma
    if FPessoas.edCrisma.Text = ´SIM´ Then
   Begin
    FPessoas.cbCrisma.State := cbChecked;
   End;
    if FPessoas.edCrisma.Text = ´NAO´ Then
   Begin
    FPessoas.cbCrisma.State := cbUnchecked;
   End;
    if FPessoas.edCrisma.Text = ´´ Then
   Begin
    FPessoas.cbCrisma.State := cbGrayed;
   End;
    FConsFieis.Close;
   Finally
    Screen.CUrsor := crDefault;
   End;
 Except
    DM.qPessoas.Close;
    DM.qEstcivil.Close;
    DM.qProfissao.Close;
    DM.qCidades.Close;
    DM.qComunidades.Close;
    DM.qGruporeflexao.Close;
    DM.qMinisterio.Close;
    DM.qMovimento.Close;
    DM.qPastoral.Close;
    DM.qSexo.Close;
End;



ONSHOW FORM PESSOA

        //Catequista
    if DM.qPessoasCATEQUISTA.Value = ´CATEQUISTA´ Then
   Begin
    cbCatequista.State := cbChecked;
   End;
    if DM.qPessoasCATEQUISTA.Value = ´´ Then
   Begin
    cbCatequista.State := cbGrayed;
   End;


   //Dizimista
    if DM.qPessoasDIZIMISTA.Value = ´SIM´ Then
   Begin
    cbDizimista.State := cbChecked;
   End;
    if DM.qPessoasDIZIMISTA.Value = ´NAO´ Then
   Begin
    cbDizimista.State := cbUnchecked;
   End;
    if DM.qPessoasDIZIMISTA.Value = ´´ Then
   Begin
    cbDizimista.State := cbGrayed;
   End;

   //Eucaristia
    if DM.qPessoasEUCARISTIA.Value = ´SIM´ Then
   Begin
    cbEucaristia.State := cbChecked;
   End;
    if DM.qPessoasEUCARISTIA.Value = ´NAO´ Then
   Begin
    cbEucaristia.State := cbUnchecked;
   End;
    if DM.qPessoasEUCARISTIA.Value = ´´ Then
   Begin
    cbEucaristia.State := cbGrayed;
   End;

   //Batismo
    if DM.qPessoasBATIZADO.Value = ´SIM´ Then
   Begin
    cbBatismo.State := cbChecked;
   End;
    if DM.qPessoasBATIZADO.Value = ´NAO´ Then
   Begin
    cbBatismo.State := cbUnchecked;
   End;
    if DM.qPessoasBATIZADO.Value = ´´ Then
   Begin
    cbBatismo.State := cbGrayed;
   End;

   //Crisma
    if DM.qPessoasCRISMADO.Value = ´SIM´ Then
   Begin
    cbCrisma.State := cbChecked;
   End;
    if DM.qPessoasCRISMADO.Value = ´NAO´ Then
   Begin
    cbCrisma.State := cbUnchecked;
   End;
    if DM.qPessoasCRISMADO.Value = ´´ Then
   Begin
    cbCrisma.State := cbGrayed;
   End;




Obrigado.


GOSTEI 0
Massuda

Massuda

25/08/2005

Colega,

Explique claramente qual é o problema.


GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Massuda,

Quero que quando eu fazer a pesquisa ele marque os checkbox, como eu havia cadastrado. Para a pessoa saber se é Dizimista, 1ª Eucaristia...

Ex: Pesquisei Rodrigo, eu sou Dizimista ele vem marcado o checkbox. Agora pesquisei Camila, ela naum é dizimista, então fica Desmarcado.

Isso é que naum consigo. Por isso coloquei o codigo no onshow, mas as vezes da certinho e as vezes naum funciona.

Obrigado
Rodrigo


GOSTEI 0
Rjun

Rjun

25/08/2005

Desculpe amigo rodrigorpb, eu já vi identações estranhas por aqui, mas a sua é uma das mais diferentes que já vi. Quem não tá acostumado sofre para analisar esses códigos.

 if FPessoas.edDizimista.Text = ´SIM´ Then 
   Begin 
    FPessoas.cbDizimista.State := cbChecked; 
   End; 
    if FPessoas.edDizimista.Text = ´NAO´ Then 
   Begin 
    FPessoas.cbDizimista.State := cbUnchecked; 
   End; 
    if FPessoas.edDizimista.Text = ´´ Then 
   Begin 
    FPessoas.cbDizimista.State := cbGrayed; 
   End; 



GOSTEI 0
Rjun

Rjun

25/08/2005

Você quer que ele fique desmarcado ou marcado com cor cinza?


GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Gostaria tb que alguém me ajudasse a deixar este código certo.

Obrigado.
Rodrigo.


GOSTEI 0
Rjun

Rjun

25/08/2005

Não sei se vc leu meu último post, por isso estou repetindo.

[b:22c85895e7]Você quer que ele fique desmarcado ou marcado com cor cinza?[/b:22c85895e7]


GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Desculpe tb eu naum havia falado,

No form Pessoas tem DBEdits ocultos que recebem os valores dos cheks

edDizimista = DBEdit1

procedure TFPessoas.cbDizimistaClick(Sender: TObject);
begin
 if cbDizimista.Checked = True then
  Begin
    edDizimista.Text := ´SIM´
  end
  Else
  Begin
    edDizimista.Text := ´NAO´;
  End;
end;



GOSTEI 0
Massuda

Massuda

25/08/2005

Quero que quando eu fazer a pesquisa ele marque os checkbox, como eu havia cadastrado. Para a pessoa saber se é Dizimista, 1ª Eucaristia...
Seu teste está errado. Por exemplo, no caso do dizimista, deveria ser algo assim:
if FPessoas.edDizimista.Text = ´SIM´ then 
  FPessoas.cbDizimista.State := cbChecked 
else if FPessoas.edDizimista.Text = ´NAO´ then 
  FPessoas.cbDizimista.State := cbUnchecked 
else
  FPessoas.cbDizimista.State := cbGrayed;
Fora isso, acho que você está pegando o valor de um editbox (FPessoas.edDizimista) enquanto o certo devia ser pegar da query.


GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Rjun ele fica conforme estiver nos DBEdits = edDizimista (oculto no form Pessoa).

edDizimista pode estar: SIM NAO e NULO.

Ai quando abrir o onshow ele verifica e marca como deve.

    if DM.qPessoasDIZIMISTA.Value = ´SIM´ Then
   Begin
    cbDizimista.State := cbChecked;
   End;
    if DM.qPessoasDIZIMISTA.Value = ´NAO´ Then
   Begin
    cbDizimista.State := cbUnchecked;
   End;
    if DM.qPessoasDIZIMISTA.Value = ´´ Then
   Begin
    cbDizimista.State := cbGrayed;
   End;



GOSTEI 0
Rjun

Rjun

25/08/2005

Não entendi o pq desse dbedit oculto. Vc chamou o form como o emerson.en falou?

if DM.qPessoasDIZIMISTA.Value = ´SIM´ Then 
  cbDizimista.State := cbChecked 
else if DM.qPessoasDIZIMISTA.Value = ´NAO´ Then 
  cbDizimista.State := cbUnchecked; 
else if DM.qPessoasDIZIMISTA.Value = ´´ Then 
  cbDizimista.State := cbGrayed; 



GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Então Rjun, funciona tb do jeito que vc falou dois dois jeitos, mas o problema maior é que as vezes quando eu faço a pesquisa funciona e as vezes não, até parece que es vezes ele lê o OnShow, e as vezes não.

Agora vem a grande questão pq isso??

uso MDI não fiz ainda como o emerson.en falou.

O que pede ser?

Rodrigo.


GOSTEI 0
Rjun

Rjun

25/08/2005

Então faça como o emerson disse. Veja que com form MDI no momento que você cria o form e já o exibe acho que sem passar pelo evento OnShow.


GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Fiz como nosso coléga disse, continua mesma coisa.

É duro, muito difícil isso.

Vou colocar no OnCreate para ver.

Rodrigo


GOSTEI 0
Rjun

Rjun

25/08/2005

Você ja debugou para saber onde está o erro?


GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Rjun sou ainda ´marinheiro de primeira viajem´ em delphi, não sei como debugar o sistema, se vc pudesse me dar um dica para encontrar erros. Mas Obrigado pelas dicar, Rjun, Massuda e emerson.en.
Vou tentar encontrar esta falha, muito estanha por sinal, parece que ele lê o OnShow e o OnCreate as vezes pois funciona quando quer.

valeu a todos.

Rodrigo.


GOSTEI 0
Rjun

Rjun

25/08/2005

Faça assim...posicione o cursor na primeira linha do seu código onde vc começa a fazer a verificação dos campos...pressione F4...seu código será executado e quando chegar nessa linha ele ira para...depois pressione F7 para ir executando linha a linha...veja se assim vc consegue achar o erro.


GOSTEI 0
Rodrigorpb

Rodrigorpb

25/08/2005

Rjun obrigado.


GOSTEI 0
POSTAR