Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Guiodai

Runtime Error 216

Recommended Posts

Olá, amigos.Recentemente comecei a receber um erro em tempo de execução no programa que estou desenvolvendo. O erro não acontece sempre e eu não consegui identificar em que trecho do código ele ocorre. O código do erro 216. O que este código significa e o que pode estar causando ele? Desde já, obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloca aqui o trecho do código em que é levantada essa Exceção e também o que você faz no programa que gera esse erro....

Não identifiquei em que parte do programa acontece o erro. O erro acontece depois que um form é exibido. Esse form exibe um TChart. O gráfico exibe coordenadas (x,y) que estão armazenadas em um arquivo XML. Vou mostrar o trecho do código que faz essa chamada.
procedure TFormMain.Coordenogramacompleto1Click(Sender: TObject);var  tensaoAnterior: real;  index, idxCor: integer;  linhaTemp: TCabo;  barraTemp: TBarra;  cores: array of Integer;begin  SetLength(cores, 10);  cores[0] := clBlue;  cores[1] := clGreen;  cores[2] := clRed;  cores[3] := clMaroon;  cores[4] := clOlive;  cores[5] := clPurple;  cores[6] := clNavy;  cores[7] := clTeal;  cores[8] := clFuchsia;  cores[9] := clActiveCaption;  cores[10] := clGray;  DlgConfigCoordenograma.LabeledEditIcc.Text := FloatToStr(protecaoClicada.BarraAssociada.CurtoCircuito);  DlgConfigCoordenograma.ShowModal;  if ConfigCoordenogramaOk then  begin    Icc := StrToFloat(DlgConfigCoordenograma.LabeledEditIcc.Text);    barraTemp := protecaoClicada.BarraAssociada;    tensaoAnterior := protecaoClicada.Tensao;    idxCor := 0;    while barraTemp <> Barra1 do    begin      for index := 0 to linhas.Count - 1 do      begin        linhaTemp := linhas.Items[index];        if linhaTemp.BarraDestino = barraTemp then          break;      end;      if linhaTemp.ProtecaoFase <> nil then      begin        protecaoClicada := linhaTemp.ProtecaoFase;        fatorConversao := tensaoAnterior / protecaoClicada.Tensao;        Coordenogramasimples(protecaoClicada, Icc, fatorConversao, 1, cores[idxCor]);        tensaoAnterior := protecaoClicada.Tensao;      end;      barraTemp := linhaTemp.BarraOrigem;      idxCor := idxCor + 1;      if idxCor = 11 then        idxCor := 0;    end;    FormCoordenograma.Show;  end;end;procedure TFormMain.Coordenogramasimples(prot: TProtecao; Icc, fc,  fe: real; cor: TColor);var  cabo: TCabo;  protNeutro: TProtecao;  codFase, codNeutro: integer;  nomeFase, nomeNeutro: string;  pkpFase, pkpNeutro: real;  index: integer;begin  for index := 0 to linhas.Count - 1 do  begin    cabo := linhas[index];    if cabo.ProtecaoFase = prot then      protNeutro := cabo.ProtecaoNeutro;  end;  codFase := prot.Codigo;  nomeFase := prot.Nome;  pkpFase := prot.CorrentePkp;  codNeutro := protNeutro.Codigo;  nomeNeutro := protNeutro.Nome;  pkpNeutro := protNeutro.CorrentePkp;  case prot.TipoProtecao of  tpFusivel:  begin    FormCoordenograma.PlotarCurvaPontos('dados\curvas_fusiveis.xml',      codFase, 'Corrente', 'Tempo', 'Min', 1, Icc*fc, fe,      FormCoordenograma.ChartFase, cor, nomeFase);    FormCoordenograma.PlotarCurvaPontos('dados\curvas_fusiveis.xml',      codFase, 'Corrente', 'Tempo', 'Max', 1, Icc*fc, fe,      FormCoordenograma.ChartFase, cor, nomeFase);    FormCoordenograma.Hachurar(FormCoordenograma.ChartFase,      FormCoordenograma.ChartFase.Series[FormCoordenograma.ChartFase.SeriesCount - 2],      FormCoordenograma.ChartFase.Series[FormCoordenograma.ChartFase.SeriesCount - 1], cor);    FormCoordenograma.PlotarCurvaPontos('dados\curvas_fusiveis.xml',      codNeutro, 'Corrente', 'Tempo', 'Min', 1, Icc*fc, fe,      FormCoordenograma.ChartNeutro, cor, nomeNeutro);    FormCoordenograma.PlotarCurvaPontos('dados\curvas_fusiveis.xml',      codNeutro, 'Corrente', 'Tempo', 'Max', 1, Icc*fc, fe,      FormCoordenograma.ChartNeutro, cor, nomeNeutro);    FormCoordenograma.Hachurar(FormCoordenograma.ChartNeutro,      FormCoordenograma.ChartNeutro.Series[FormCoordenograma.ChartNeutro.SeriesCount - 2],      FormCoordenograma.ChartNeutro.Series[FormCoordenograma.ChartNeutro.SeriesCount - 1], cor);  end;  tpReleEletromec:  begin    FormCoordenograma.PlotarCurvaPontos('dados\curvas_reles.xml',      codFase, 'Multiplo', 'Tempo', prot.DadosRele.Curva, pkpFase, Icc*fc, fe,      FormCoordenograma.ChartFase, cor,      nomeFase + ' (Curva ' + prot.DadosRele.Curva + ')');    FormCoordenograma.PlotarCurvaPontos('dados\curvas_reles.xml',      codNeutro, 'Multiplo', 'Tempo', protNeutro.DadosRele.Curva, pkpNeutro, Icc*fc, fe,      FormCoordenograma.ChartNeutro, cor,      nomeNeutro + ' (Curva ' + protNeutro.DadosRele.Curva + ')');  end;  tpReleNumerico:  begin    FormCoordenograma.PlotarCurvaReleNumerico(prot.DadosRele.NormaCurva,      prot.DadosRele.FamiliaCurva, prot.DadosRele.Curva,      pkpFase, Icc*fc, 1, FormCoordenograma.ChartFase, cor,      nomeFase + ' (Curva ' + prot.DadosRele.NormaCurva + ' ' +      prot.DadosRele.FamiliaCurva + ' ' + prot.DadosRele.Curva + ')');    FormCoordenograma.PlotarCurvaReleNumerico(protNeutro.DadosRele.NormaCurva,      protNeutro.DadosRele.FamiliaCurva, protNeutro.DadosRele.Curva,      pkpNeutro, Icc*fc, 1, FormCoordenograma.ChartNeutro, cor,      nomeFase + ' (Curva ' + protNeutro.DadosRele.NormaCurva + ' ' +      protNeutro.DadosRele.FamiliaCurva + ' ' + protNeutro.DadosRele.Curva + ')');  end;  tpReligador:  begin    FormCoordenograma.PlotarCurvaPontos('dados\curvas_religadores.xml',      codFase, 'Multiplo', 'Tempo', prot.DadosReligador.Curva, pkpFase, Icc*fc, fe,      FormCoordenograma.ChartFase, cor,      nomeFase + ' (Curva ' + prot.DadosReligador.Curva + ')');    case codFase of      3001..3003:      begin        FormCoordenograma.PlotarCurvaPontos('dados\curvas_religadores.xml',        codNeutro, 'Multiplo', 'Tempo', protNeutro.DadosReligador.Curva + ' Min', pkpNeutro, Icc*fc, fe,        FormCoordenograma.ChartNeutro, cor,        nomeNeutro + ' (Curva ' + protNeutro.DadosReligador.Curva + ')');        FormCoordenograma.PlotarCurvaPontos('dados\curvas_religadores.xml',        codNeutro, 'Multiplo', 'Tempo', protNeutro.DadosReligador.Curva + ' Max', pkpNeutro, Icc*fc, fe,        FormCoordenograma.ChartNeutro, cor,        nomeNeutro + ' (Curva ' + protNeutro.DadosReligador.Curva + ')');        FormCoordenograma.Hachurar(FormCoordenograma.ChartNeutro,          FormCoordenograma.ChartNeutro.Series[FormCoordenograma.ChartNeutro.SeriesCount - 2],          FormCoordenograma.ChartNeutro.Series[FormCoordenograma.ChartNeutro.SeriesCount - 1], cor);      end      else      begin        FormCoordenograma.PlotarCurvaPontos('dados\curvas_religadores.xml',        codNeutro, 'Multiplo', 'Tempo', protNeutro.DadosReligador.Curva, pkpNeutro, Icc*fc, fe,        FormCoordenograma.ChartNeutro, cor,        nomeNeutro + ' (Curva ' + protNeutro.DadosReligador.Curva + ')');      end;    end;  end;  else  end;end;
Esse programa serve para mostrar curvas de relés e fusíveis de proteção de sistemas elétricos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fera, coloca um breakpoint aew...debuga e ve em que linha da o erro...Após descobrir a linha em que a exceção é levantada posta ela aqui...colocando o code inteiro fica complicado ajudar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fera, coloca um breakpoint aew...debuga e ve em que linha da o erro...Após descobrir a linha em que a exceção é levantada posta ela aqui...colocando o code inteiro fica complicado ajudar...

O problema é que não consegui identificar onde o erro acontece. Já debuguei de tudo quanto é jeito mas o erro só acontece depois que o programa termina a operação!O que significa o erro 216?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia, e ai beleza?Seguinte, você tem certeza que seu programa ta dando erro por causa deste form? remove ele do seu project e roda pra ver se acontece o erro. Ta usando algum outro componente externo? Um Skin quem sabe. Na verdade este tipo de erro que nao acontece em tempo de execução é causado por algum componente que nao seja do delphi. Faz os teste aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia, e ai beleza?Seguinte, você tem certeza que seu programa ta dando erro por causa deste form? remove ele do seu project e roda pra ver se acontece o erro. Ta usando algum outro componente externo? Um Skin quem sabe. Na verdade este tipo de erro que nao acontece em tempo de execução é causado por algum componente que nao seja do delphi. Faz os teste aí.

Na verdade, eu criei alguns componentes visuais que são herdeiros da classe TShape. Eu crio várias instâncias destes componentes ao longo do programa! Pode ser isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você fez o destructor deles??

 

Está liberando-os da memória ao finalizar o sistema???

 

 

A mensagem desse erro Runtime Error 216 refere-se á:

General protection fault

e em minhas pesquisas pela net encontrei diversos casos com esse problema e o que acontecia era que as pessoas estavam liberando da memória diversas vezes o mesmo componente, sendo assim o mesmo levantava esse Runtime Error 216 dizendo que o Objeto já havia sido destruido..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.