Novo tipo de dados e array
Olá pessoal, tudo bem?
Eu gostari de saber como faço pra criar um novo tipo de dados, composto por:
E depois criar um array de 1000 posiçoes do tipo definido acima.
Será que alguem pode me explicar?
Agradeço antecipadamente.
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
Curtidas 0
Respostas
Flaviosan
12/11/2004
Dei uma pesquisada no forum e descobri que o que eu to querendo fazer é uma classe e não um tipo. Será que alguem pode me ajudar?
GOSTEI 0
Eniorm
12/11/2004
type
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;
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
Flaviosan
12/11/2004
Valew enio pela resposta. Me diz uma coisa, se o array deve ter 1000 posições e começa em 0, ele deve ser assim [0..999], certo?
Outra coisa pra liberar o array da memoria (digo limpar ele) eu posso usar a função freeandnil()?
Outra coisa pra liberar o array da memoria (digo limpar ele) eu posso usar a função freeandnil()?
GOSTEI 0
Eniorm
12/11/2004
se o array deve ter 1000 posições e começa em 0, ele deve ser assim [0..999], certo?
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
Outra coisa pra liberar o array da memoria (digo limpar ele) eu posso usar a função freeandnil()?
Nunca testei usar o FreeAndNil :lol:
Bye
GOSTEI 0
Massuda
12/11/2004
Outra coisa pra liberar o array da memoria (digo limpar ele) eu posso usar a função freeandnil()?
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
Gurc
12/11/2004
Outra coisa pra liberar o array da memoria (digo limpar ele) eu posso usar a função freeandnil()?
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
Eniorm
12/11/2004
O FreeAndNil executa o Free e ainda seta o ponteiro para nil.
Extado! antes eu liberava os forms assim:
form1.Release;
form1 := Nil;
depois adotei o FreeAndNil(form1) ehehehe
GOSTEI 0
Marcelo Saviski
12/11/2004
Não sei, mas acho que existe uma função que também pode ser usada:
Nunca testei
Finalize(Vetor);
Nunca testei
GOSTEI 0
Gurc
12/11/2004
[quote:498cfad496=´Marcelo Saviski´]Não sei, mas acho que existe uma função que também pode ser usada:
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
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
Massuda
12/11/2004
[...] 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.
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
Gurc
12/11/2004
Exato, é isso mesmo! Neste caso imagino Finalize melhor do que o Dispose, inlusive..
GOSTEI 0