Erro ao Fechar Aplicação

Delphi

28/03/2011

Pessoal, estou com um problema com matrizes que ainda não consegui identificar o erro, é o seguinte:
tenho uma tabela com dois campos

Nome da Tabela: Mestre
Campos: QTDE_SEGMENTOS
               MEDIDA
 Minha intenção é criar um array dinâmico com n linhas e duas colunas, a quantidade de linhas é obtida pelo numero dos registros da tabela Mestre, e alimentado com um loop para se obter os valores dos registros. Coloquei um memo para ter certeza que a matriz está sendo alimentada. A aplicação funciona, mas quando é encerrada ela libera um erro fatal com a mensagem "RUNTIME ERROR 216 AT 0040342A", segue o código abaixo para vocês testarem

var
Linha : array of array of Integer;
NumRegistros, I : Integer;

begin

NumRegistros:=Form1.CDS_Mestre.RecordCount;
SetLength(Linha,NumRegistros,2);
Memo1.Clear;
I:=0;
CDS_Mestre.First;

while not CDS_Mestre.Eof do
  begin
  Linha[I,1]:=Form1.CDS_MestreQTDE_SEGMENTOS.AsInteger;
  Linha[I,2]:=Form1.CDS_MestreMEDIDA.AsInteger;
  memo1.Lines.Append(inttostr(Linha[I,2]));
  I:=I+1;
  CDS_Mestre.Next;
  end;

Agradeço qualquer ajuda.
Luis Neto

Luis Neto

Curtidas 0

Respostas

André Silveira

André Silveira

28/03/2011

Nessa parte ao invés de:
  Linha[I,1]:=Form1.CDS_MestreQTDE_SEGMENTOS.AsInteger;
  Linha[I,2]:=Form1.CDS_MestreMEDIDA.AsInteger;
  memo1.Lines.Append(inttostr(Linha[I,2]));
  I:=I+1;
  CDS_Mestre.Next;

não seria:
  Linha[I,0]:=Form1.CDS_MestreQTDE_SEGMENTOS.AsInteger;
  Linha[I,1]:=Form1.CDS_MestreMEDIDA.AsInteger;
  memo1.Lines.Append(inttostr(Linha[I,1]));
  I:=I+1;
  CDS_Mestre.Next;

Lembre-se de que nos vetores o primeiro item é o 0.
GOSTEI 0
Luis Neto

Luis Neto

28/03/2011

Acho que não, colega. Veja bem se eu consigo explicar. A variável I é atribuida o valor inicial 0, então no primeiro loop a matriz Linha[0,1], isto é, a linha 0 e coluna 1 recebe a QTDE_SEGMENTOS, e a Linha[0,2], linha 0 e coluna 2 recebe o valor da MEDIDA. e o loop segue até o fim do dataset. Não vejo erro aí.

I:=0;
CDS_Mestre.First;

while not CDS_Mestre.Eof do
  begin
  Linha[I,1]:=Form1.CDS_MestreQTDE_SEGMENTOS.AsInteger;
  Linha[I,2]:=Form1.CDS_MestreMEDIDA.AsInteger;

  memo1.Lines.Append(inttostr(Linha[I,2]));
  I:=I+1;
  CDS_Mestre.Next;
  end;

GOSTEI 0
André Silveira

André Silveira

28/03/2011

Rapaz fiz o teste aqui e deve começar os dois com o valor zero, ou seja:
Linha [0,0] e Linha[0,1] é o primeiro elemento da matriz.
Pois do jeito que você fez ele dá erro por estouro de memória, coloca do jeito que eu te falei e faz o teste.


GOSTEI 0
Luis Neto

Luis Neto

28/03/2011

Caraca, parceiro. Você está certíssimo, rs..rs..

Valeu, obrigado
GOSTEI 0
Luis Neto

Luis Neto

28/03/2011

Como é que se finaliza um post aqui no Fórum?
GOSTEI 0
POSTAR