Ir para conteúdo
  • Cadastre-se

Limitar lista de valores inteiros


Ver Solução Respondido por Daniel - PiraByte,
  • Este tópico foi criado há 236 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membro Pro Verificado
Postado

Olá a todos,

Com o uso de Enums nós conseguimos um melhor controle do valores que podem ser usados em propriedades, por exemplo na unit ACBrDFe.Conversao:

type
  TCSTIBSCBS = (cstNenhum,
    cst000, cst010, cst011, cst200, cst210, cst220, cst221, cst222, cst400,
    cst410, cst510, cst550, cst620, cst800, cst810, cst820, cst830);

Na propriedade IBSCBS só vou poder usar esses valores, que serão convertidos para String pela função abaixo:

function CSTIBSCBSToStr(const t: TCSTIBSCBS): string;

Quero usar a mesma lógica, mas com valores inteiros. Por exemplo, tenho a propriedade "CancelCodeId" do tipo inteiro que só pode receber os valores inteiros [501, 502, 503, 504, 505, 506, 507, 508, 509, 511, 512, 513]. Quero criar um tipo TCancelCodeId que só conheça esses valores, consequentemente a propriedade que for desse tipo só aceitará esses valores, exatamente como é feito com a técnica do Enum citada acima.

Como vocês fariam nesse caso? Deu uma pesquisada aqui nos códigos do ACBr, mas não a princípio não achei nada. 

  • Moderadores
Postado
47 minutos atrás, bnobre disse:

Olá a todos,

Com o uso de Enums nós conseguimos um melhor controle do valores que podem ser usados em propriedades, por exemplo na unit ACBrDFe.Conversao:

type
  TCSTIBSCBS = (cstNenhum,
    cst000, cst010, cst011, cst200, cst210, cst220, cst221, cst222, cst400,
    cst410, cst510, cst550, cst620, cst800, cst810, cst820, cst830);

Na propriedade IBSCBS só vou poder usar esses valores, que serão convertidos para String pela função abaixo:

function CSTIBSCBSToStr(const t: TCSTIBSCBS): string;

Quero usar a mesma lógica, mas com valores inteiros. Por exemplo, tenho a propriedade "CancelCodeId" do tipo inteiro que só pode receber os valores inteiros [501, 502, 503, 504, 505, 506, 507, 508, 509, 511, 512, 513]. Quero criar um tipo TCancelCodeId que só conheça esses valores, consequentemente a propriedade que for desse tipo só aceitará esses valores, exatamente como é feito com a técnica do Enum citada acima.

Como vocês fariam nesse caso? Deu uma pesquisada aqui nos códigos do ACBr, mas não a princípio não achei nada. 

ve se isso te ajuda:

Type
TCancelCodeId = (tcc501, tcc502, tcc503, tcc504, tcc505, tcc506, tcc507, tcc508, tcc509, tcc511, tcc512, tcc513);

Const
TCancelCodeIdToInt: Array[TCancelCodeId] Of integer = (501, 502, 503, 504, 505, 506, 507, 508, 509, 511, 512, 513);

...
var
CancelCodeId:TCancelCodeId;
CancelCodeINT:Integer;
Begin

 //passando valor por variavel
  CancelCodeId:= tcc504;
  CancelCodeINT := TCancelCodeIdToInt[CancelCodeId];
  ShowMessage(CancelCodeINT.ToString);
  // lendo cada valor por unum
  ShowMessage(TCancelCodeIdToInt[tcc502].ToString);
  ShowMessage(TCancelCodeIdToInt[tcc503].ToString);
  ShowMessage(TCancelCodeIdToInt[tcc504].ToString);
  ShowMessage(TCancelCodeIdToInt[tcc505].ToString); 
  ...  
End; 

 

  • Membro Pro Verificado
Postado
1 hora atrás, datilas disse:

ve se isso te ajuda:

Type
TCancelCodeId = (tcc501, tcc502, tcc503, tcc504, tcc505, tcc506, tcc507, tcc508, tcc509, tcc511, tcc512, tcc513);

Const
TCancelCodeIdToInt: Array[TCancelCodeId] Of integer = (501, 502, 503, 504, 505, 506, 507, 508, 509, 511, 512, 513);

...
var
CancelCodeId:TCancelCodeId;
CancelCodeINT:Integer;
Begin

 //passando valor por variavel
  CancelCodeId:= tcc504;
  CancelCodeINT := TCancelCodeIdToInt[CancelCodeId];
  ShowMessage(CancelCodeINT.ToString);
  // lendo cada valor por unum
  ShowMessage(TCancelCodeIdToInt[tcc502].ToString);
  ShowMessage(TCancelCodeIdToInt[tcc503].ToString);
  ShowMessage(TCancelCodeIdToInt[tcc504].ToString);
  ShowMessage(TCancelCodeIdToInt[tcc505].ToString); 
  ...  
End; 

 

Oi meu amigo... Tudo bom?

Eu tinha pensado nisso, mas na verdade queria saber se tinha algo mais direto...

Como na criação do Enum informamos valores textuais que representam números, temos que converter os mesmos para String, como eu tinha mostrado nos exemplos do ACBr.

function CSTIBSCBSToStr(const t: TCSTIBSCBS): string;

Mas como nesse caso que eu citei os valores já são inteiros fixos, queria saber se tinha alguma técnica mais reduzida, onde eu não precisasse criar um Enum e depois um Array representando esse Enum, como no teu exemplo.

Postado
3 horas atrás, bnobre disse:

Olá a todos,

Com o uso de Enums nós conseguimos um melhor controle do valores que podem ser usados em propriedades, por exemplo na unit ACBrDFe.Conversao:

type
  TCSTIBSCBS = (cstNenhum,
    cst000, cst010, cst011, cst200, cst210, cst220, cst221, cst222, cst400,
    cst410, cst510, cst550, cst620, cst800, cst810, cst820, cst830);

Na propriedade IBSCBS só vou poder usar esses valores, que serão convertidos para String pela função abaixo:

function CSTIBSCBSToStr(const t: TCSTIBSCBS): string;

Quero usar a mesma lógica, mas com valores inteiros. Por exemplo, tenho a propriedade "CancelCodeId" do tipo inteiro que só pode receber os valores inteiros [501, 502, 503, 504, 505, 506, 507, 508, 509, 511, 512, 513]. Quero criar um tipo TCancelCodeId que só conheça esses valores, consequentemente a propriedade que for desse tipo só aceitará esses valores, exatamente como é feito com a técnica do Enum citada acima.

Como vocês fariam nesse caso? Deu uma pesquisada aqui nos códigos do ACBr, mas não a princípio não achei nada. 

Se você quer um tipo que aceita valores inteiros, mas apenas um "range", pode tentar dessa forma: 

TCancelCodeId = 501..513;

 

  • Membro Pro Verificado
Postado
8 minutos atrás, Daniel - PiraByte disse:

Se você quer um tipo que aceita valores inteiros, mas apenas um "range", pode tentar dessa forma: 

TCancelCodeId = 501..513;

 

Oi meu amigo... Também pensei nisso... Na verdade essa seria a solução ideal, porém tem um PEQUENO grande detalhe... Existem dois ranges:

501..509 e 511..513

Não consegui escrever com 2 ranges. O compilador não aceita.

  • Solution
Postado
18 minutos atrás, bnobre disse:

Oi meu amigo... Também pensei nisso... Na verdade essa seria a solução ideal, porém tem um PEQUENO grande detalhe... Existem dois ranges:

501..509 e 511..513

Não consegui escrever com 2 ranges. O compilador não aceita.

Não me atentei que havia a quebra no 509 e pulava o 510.

 

Type
  TCancelCode = (tcc501 = 501,
            tcc502 = 502,
            tcc503 = 503,
            tcc504 = 504,
            tcc505 = 505,
            tcc506 = 506,
            tcc507 = 507,
            tcc508 = 508,
            tcc509 = 509,
            tcc511 = 511,
            tcc512 = 512,
            tcc513 = 513);

...
var
  ValorInteiro: Integer;
  TC: TCancelCode;
begin
  TC := tcc501;

  ValorInteiro := Ord(TC);	
end;

Não sei exatamente o que precisa, mas essa é uma outra forma, ainda seria possível atribuir um valor incorreto a TC, usando por exemplo TC := TCancelCode(510);
Mas dependendo do que está buscando pode ser uma alternativa

  • Obrigado 1
  • Este tópico foi criado há 236 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.