GARANTIR DESCONTO

Fórum Criar e destruir objetos #202374

21/12/2003

0

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

Responder

Posts

21/12/2003

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

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; 



Responder

Gostei + 0

21/12/2003

Danielclubedelphi

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


Responder

Gostei + 0

21/12/2003

Beppe

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


Responder

Gostei + 0

21/12/2003

Edilcimar

form.release


Responder

Gostei + 0

22/12/2003

Danielclubedelphi

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.


Responder

Gostei + 0

22/12/2003

Tnaires

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.


Responder

Gostei + 0

22/12/2003

Beppe

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:


Responder

Gostei + 0

23/12/2003

Danielclubedelphi

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


Responder

Gostei + 0

23/12/2003

Raserafim

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


Responder

Gostei + 0

23/12/2003

Andersonbox

// 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!


Responder

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.


Responder

Gostei + 0

23/12/2003

Andersonbox

Nao!


Responder

Gostei + 0

23/12/2003

Beppe

Nao!

Não o quê? :?


Responder

Gostei + 0

24/12/2003

Danielclubedelphi

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


Responder

Gostei + 0

24/12/2003

Danielclubedelphi

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;


Responder

Gostei + 0

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

Aceitar