Problemas com TreeView no OnShow do Form
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:
Abraços a todos!
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
Curtidas 0
Respostas
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
- 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
31/07/2006
sobe, pq ainda nao consegui resolver... :roll:
GOSTEI 0
Bon Jovi
31/07/2006
Já depurou passo a passo? Em qual linha ocorre Access Violation?
GOSTEI 0
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??
depurei... da uma olhada na imagem:
e dai??
GOSTEI 0
Siam
31/07/2006
E qual o código do evento onShow ?
GOSTEI 0
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
31/07/2006
R_Substancias é o Form ?
Seu TV está instanciado ?
Seu TV está instanciado ?
GOSTEI 0
Mahdak
31/07/2006
R_substancias é o Form Sim...
Desculpe mas o que voce quer dizer por TreeView instanciado?
Desculpe mas o que voce quer dizer por TreeView instanciado?
GOSTEI 0
Siam
31/07/2006
Vc cria o TV em runtime ?
GOSTEI 0
Mahdak
31/07/2006
nao, ele ja existe em tempo de projeto...
GOSTEI 0
Siam
31/07/2006
Experimente colocar a procedure AtualizaArvore como um método do seu Form R_Substancias
GOSTEI 0
Mahdak
31/07/2006
e como eu faria isso? vc teria como me exemplificar?
GOSTEI 0
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;
Coloque sua procedure na mesma unit do Form.
Na implementação coloque:
procedure R_Substancias.AtualizaArvore;
GOSTEI 0
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!
abração!
GOSTEI 0
Mahdak
31/07/2006
nao adiantou brother...
só repostando a imagem acima que nao da mais de ver
só repostando a imagem acima que nao da mais de ver
GOSTEI 0
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)
-----------------------------
AGORA (Sem o prblema)
----------------------------
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´ ?
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
31/07/2006
Mas na imagem que vc postou, a procedure AtualizaArvore não pertence ao seu Form.
GOSTEI 0
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
31/07/2006
Se pertencesse ela teria que se declarada na implementation como:
E não como
procedure R_Substancias.AtualizaArvore;
E não como
procedure AtualizaArvore;
GOSTEI 0
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!
abração!
GOSTEI 0
Siam
31/07/2006
Ainda acho que o erro está relacionado ao fato da procedure não pertencer ao Form.
GOSTEI 0
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:
abração!
passo 1:
Passo 2:
Passo 3:
GOSTEI 0
Siam
31/07/2006
E mesmo assim o erro persiste na mesma linha ?
Tente trocar:
Por:
Tente trocar:
if ( R_Substancias.TV.Selected = nil ) then
Por:
if Assigned(TV) and Assigned(TV.Selected) then
GOSTEI 0