Criar e destruir objetos
quero criar um form e alguns componentes dentro desse form.
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 ???
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
Curtidas 0
Respostas
Beppe
21/12/2003
AVs não acontecem porque você esqueceu de liberar um objeto. O problema com certeza é outra, e talvez até esteja nesse seu código aí.
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
Danielclubedelphi
21/12/2003
Mas esse código funciona linha por linha... mostra o Form e tudo.
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´.
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
Beppe
21/12/2003
Eu tenho certeza que seu código funciona. Mas tem uma diferença enorme entre código que funciona e código que funciona corretamente...
GOSTEI 0
Edilcimar
21/12/2003
form.release
GOSTEI 0
Danielclubedelphi
21/12/2003
Meu amigo Ataliba.
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.
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
Tnaires
21/12/2003
Opa daniel tudo jóia?
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:
Espero ter ajudado, sucesso.
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
Beppe
21/12/2003
Meu amigo Ataliba.
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.
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
Danielclubedelphi
21/12/2003
o comportamento que quero é o seguinte:
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...
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
Raserafim
21/12/2003
acho que no momento da criação deveria ser o seguinte:
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
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
Andersonbox
21/12/2003
// Acrescente 1 (na sessão var):
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!
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
Beppe
21/12/2003
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
Andersonbox
21/12/2003
Nao!
GOSTEI 0
Beppe
21/12/2003
Nao!
Não o quê? :?
GOSTEI 0
Danielclubedelphi
21/12/2003
Tentei do beep e naum deu certo... agora vou tentar do andersonbox...
mas NAUM O Q ?
mas NAUM O Q ?
GOSTEI 0
Danielclubedelphi
21/12/2003
Meu querido povo.
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;
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
Danielclubedelphi
21/12/2003
olha.. pra simplificar: Se eu usar esse código em um botao:
procedure TForm1.Button1Click(Sender: TObject);
var
Formulario: TForm;
Relatorio: TRLReport;
Titulo: TRLLabel;
begin
Formulario := TForm.Create(Application);
Relatorio := TRLReport.Create(Application);
Relatorio.Parent := Formulario as TForm;
Formulario.InsertComponent(Relatorio);
Relatorio.PreviewModal;
end;
quando fechar o form vai dar pau. Como resolver ?
OBS: To usando Fortes Report, portanto a RLReport deve ser declarada se alguem quiser compilar.
procedure TForm1.Button1Click(Sender: TObject);
var
Formulario: TForm;
Relatorio: TRLReport;
Titulo: TRLLabel;
begin
Formulario := TForm.Create(Application);
Relatorio := TRLReport.Create(Application);
Relatorio.Parent := Formulario as TForm;
Formulario.InsertComponent(Relatorio);
Relatorio.PreviewModal;
end;
quando fechar o form vai dar pau. Como resolver ?
OBS: To usando Fortes Report, portanto a RLReport deve ser declarada se alguem quiser compilar.
GOSTEI 0
Beppe
21/12/2003
Por que você usa o Forms Designer do Delphi? Ele faz certinho, sem maiores complicações...
GOSTEI 0
Pain_elemental
21/12/2003
Faça assim:
procedure TForm1.Button1Click(Sender: TObject);
var
Formulario: TForm;
Relatorio: TRLReport;
Titulo: TRLLabel;
begin
Formulario := TForm.Create(Nil);
Relatorio := TRLReport.Create(Formulario);
Relatorio.Parent := Formulario as TForm;
Relatorio.PreviewModal;
Formulario.Release
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Formulario: TForm;
Relatorio: TRLReport;
Titulo: TRLLabel;
begin
Formulario := TForm.Create(Nil);
Relatorio := TRLReport.Create(Formulario);
Relatorio.Parent := Formulario as TForm;
Relatorio.PreviewModal;
Formulario.Release
end;
GOSTEI 0
Tnaires
21/12/2003
Ei pain elemental, vc é fã de Doom?
Cara eu sou fissurado, tenho em casa todas as versões.
Abraços
Cara eu sou fissurado, tenho em casa todas as versões.
Abraços
GOSTEI 0
Danielclubedelphi
21/12/2003
Muito obrigado pela paciencia de vcs e aos q tentaram me ajduar principalmente.
obsevando o q pain_elemental tinha escrito, acabei por criar os componentes com Aowner = NIL e funcionou...
Valeu a todos
obsevando o q pain_elemental tinha escrito, acabei por criar os componentes com Aowner = NIL e funcionou...
Valeu a todos
GOSTEI 0
Marco Salles
21/12/2003
[quote=´Beppe´]AVs não acontecem porque você esqueceu de liberar um objeto. O problema com certeza é outra, e talvez até esteja nesse seu código aí.
Tudo Indica Que o Beep Tinha Razão.´De Fato Tinha Erro No Código´
Tudo Indica Que o Beep Tinha Razão.´De Fato Tinha Erro No Código´
GOSTEI 0
Beppe
21/12/2003
[quote=´Marco Salles´]
Será que é difícil acertar meu apelido? É B-E-P-P-E! :evil:
Mas tudo bem, até eu escrevi assim... :)
AVs não acontecem porque você esqueceu de liberar um objeto. O problema com certeza é outra, e talvez até esteja nesse seu código aí.
Tudo Indica Que o Beep Tinha Razão.´De Fato Tinha Erro No Código´
Será que é difícil acertar meu apelido? É B-E-P-P-E! :evil:
Mas tudo bem, até eu escrevi assim... :)
GOSTEI 0
Marco Salles
21/12/2003
Será que é difícil acertar meu apelido? É B-E-P-P-E! :evil:
Mas tudo bem, até eu escrevi assim... :)
Mas tudo bem, até eu escrevi assim... :)
Ás Vezes Erro Atê Meu Nome :lol: . Mas Vou Ficar Mais Atento. Beppe , Dê
Uma Olhada Ná Dúvida ´Instrução XOR, O Que Ela Faz´. Mas Preste Atenção, Devo Ter Datilografado Beep Ao Invés Do BEPPE. Mas Foi Antes
Deste Alerta.Vou Treinar Um Pouco.
BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,
BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,BEPPE,etc...
Acho Que Não Erro Mais ...
GOSTEI 0
Pain_elemental
21/12/2003
Ei pain elemental, vc é fã de Doom?
Cara eu sou fissurado, tenho em casa todas as versões.
Abraços
Eu tb, adoro o jogo. Ficou otimo o suporte a opengl q o Legacy Doom tem, e a rede pra jogar online q tem com o Doom Connector. Vale a pena dar uma olhada.
GOSTEI 0
Andersonbox
21/12/2003
´Não´ precisa um OnClose assim.
GOSTEI 0