 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
GuilhermeAG Novato

Registrado: Quarta-Feira, 6 de Julho de 2011 Mensagens: 4
|
Enviada: Qua Jul 06, 2011 12:30 am Assunto: Erro ao tentar remover componentes RunTime |
|
|
É o meu primeiro post, se fiz algo de errado, por favor me comuniquem =D
Bom, em um form do meu programa, há um botão que cria componentes com Arrays, há o item a ser selecionado, q é um DBLookupComboBox, há a quantidade, valor unitario, desconto e Valor total que sao DBEdits e o Remove q eh um TButton.
Ambos sao criados em um unico clique, até o maximo de 40, alinhados e a cada clique no botao adicionar, adiciona-se +1 Item, +1 Quantidade +1 Valor Unitario +1 Desconto, +1 Valor Total e +1 Remove, estao todos diretamente relacionados, até ai tudo bem.
O problema:
No evento OnClick do TButton configurei a remoçao dos componentes associados, primeiro ele lê o proprio nome, pra saber qual componentes devera apagar e depois posiciona o Top a -20 de todas as linhas de componentes que estao abaixo da excluida para ocupar o espaço q ficou vago. Até o primeiro clique, tudo funcionando perfeitamente, mas após o segundo clique, da um erro :
Projet XXX.Exe raised exception class EAcessViolation with message 'Acces violation at addres 00403463 in module 'XXX'.Read of address 454D4F4E'. Processstopped. Use Step or Run to Continue.
Ja havia resolvido varios erros destes antes, mas este ja tentei todos os tipos de codigo q conheco e n deu certo, segue o atual codigo:
Código: | var S,R:String;
var A,B,C,D,cont:integer;
begin
S:='';
S:=Copy(TDBLookupComboBox(Sender).Name,1,Length(TDBLookupComboBox(Sender).Name));
for cont:=1 to Length(TDBLookupComboBox(Sender).Name) do
begin
if S[cont] in ['0'..'9'] then
begin
R:=Copy(S,cont,1);
end;
end;
A:=StrToInt(R);
for B:=1 to FormOS.ComponentCount-1 do
begin
if FormOS.Components[B].Name='Item'+IntToStr(A) then
begin
FreeAndNil(Item[A]);
FreeAndNil(Quant[A]);
FreeAndNil(Desc[A]);
FreeAndNil(Valunit[A]);
FreeAndNil(Val[A]);
FreeAndNil(Remove[A]);
FormOS.Refresh;
for C:=1 to FormOs.ComponentCount-1 do
begin
if Assigned(FormOs.Components[C]) then
begin
For D:=2 to 40 do if FormOS.Components[C].Name='Item'+IntToStr(D)then
begin
Item[D].Top:=((D-1)*21)+1;
Quant[D].Top:=((D-1)*21)+1;
Valunit[D].Top:=((D-1)*21)+1;
Desc[D].Top:=((D-1)*21)+1;
Val[D].Top:=((D-1)*21)+1;
Remove[D].Top:=((D-1)*21)+1;
end;
end;
end;
Break;
end;
end;
end; |
Sei que tem muita coisa desnecessaria nele, mas os outro que poupavam instruçoes desnecessarias nao pegavam nem mesmo no primeiro clique.
Por que isso acontece?? E por que no primeiro clique da tudo certo e no segundo, que deveria ser a mesma instruçao executada novamente, da errado?? |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Qua Jul 06, 2011 12:35 pm Assunto: |
|
|
imagine o seguinte:
B:=1 to FormOS.ComponentCount-1
se FormOS.ComponentCount = 10 vc irá de 1 a 9
certo?
só q se qdo vc tiver em 2 e destruir o componente referente a essa posição não vai ficar um "buraco" e sim o q era 3 vai passar a ser 2 e assin sucessivamente até o 9 vira 8.
com isso qdo vc chegar no 9 vai dar erro pq ele não existirá.
solução:
no lugar de
B:=1 to FormOS.ComponentCount-1
use
B:= FormOS.ComponentCount-1 downto 1
notou a diferença? |
|
Voltar ao Topo |
|
 |
GuilhermeAG Novato

Registrado: Quarta-Feira, 6 de Julho de 2011 Mensagens: 4
|
Enviada: Qua Jul 06, 2011 5:49 pm Assunto: |
|
|
gilsonnrodrigues escreveu: | imagine o seguinte:
B:=1 to FormOS.ComponentCount-1
se FormOS.ComponentCount = 10 vc irá de 1 a 9
certo?
só q se qdo vc tiver em 2 e destruir o componente referente a essa posição não vai ficar um "buraco" e sim o q era 3 vai passar a ser 2 e assin sucessivamente até o 9 vira 8.
com isso qdo vc chegar no 9 vai dar erro pq ele não existirá.
solução:
no lugar de
B:=1 to FormOS.ComponentCount-1
use
B:= FormOS.ComponentCount-1 downto 1
notou a diferença? |
Realmente notei gilson, porém ainda tenho problemas...
Agora posso clicar uma segunda vez em outro botao, soh que se clico no primeiro ou segundo botao, o erro aparece.
Alem disso um erro q nao mencionei acima é que após o primeiro clique, os outros itens nao sobem 20 top acima e fica um buraco até q eu adicione uma nova linha de itens no lugar da retirada.
Se clico no ultimo botao existente também ocorre erro como se clicasse no primeiro ou segundo.
Se clico por exemplo no terceito botao, eh removido perfeitamente, mas depois clico no quarto, aparece o erro.
Se clico por exemplo no terceito e no quinto nao aparece erro porem os itens nao sobem para ocupar o espaço vago...
Alguma outra soluçao? |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Qui Jul 07, 2011 5:37 pm Assunto: |
|
|
como ficou agora? |
|
Voltar ao Topo |
|
 |
GuilhermeAG Novato

Registrado: Quarta-Feira, 6 de Julho de 2011 Mensagens: 4
|
Enviada: Qui Jul 07, 2011 5:43 pm Assunto: |
|
|
Agora, dependendo do botao que clico recebo o erro 'Abstract Error'.
Vou bolar uma criaçao de componentes atraves de clone e exclusão através de nome, para ver se consigo acabar com os erros.
o mais estranho nesses erros é que nao obedecem a uma ordem, posso clicar em dois botoes e tudo correr perfeitamente, mas no primeiro clique pode dar erro e fechar tudo... |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Qui Jul 07, 2011 5:46 pm Assunto: |
|
|
não tem nada a ver com o problema inicial |
|
Voltar ao Topo |
|
 |
GuilhermeAG Novato

Registrado: Quarta-Feira, 6 de Julho de 2011 Mensagens: 4
|
Enviada: Qui Jul 07, 2011 5:48 pm Assunto: |
|
|
Gilson, obrigado pela preocupaçao e tentativa de ajudar, mas vou pedir que fechem este tópico pois ja estou bolando outro modo de criaçao e remoçao de componentes para acabar com esses erros.
Obrigado. |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|