ERRO ao apagar um elemento de um array
Bom dia, gente!
Estou precisando de ajuda para apagar elementos de um array. No caso, tenho:
T_dados = Record
dados: array of T_dados;
Encontrei um exemplo e tentei adapta-lo, mas aparece o seguinte erro e não estou sabendo como resolver.
[dcc32 Error] Unit1.pas(386): E2010 Incompatible types: ''''T_dados'''' and ''''Pointer''''
{
var
aux: integer;
begin
FreeandNil(T_dados(Form2.dados[linhaatual]));
T_dados(Form2.dados[linhaatual]):=nil; // o erro aparece aqui
Aux:=High(Form2.dados);
T_dados[linhaatual]:=Form2.dados[Aux];
SetLength(Form2.dados,High(Form2.dados));
end;
}
Muito obrigada, desde já!
Estou precisando de ajuda para apagar elementos de um array. No caso, tenho:
T_dados = Record
dados: array of T_dados;
Encontrei um exemplo e tentei adapta-lo, mas aparece o seguinte erro e não estou sabendo como resolver.
[dcc32 Error] Unit1.pas(386): E2010 Incompatible types: ''''T_dados'''' and ''''Pointer''''
{
var
aux: integer;
begin
FreeandNil(T_dados(Form2.dados[linhaatual]));
T_dados(Form2.dados[linhaatual]):=nil; // o erro aparece aqui
Aux:=High(Form2.dados);
T_dados[linhaatual]:=Form2.dados[Aux];
SetLength(Form2.dados,High(Form2.dados));
end;
}
Muito obrigada, desde já!
Letícia Rodrigues
Curtidas 0
Respostas
Hélio Devmedia
25/02/2019
Letícia, Olá novamente,
Trabalhar com Array não é bom, principalmente por causa da questão da manipulação de elementos. Hoje em dia o Delphi trabalha muito bem com listas, deixando o array apenas para elementos que não precisamos mexer mas precisamos acessá-los rapidamente.
Para apagar um elemento de um array, você basicamente tem que reorganizar os elementos para sobrar uma posição vazia e depois realizar um setLength-1.
Explicando melhor, veja o array abaixo
para apagar o elemento 50 por exemplo, você tem que fazer um while que jogue:
40 para a posição 5
30 para a posição 6
20 para a posição 7
10 para a posição 8
deixando a posição nove vazia e então dando um setLength(array, length(array)-1)
Olhando o seu código, percebi que você dá um FreeAndNil, porque seu array recebe objetos, porém, logo em seguida você passa nil para a posição do array. O erro ocorre exatamente aí porque FreeAndNil já aplica nil no item do array, e você está tentando executar pela segunda vez este procedimento...
Espero ter dado algum esclarecimento.
Sucesso no seu projeto e fique com Deus...
Trabalhar com Array não é bom, principalmente por causa da questão da manipulação de elementos. Hoje em dia o Delphi trabalha muito bem com listas, deixando o array apenas para elementos que não precisamos mexer mas precisamos acessá-los rapidamente.
Para apagar um elemento de um array, você basicamente tem que reorganizar os elementos para sobrar uma posição vazia e depois realizar um setLength-1.
Explicando melhor, veja o array abaixo
dado [ 90 , 80 , 70 , 60 , 50 , 40 , 30 , 20 , 10 ] posicao 1 2 3 4 5 6 7 8 9
para apagar o elemento 50 por exemplo, você tem que fazer um while que jogue:
40 para a posição 5
30 para a posição 6
20 para a posição 7
10 para a posição 8
deixando a posição nove vazia e então dando um setLength(array, length(array)-1)
Olhando o seu código, percebi que você dá um FreeAndNil, porque seu array recebe objetos, porém, logo em seguida você passa nil para a posição do array. O erro ocorre exatamente aí porque FreeAndNil já aplica nil no item do array, e você está tentando executar pela segunda vez este procedimento...
Espero ter dado algum esclarecimento.
Sucesso no seu projeto e fique com Deus...
GOSTEI 0