Fórum Macro em delphi #142184
28/02/2003
0
var
i: Integer;
begin
for i := 0 to PrincipalForm.ComponentCount - 1 do
if PrincipalForm.Components[i] is TLabel then
TLabel(PrincipalForm.Components[i]).Caption := ´TESTANDO´;
end
Funcionou belezinha, mas agora preciso destruir esses objetos pq senão toda hora que o evento onshow do form rodar ele irá criar os campos.
Assim, no onclose estou usando:
procedure TfrmIncluir.FormClose(Sender: TObject; var Action: TCloseAction);
VAR i : integer;
begin
for i := 0 to FRMINCLUIR.ComponentCount - 1 do
BEGIN
if FRMINCLUIR.Components[i] is TDBEDIT then
begin
TDBEdit(FRMINCLUIR.Components[i]).free;
end;
END;
end;
Mas aparece a mensagem de erro :
Project LdsErp.exe raised exception class EListError with message ´List index out of bounds (112)´. Process stopped. Use Step or Run to continue.
Alguém pode me ajudar a resolver.
Desde já agradeço.
Doug_chagas
Curtir tópico
+ 0Posts
28/02/2003
Marcelo Saviski
for i := 0 to FRMINCLUIR.ComponentCount - 1 do BEGIN if FRMINCLUIR.Components[i] is TDBEDIT then begin (FRMINCLUIR.Components[i] as TDBEdit).free; end; END;
Gostei + 0
28/02/2003
Doug_chagas
for i := 0 to FRMINCLUIR.ComponentCount - 1 do BEGIN if FRMINCLUIR.Components[i] is TDBEDIT then begin (FRMINCLUIR.Components[i] as TDBEdit).free; end; END;
Continua aparecendo o mesmo erro de out of bounds
Gostei + 0
28/02/2003
Carnette
Gostei + 0
28/02/2003
Marcelo Saviski
Gostei + 0
28/02/2003
Doug_chagas
To construindo os 2 tipos de objetos e tenho que destruir ambos. Mas na hora de dar Ctrl+c para o forum copiei a parte errada do fonte, mas acho que deu pra enterder.
Só não entendo, pq debugando ele passa pela instrução .free um monte de vezes sem dar erro e depois aparece o erro.
Achei que pudesse ser que ele tentava dar free em um i > component count, mas coloque componentcount -10 e mesmo assim não funcionou.
Valew
Gostei + 0
28/02/2003
Doug_chagas
Depende da tabela. Pq eu leio o nº de campos da tabela e crio dbedit pra cada campo.
+- uns 100
Gostei + 0
28/02/2003
Carnette
pq vc não chama o form em tempo de execução assim:
Application.ProcessMessages;
FormTal := TFormTal.Create(Self);
try
FormTal.showmodal;
finally
FormTal.Free;
end;
não sei se vc manja disso..mas, fica muito mais fácil..pois, toda vez que voce fecha o FormTal, todo é liberado...e começa do zero
Gostei + 0
28/02/2003
Doug_chagas
Gostei + 0
28/02/2003
Anonymous
no evento OnClose do formulário escreva assim:
se for Label:
TLabel(Form1.Controls[0]).Free;
se for Edit
TEdit(Form1.Controls[0]).Free;
você destruindo o componente ancestral, os herdeiros automaticamente são destruidos também!
Veja se funciona.
Mande uma respota, para mim saber, se resolveu também!
Até mais!
Gostei + 0
28/02/2003
Anonymous
é assim:
crie uma variável do tipo TWinControl;
exemplo:
var
cWControl: TWinControl;
begin
while cWControl.ControlCount > 0 do
cWControl.Controls[0].Free;
end;
Vê se funciona!
Gostei + 0
28/02/2003
Anonymous
Este exemplo destrói todos os componentes criados, mas se quiser excluir determinados componentes poderá colocar a verificação antes de destrui-lo.
for i := FRMINCLUIR.ComponentCount-1 dowto 0 do
Tcomponent(FRMINCLUIR.Components[i]).free;
Espero que o ajude.
Slater
compcker@ig.com.br
Gostei + 0
01/03/2003
Anonymous
procedure TfrmIncluir.FormClose(Sender: TObject; var Action: TCloseAction);
VAR i : integer;
begin
for i := 0 to FRMINCLUIR.ComponentCount - 1 do
BEGIN
if FRMINCLUIR.Components[i] is TDBEDIT then
begin
TDBEdit(FRMINCLUIR.Components[i]).free;
end;
END;
end;
Onde você põe FRMINCLUIR.ComponentCount - 1 vai dar erro num certo momento pois você pode ´estourar´ o intervalo.
Suponha que você tem 20 componenetes e vai apagar os últimos 10. Na primeira passagem, o [b:371aea6ca6]i[/b:371aea6ca6] vale 0, e assim por diante, até chegar na posição 10. A partir da posição 10 os itens serão apagados, mas o FRMINCLUIR.ComponentCount não sofrerá um refresh. Ou seja, na 16a. passagem, você tentará excluir o componente 16, mas no form existirão apenas 15. Para contornar esse problema, faça a contagem de trás pra frente. Assim:
procedure TfrmIncluir.FormClose(Sender: TObject; var Action: TCloseAction);
VAR i : integer;
begin
for i := FRMINCLUIR.ComponentCount-1 downto 0 do
BEGIN
if FRMINCLUIR.Components[i] is TDBEDIT then
begin
TDBEdit(FRMINCLUIR.Components[i]).free;
end;
END;
end;
Note bem a linha de cabeçalho do [b:371aea6ca6]for[/b:371aea6ca6], que sofreu a alteração para contar de trás pra frente. Utilize esse recurso sempre que o seu parâmetro de contagem puder ser eliminado.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)