Fórum Criar e destruir objetos #202374
21/12/2003
0
para criar e apresentar na tela, esta tudo numa boa, o problema é quando fecho o projeto que da alguns erros. Muito provavelmente é pq naum estou destruindo esses objetos. Aqui vai um exemplo da função.
var
FrmConfig: TForm;
pnlCampos: TPanel;
btnCampProx : TButton;
begin
FrmConfig := TForm.Create(Application);
pnlCampos := TPanel.Create(Application);
btnCampProx := TButton.Create(Application);
pnlCampos.Parent := FrmConfig;
btnCampProx.Parent := FrmConfig;
with FrmConfig do
begin
AutoSize := True;
end;
FrmConfig.InsertComponent(pnlCampos);
with pnlCampos do
begin
Caption := ´´;
Align := alClient;
end;
pnlCampos.InsertComponent(btnCampProx);
With btnCampProx do
begin
Caption := ´Próximo´;
Top := 335;
Left := 400;
end;
frmConfig.show;
end;
Não testei isso ai q acabei de escrever, mas a ideia é essa mesmo... o problema mesmo é quando destruo a aplicação aparecem algumas mensagens de erro sobre AccessViolation...
Como destruo esses componentes que criei ???
Danielclubedelphi
Curtir tópico
+ 0Posts
21/12/2003
Beppe
var FrmConfig: TForm; pnlCampos: TPanel; btnCampProx : TButton; begin FrmConfig := TForm.Create(Application); pnlCampos := TPanel.Create(FrmConfig); btnCampProx := TButton.Create(FrmConfig); with FrmConfig do begin AutoSize := True; end; with pnlCampos do begin Parent := FrmConfig; Caption := ´´; Align := alClient; end; With btnCampProx do begin Parent := pnlCampos; Caption := ´Próximo´; Top := 335; Left := 400; end; frmConfig.show; end;
Gostei + 0
21/12/2003
Danielclubedelphi
o erro acontece quando eu fecho o projeto. E o erro é Access Violation. Tb aparece uma msg(NAUM DE ERRO): ´Run Time Error 216 at 00403a8a´.
Gostei + 0
21/12/2003
Beppe
Gostei + 0
21/12/2003
Edilcimar
Gostei + 0
22/12/2003
Danielclubedelphi
a questao naum é se o codigo funciona ou naum. a pergunta é o que colocar depois do comando preview para que o formulario e seus componentes sejam destruidos.
Se vc puder olhar o codigo e falar o q adicionar ótimo, se olhar e falar o que mudar ótimo. O que naum ajuda muito é falar que tem algo errado.
Gostei + 0
22/12/2003
Tnaires
Eu realmente não sei o pq da mensagem. Concordo com vc qdo vc diz q pode ser pela falta de destruição, pois cada vez q o projeto é executado mais e mais objetos são criados, e os problemas de endereço acabam aparecendo... Mas isso não deve ser tomado como certo. Então, use o código seguinte para destruir os objetos q vc cria qdo não precisa mais deles:
objeto.Free; objeto := nil;
Espero ter ajudado, sucesso.
Gostei + 0
22/12/2003
Beppe
Após executar o Show, o código continua na próxima linha, não espera que se feche(ao contrário de ShowModal). Se é este o comportamento que quer, configure um manipulador para o OnClose do frmConfig. Lá dentro você coloca Action := caFree;
PS: eu posso parar de dizer que tem algo errado, então você fica com um programa bugado, como já tem, simples. :P :lol:
Gostei + 0
23/12/2003
Danielclubedelphi
Depois do comando preview ou previewmodal, todos os componetes que foram criados tem q ser destruidos.
Mas quando eu faço um destroy ou free da pau. Se naum der nenhum free ou destroy, acontece a mesma quantidade de erros que a quantidade de objetos criados;
Sera que naum é a propriedade Parent ? Se eu definir isso nos objetos, só acontece um unico erro, mas tb naum aparece nada...
Gostei + 0
23/12/2003
Raserafim
FrmConfig := TForm.Create(Application);
pnlCampos := TPanel.Create(Self);
btnCampProx := TButton.Create(Self);
pois os componentes TPanel e TButton, devem ser criados no form.
ass: Rodrigo
Gostei + 0
23/12/2003
Andersonbox
var
FrmConfig: TForm;
pnlCampos: TPanel;
btnCampProx : TButton;
i: Integer;
begin
// NOTA: Variável Integer para ser usado
// em um FOR.
-------------------------------------------------
-------------------------------------------------
Acrescente 2 (linha seguinte ao .Show):
FrmConfig.Show;
for i := FrmConfig.ComponentCount-1 downto 0 do begin
FrmConfig.Components[i].Free;
FrmConfig.Components[i] := Nil;
end;
// NOTA: Serão destruídos todos os componentes
// criados e inseridos para o FrmConfig.
FrmConfig.Release;
// NOTA: Será destruído o próprio FrmConfig.
-------------------------------------------------
-------------------------------------------------
É só disso que vc precisa!
Gostei + 0
23/12/2003
Beppe
var FrmConfig: TForm; pnlCampos: TPanel; btnCampProx : TButton; begin FrmConfig := TForm.Create(Application); pnlCampos := TPanel.Create(FrmConfig); btnCampProx := TButton.Create(FrmConfig); with FrmConfig do begin AutoSize := True; end; with pnlCampos do begin Parent := FrmConfig; Caption := ´´; Align := alClient; end; With btnCampProx do begin Parent := pnlCampos; Caption := ´Próximo´; Top := 335; Left := 400; end; try frmConfig.showModal; finally frmConfig.Free; end; end;
Não precisa um OnClose assim.
Gostei + 0
23/12/2003
Andersonbox
Gostei + 0
23/12/2003
Beppe
Não o quê? :?
Gostei + 0
24/12/2003
Danielclubedelphi
mas NAUM O Q ?
Gostei + 0
24/12/2003
Danielclubedelphi
Eu tentei usar as explicações do andersonbox e deu certo... Bom, mais ou menos. Na verdade eu consegui destrui os componentes criados mas os malditos erros continuaram.
Esse código q coloquei foi uma derivação do meu código real, já q ele busca variaveis e funções em outra unit. Como agora naum sei onde esta o erro, vou colocar o código da função aqui... Todo o código seria impossível. Ninguem vai conseguir compilar, mas da pra ter uma ideia... Tomara.
function TfrmCadaOrig.GeraRelatorio: Boolean;
var
Form : Tform;
qrRelatorio: TQuickRep;
qrTitulo: TQRLabel;
qrRotulo: TQRLabel;
qrCampo: TQRDBText;
li_Loop: integer;
li_PosicaoRotulo: integer;
li_PosicaoCampo: integer;
begin
if PegarDadosRelatorio = False then
begin
MessageDlg(´Arquivo de Configuração do Relatório está corrompido´, mtInformation, [mbOK], 0);
Exit;
end;
Form := TForm.Create(Application);
qrRelatorio := TQuickRep.Create(Application);
qrRelatorio.Parent := Form;
with qrRelatorio do
begin
DataSet := qryForm;
Frame.Color := clBlack;
Font.Color := clWindowText;
Font.Height := -13;
Font.Name := ´Arial´;
Options := [FirstPageHeader, LastPageFooter];
Page.Columns := 1;
Zoom := 100;
Bands.HasColumnHeader := True;
Bands.HasPageHeader := True;
Bands.HasDetail := True;
Bands.PageHeaderBand.Height := 30;
Bands.ColumnHeaderBand.Height := 30;
Bands.DetailBand.Height := 18
end;
qrTitulo := TQRLabel.Create(qrRelatorio);
with qrTitulo do
begin
Caption := us_Titulo;
Frame.Color := clBlack;
Alignment := taCenter;
AlignToBand := True;
AutoSize := True;
AutoStretch := True;
Font.Height := -19;
Font.Name := ´Arial´;
Font.Style := [fsBold];
Font.Size := 14;
end;
qrRelatorio.Bands.PageHeaderBand.InsertComponent(qrTitulo);
qrTitulo.Parent := qrRelatorio.Bands.PageHeaderBand;
li_Loop := 0;
li_PosicaoRotulo := 0;
for li_Loop := 0 to sltRotulos.Count - 1 do
begin
qrRotulo := TQRLabel.Create(qrRelatorio);
qrRelatorio.Bands.ColumnHeaderBand.InsertComponent(qrRotulo);
with qrRotulo do
begin
Caption := sltRotulos[li_Loop];
Font.Size := 12;
Font.Style := [fsBold];
Left := li_PosicaoRotulo;
Parent := qrRelatorio.Bands.ColumnHeaderBand;
end;
li_PosicaoRotulo := li_PosicaoRotulo + 5 + StrToInt(sltTamanhos[li_Loop]) * 8;
end;
li_PosicaoCampo := 6;
for li_Loop := 0 to sltCampos.Count - 1 do
begin
qrCampo := TQRDBText.Create(qrRelatorio);
qrRelatorio.Bands.DetailBand.InsertComponent(qrCampo);
with qrCampo do
begin
DataSet := qryForm;
DataField := sltCampos[li_Loop];
AutoSize := True;
AutoStretch := True;
Font.Size := 6;
Left := li_PosicaoCampo;
Parent := qrRelatorio.Bands.DetailBand;
end;
li_PosicaoCampo := li_PosicaoCampo + 5 + StrToInt(sltTamanhos[li_Loop]) * 8;
end;
if not qryForm.Active then
begin
qryForm.Open;
end;
qrRelatorio.PreviewModal;
li_Loop := 0;
for li_Loop := qrRelatorio.ComponentCount - 1 downto 0 do begin
qrRelatorio.Components[li_Loop].Free;
end;
Form.Release;
end;
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)