Problemas com TreeView no OnShow do Form

Delphi

31/07/2006

Pessoal, estou trocando o componente DBGrid pelo TreeView / List View.
entao em um dos meus formulários tenho duas tabelas

Tbl_R_Substancias_2 = tabela Detalhe
Tbl_R_Substancias = tabela Mestre

para trazer os dados para o TreeView eu fiz um select que vai criar um Node Root para cada Registro da tabela detalhe, e outro select que vai jogar todos os dados da tabela mestre - cujos o ´codigo de descrição´ for igual ao código da tabela detalhe - em Nodes filhos, no seu respectivo Node Root.

Bom, o fato é que esse procedure funciona muito bem quando eu executo ele atravez de um botão, depois do form criado, porem no enevto OnShow do Form ele me da aquele erro ´Access violation at adress 0042616A of adress 00000394´.

Alguem saberia me ajudar com isso, pois eu gostaria que esse procedure estrivesse no OnShow do Form

Segue abaixo a procedure:


procedure AtualizaArvore;
begin

      {Se não estiver selecionado}
   if(  R_Substancias.TV.Selected = nil  ) then
   begin
         {Existe um node Root?}
      if(  R_Substancias.TV.Items.Count = 0  ) then
      begin
          DM.Tbl_R_Substancias_2.Close;
          DM.Tbl_R_Substancias_2.SelectSQL.Clear;
          DM.Tbl_R_Substancias_2.SelectSQL.Add(´SELECT * FROM NBR10004_2004_SUBSTANCIAS_2 ORDER BY DESCRICAO´);
          DM.Tbl_R_Substancias_2.Open;

          DM.Tbl_R_Substancias_2.First;
          R_Substancias.TV.items.BeginUpdate;
          While not DM.Tbl_R_Substancias_2.Eof do
          begin
              {Adiciona o Node Root}
              with R_Substancias.TV.Items.AddFirst(  nil,  DM.Tbl_R_Substancias_2DESCRICAO.AsString + ´ ( ´ + DM.Tbl_R_Substancias_2TIPO.AsString + ´ )´) do
              begin
                  Selected      := true;
                  {Seta a imagem root padrao}
                  ImageIndex    := DM.Tbl_R_Substancias_2CODIGO_IMAGEM.AsInteger;
                  {Seta a imagem root selecionada.}
                  SelectedIndex := DM.Tbl_R_Substancias_2CODIGO_IMAGEM.AsInteger;

                  // Insere as substancias filhas do node root ---------
                  DM.Tbl_R_Substancias.Close;
                  DM.Tbl_R_Substancias.SelectSQL.Clear;
                  DM.Tbl_R_Substancias.SelectSQL.Add(´SELECT * FROM NBR10004_2004_SUBSTANCIAS WHERE CODIGO_DESCRICAO = ´+DM.Tbl_R_Substancias_2CODIGO.AsString);
                  DM.Tbl_R_Substancias.Open;

                  DM.Tbl_R_Substancias.First;
                  While not DM.Tbl_R_Substancias.Eof do
                  begin
                      {Adidiona o Node Como um Filho do Node Selecionado}
                      with R_Substancias.TV.Items.AddChildFirst(  R_Substancias.TV.Selected,  DM.Tbl_R_SubstanciasNOME_COMUM.AsString  ) do
                      begin
                          {Set the image used when the node is not selected}
                          ImageIndex := 0;
                          {Image used when the node is selected}
                          SelectedIndex := 2;

                          MakeVisible;
                      end;
                      DM.Tbl_R_Substancias.Next;
                  end;

                  //----------------------------------------------------

              end;

              DM.Tbl_R_Substancias_2.Next;
          end;
          R_Substancias.TV.items.EndUpdate;
      end;
   end;

end;


Abraços a todos!


Mahdak

Mahdak

Curtidas 0

Respostas

Mahdak

Mahdak

31/07/2006

só pra elucidar mais...

- TV = TreeView
- meu banco = Firebird 1.5.3
- Delphi 7
- Ainda nao implementei o List View (O problema é só com o TreeView)

Abraços


GOSTEI 0
Mahdak

Mahdak

31/07/2006

sobe, pq ainda nao consegui resolver... :roll:


GOSTEI 0
Bon Jovi

Bon Jovi

31/07/2006

Já depurou passo a passo? Em qual linha ocorre Access Violation?


GOSTEI 0
Mahdak

Mahdak

31/07/2006

[quote:6039e81601=´Bon Jovi´]Já depurou passo a passo? Em qual linha ocorre Access Violation?[/quote:6039e81601]

depurei... da uma olhada na imagem:




e dai??


GOSTEI 0
Siam

Siam

31/07/2006

E qual o código do evento onShow ?


GOSTEI 0
Mahdak

Mahdak

31/07/2006

E qual o código do evento onShow ?


eu fasso um select para atualizar a tabela(que ja verifiquei e nao tem problemas)

e depois do select eu chamo a procedure ´atualizaarvore;´


GOSTEI 0
Siam

Siam

31/07/2006

R_Substancias é o Form ?
Seu TV está instanciado ?


GOSTEI 0
Mahdak

Mahdak

31/07/2006

R_substancias é o Form Sim...

Desculpe mas o que voce quer dizer por TreeView instanciado?


GOSTEI 0
Siam

Siam

31/07/2006

Vc cria o TV em runtime ?


GOSTEI 0
Mahdak

Mahdak

31/07/2006

nao, ele ja existe em tempo de projeto...


GOSTEI 0
Siam

Siam

31/07/2006

Experimente colocar a procedure AtualizaArvore como um método do seu Form R_Substancias


GOSTEI 0
Mahdak

Mahdak

31/07/2006

e como eu faria isso? vc teria como me exemplificar?


GOSTEI 0
Siam

Siam

31/07/2006

Defina a procedure na seção public ou private do seu R_Substancias.
Coloque sua procedure na mesma unit do Form.
Na implementação coloque:
procedure R_Substancias.AtualizaArvore;


GOSTEI 0
Mahdak

Mahdak

31/07/2006

ok, velleu pela força, vou testar a tarde, pq aqui nao tenho o delphi instalado, qualquer coisa eu respondo...

abração!


GOSTEI 0
Mahdak

Mahdak

31/07/2006

nao adiantou brother...

só repostando a imagem acima que nao da mais de ver



GOSTEI 0
Mahdak

Mahdak

31/07/2006

uma coisa eu testei e deu certo...

no evento OnShow do meu Form R_Substancias ao inves de chamar a procedure ´atualizaarvore´ eu coloquei todo o código contida na procedure, porem só tirei a referencia ao form
exemplo:

ANTES (com o problema)
-----------------------------

procedure atualizaarvore;
begin
      RSubstancias.TV.blablabla;
      RSubstancias.TV.blablabla
end;

procedure TRSubstancias OnShow;
begin
      atualizaarvore;
end;



AGORA (Sem o prblema)
----------------------------
procedure TRSubstancias OnShow;
begin
      TV.blablabla;
      TV.blablabla;
end;



porem eu precisaria mesmo chamar a procedure no onshow, até por motivos de diminuir o numero de linhas de código dentro do sistema... alguem saberia o por que do erro estar na referencia do Form ´R_Substancias´ na procedure ´atualizaarvore´ ?


GOSTEI 0
Siam

Siam

31/07/2006

Mas na imagem que vc postou, a procedure AtualizaArvore não pertence ao seu Form.


GOSTEI 0
Mahdak

Mahdak

31/07/2006

Mas na imagem que vc postou, a procedure AtualizaArvore não pertence ao seu Form.


siam, ela pertence sim, a procedure AtualizaArvore está dentro do Form R_Substancias, logo abaixo da diretiva {$R *.dfm}, ou seja, acima de todos os outros procedures do form...


GOSTEI 0
Siam

Siam

31/07/2006

Se pertencesse ela teria que se declarada na implementation como:
procedure R_Substancias.AtualizaArvore;

E não como
procedure AtualizaArvore;



GOSTEI 0
Mahdak

Mahdak

31/07/2006

entao, eu ja tentei dessa forma como sugestionado anteiormente pelo amigo, porem obtive o mesmo erro.. voce tem alguma sugestão pra mim?
abração!


GOSTEI 0
Siam

Siam

31/07/2006

Ainda acho que o erro está relacionado ao fato da procedure não pertencer ao Form.


GOSTEI 0
Mahdak

Mahdak

31/07/2006

vamos lá entao... refiz tudo para fazer o procedure pertencer ao form e o erro persiste... vou postar as imagens aqui, por favor se eu estiver fazendo algo errado me corrija...
abração!

passo 1:



Passo 2:



Passo 3:



GOSTEI 0
Siam

Siam

31/07/2006

E mesmo assim o erro persiste na mesma linha ?
Tente trocar:
if ( R_Substancias.TV.Selected = nil ) then

Por:
if Assigned(TV) and Assigned(TV.Selected) then



GOSTEI 0
POSTAR