Fórum Novo tipo de dados e array #258127
12/11/2004
0
Eu gostari de saber como faço pra criar um novo tipo de dados, composto por:
nome - tipo ____________________ codigo - integer nome - string valor - currency quantidade - double
E depois criar um array de 1000 posiçoes do tipo definido acima.
Será que alguem pode me explicar?
Agradeço antecipadamente.
Flaviosan
Curtir tópico
+ 0Posts
12/11/2004
Flaviosan
Gostei + 0
12/11/2004
Eniorm
TNome = record
codigo : integer;
nome : string;
valor : currency;
quantidade : double;
end;
(...)
var
nomes : array[0..1000] of TNome; // criar o vetor de 1000 posições
// ou para declarar apenas uma variavel:
nome : TNome;
Gostei + 0
12/11/2004
Flaviosan
Outra coisa pra liberar o array da memoria (digo limpar ele) eu posso usar a função freeandnil()?
Gostei + 0
12/11/2004
Eniorm
Cara eu troquei as bolas, acho q é isso mesmo :?
ehehe to confuso agora vo precisar testar com um array q eu criei esses dias de 3 posições, defini [0..3] acho q ele tem 4 posições eheh
Nunca testei usar o FreeAndNil :lol:
Bye
Gostei + 0
12/11/2004
Massuda
Tenho quase certeza que não... FreeAndNil só pode ser usada para [b:e66ebc94a0]objetos[/b:e66ebc94a0]. Internamente, ela assume que o argumento passado para ela é um derivado de TObject... não seria uma boa idéia passar para ela um ponteiro qualquer.
No seu caso, o array não é um objeto derivado de TObject. Portanto, FreeAndNil não pode ser usada.
Você pode alocar memória para seu array de modo estático ou dinâmico.
No primeiro caso, você simplesmente declara seu array como sendo um var ou const e não precisa se preocupar em liberar a memória.
No caso de array dinâmicos, simplesmente atribua nil ao array, como nesse exemplo:
type TNome = record codigo : integer; nome : string; valor : currency; quantidade : double; end; var Nomes: array of TNome // ... begin // em algum lugar você aloca o array antes de usa-lo SetLength(Nomes, 1000); // 1000 nomes do seu exemplo // para usar, o índice vai de 0 a 999 // para liberar a memória do array Nomes := nil;
Gostei + 0
12/11/2004
Gurc
Complementando, o FreeAndNil é muito útil para objetos pois previne diversos problemas. O procedimento Free apenas checa se o objeto está com o ponteiro = nil, se não estiver, ele libera a memória. O FreeAndNil executa o Free e ainda seta o ponteiro para nil. Se dermos Free em um objeto não existente na memória, ou seja, em um ponteiro apontando para uma região não disponível na memória receberemos um Access Violation.
Tentem usar FreeAndNil em vez de Free ou, pior ainda, Destroy diretamente.
Um abraço,
Gustavo Royer Chaurais
Gostei + 0
12/11/2004
Eniorm
Extado! antes eu liberava os forms assim:
form1.Release;
form1 := Nil;
depois adotei o FreeAndNil(form1) ehehehe
Gostei + 0
12/11/2004
Marcelo Saviski
Finalize(Vetor);
Nunca testei
Gostei + 0
12/11/2004
Gurc
Finalize(Vetor);
Nunca testei[/quote:498cfad496]
Certo, existe também o Finalize, o Dispose... mas esses são pra liberação de áreas alocadas dinamicamente via código sem muita interferência do Delphi. O Finalize é usado em lugares em que não podemos usar o Dispose. Para aplicações ´normais´ não é muito aconselhável não, a não ser que você vá manipular dados diretamente na memória.
Espero ter ajudado um pouco.
Gustavo Royer Chaurais
Gostei + 0
12/11/2004
Massuda
Só uma ressalva...
Pelo que percebi no meu dia a dia, no caso de [b:5587678932]records que contenham strings, variantes e/ou interfaces[/b:5587678932] você deveria usar Finalize() ao terminar de utilizar o record.
Nessa situação, o Finalize() se encarrega de liberar a memória utilizada pelas strings, variantes e/ou interfaces. Se o record foi alocado dinamicamente, cabe a você liberar a memória utilizada pelo record.
Gostei + 0
12/11/2004
Gurc
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)