Criar e destruir objetos

Delphi

21/12/2003

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 ???


Danielclubedelphi

Danielclubedelphi

Curtidas 0

Respostas

Beppe

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

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´.


GOSTEI 0
Beppe

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

Edilcimar

21/12/2003

form.release


GOSTEI 0
Danielclubedelphi

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.


GOSTEI 0
Tnaires

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:
  objeto.Free;
  objeto := nil;

Espero ter ajudado, sucesso.


GOSTEI 0
Beppe

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

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...


GOSTEI 0
Raserafim

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


GOSTEI 0
Andersonbox

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!


GOSTEI 0
Beppe

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

Andersonbox

21/12/2003

Nao!


GOSTEI 0
Beppe

Beppe

21/12/2003

Nao!

Não o quê? :?


GOSTEI 0
Danielclubedelphi

Danielclubedelphi

21/12/2003

Tentei do beep e naum deu certo... agora vou tentar do andersonbox...
mas NAUM O Q ?


GOSTEI 0
Danielclubedelphi

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;


GOSTEI 0
Danielclubedelphi

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.


GOSTEI 0
Beppe

Beppe

21/12/2003

Por que você usa o Forms Designer do Delphi? Ele faz certinho, sem maiores complicações...


GOSTEI 0
Pain_elemental

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;


GOSTEI 0
Tnaires

Tnaires

21/12/2003

Ei pain elemental, vc é fã de Doom?
Cara eu sou fissurado, tenho em casa todas as versões.
Abraços


GOSTEI 0
Danielclubedelphi

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


GOSTEI 0
Marco Salles

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´


GOSTEI 0
Beppe

Beppe

21/12/2003

[quote=´Marco Salles´]
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

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... :)


Á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

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

Andersonbox

21/12/2003

´Não´ precisa um OnClose assim.


GOSTEI 0
POSTAR