Fórum Objetos em Runtime #60933

09/10/2009

0

Olá, estou desenvolvendo uma tela onde alguns componentes são criados em tempo de execução, faço uma pesquisa no banco e ele cria os componentes em cima disso, para criar é facil o dificil é destruir, sempre da erro de ´list index of bounds´.

Função para criar:
var
OText :tStaticText;
begin
OText := TStaticText.create(Self);
OText.Parent := pnFundoOcupacao;
OText.Name := ´StaticText´+inttostr(vrText);
OText.Caption :=nomePanel+´´;
OText.Left := x;
OText.Top := y;
OText.BevelKind :=bkFlat;
OText.BevelOuter :=bvRaised;
OText.Font.Color :=clWhite;
OText.Font.Name :=´Verdana´;
OText.Font.Style :=[fsBold];
OText.ShowHint :=true;
OText.Hint :=vrHint;
end;

Para destruir:
var
i: integer;
begin
for i := 0 to ComponentCount-1 do
begin
if Components[i] is TStaticText then
TStaticText(Components[i]).Free;
end;


Como resolver? Sem dar erro?


Juniorprog

Juniorprog

Responder

Posts

09/10/2009

Afarias

Isto não tem nada a ver com Firebird ou Interbase, este tipo de questão deve ser postada em DELPHI.

Bom, 2 coisas:

1) qualquer TComponent não precisa ser destruído uma vez q vc associa a ele um OWNER. Ao destruir o OWNER, este se encarrega de destruir todos os ´Components´ associados. Ex, quando vc faz:

OText := TStaticText.create(Self);

Self (o form) é o OWNER q ao ser destruído irá destruir este componente TStaticText.


2) Caso vc realmente precise destruir na mão, basta mudar um pequeno detalhe no seu código:

for i := ComponentCount-1 [b:e1bdc8ac82]downto[/b:e1bdc8ac82] 0 do

vc deve contar de ´trás pra frente´ pq toda vez q o loop destroi um dos componentes então Count-1 é menor fazendo com q em algum momento seu código tente acessar um item (i) q não existe mais (maior q count-1).


T+


Responder

Gostei + 0

10/10/2009

Juniorprog

Isto não tem nada a ver com Firebird ou Interbase, este tipo de questão deve ser postada em DELPHI. Bom, 2 coisas: 1) qualquer TComponent não precisa ser destruído uma vez q vc associa a ele um OWNER. Ao destruir o OWNER, este se encarrega de destruir todos os ´Components´ associados. Ex, quando vc faz: OText := TStaticText.create(Self); Self (o form) é o OWNER q ao ser destruído irá destruir este componente TStaticText. 2) Caso vc realmente precise destruir na mão, basta mudar um pequeno detalhe no seu código: for i := ComponentCount-1 [b:8c8c6da506]downto[/b:8c8c6da506] 0 do vc deve contar de ´trás pra frente´ pq toda vez q o loop destroi um dos componentes então Count-1 é menor fazendo com q em algum momento seu código tente acessar um item (i) q não existe mais (maior q count-1). T+


Afarias, desculpa por postar no firebird/interbase, realmente não me atentei a esse item, quando voltar terça feira ao trabalho teste e coloco o resultado, desde já obrigado.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar