GARANTIR DESCONTO

Fórum Novo tipo de dados e array #258127

12/11/2004

0

Olá pessoal, tudo bem?
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

Flaviosan

Responder

Posts

12/11/2004

Flaviosan

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?


Responder

Gostei + 0

12/11/2004

Eniorm

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;


Responder

Gostei + 0

12/11/2004

Flaviosan

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()?


Responder

Gostei + 0

12/11/2004

Eniorm

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


Responder

Gostei + 0

12/11/2004

Massuda

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;



Responder

Gostei + 0

12/11/2004

Gurc

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


Responder

Gostei + 0

12/11/2004

Eniorm

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


Responder

Gostei + 0

12/11/2004

Marcelo Saviski

Não sei, mas acho que existe uma função que também pode ser usada:

Finalize(Vetor);


Nunca testei


Responder

Gostei + 0

12/11/2004

Gurc

[quote:498cfad496=´Marcelo Saviski´]Não sei, mas acho que existe uma função que também pode ser usada:

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


Responder

Gostei + 0

12/11/2004

Massuda

[...] 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.


Responder

Gostei + 0

12/11/2004

Gurc

Exato, é isso mesmo! Neste caso imagino Finalize melhor do que o Dispose, inlusive..


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar