Jump to content

Assista click.png tectoy.png

C6 chamada_c6.png botao.png

Valor "ok" em funções do pcnConversao


Go to solution Solved by BigWings,
  • Este tópico foi criado há 1474 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro

Olá a todos,

Há tempos eu uso alguns comandos que funcionam muito bem, por exemplo:

Citar

 

Ambiente   := StrToTpAmb(ok, IntToStr(rgTipoAmb.ItemIndex+1));

ACBrNFe1.DANFE.TipoDANFE  := StrToTpImp(ok, IntToStr(rgTipoDanfe.ItemIndex+1));

Transp.modFrete := StrTomodFrete(ok, z_nfetransp_modfrete.AsString);

Ide.indPres   := StrToPresencaComprador(ok, z_nfeide_indpres.AsString);

 

Observem que em comum eu informo a palavra ok como valor no primeiro parâmetro de todas as funções e então no segundo parâmetro informo o valor que realmente me interessa.

Funciona normalmente, mas eu só uso a palavra ok pois copiei do exemplo no ACBrNFe_demo, coloquei e deu certo... Não sei a lógica disso e gostaria de entender.

Porque é necessário colocar esse valor ok como primeiro parâmetro?

Desde já agradeço a atenção de todos

Link to comment
Share on other sites

  • Moderadores
1 hora atrás, doidopb disse:

Porque é necessário colocar esse valor ok como primeiro parâmetro?

Ela retorna True caso o valor string informado tenha sido encontrado no enumerado.

Caso a string não seja encontrada o retorno do método será um valor padrão (o primeiro índice do enumerado), e a variável ok retornará False.

Veja a implementação:

function StrToEnumerado(out ok: boolean; const s: string; const AString:
  array of string; const AEnumerados: array of variant): variant;
var
  i: integer;
begin
  result := -1;
  for i := Low(AString) to High(AString) do
    if AnsiSameText(s, AString[i]) then
      result := AEnumerados[i];
  ok := result <> -1;
  if not ok then
    result := AEnumerados[0];
end;

Exemplo:

var
  mod: TpcnModeloDF;
  ok: Boolean;
begin
  mod := StrToModeloDF(ok, '55');
  // mod = moNFe, ok = True
  mod := StrToModeloDF(ok, '65');
  // mod = moNFCe, ok = True
  mod := StrToModeloDF(ok, '57');
  // mod = moNFe, ok = False

 

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link to comment
Share on other sites

  • Membros Pro

Olá BigWings, tudo bom?

Obrigado pelo esclarecimento.

Com sua explicação eu entendi a lógica do código, mas sinceramente não entendi "o porque" de ter que escrever sempre a mesma palavra ok no primeiro parâmetro para que tudo isso que me explicou aconteça, tecnicamente falando.

Todas as funções que crio recebem parâmetros variáveis, por isso me causou estranheza esse parâmetro receber sempre o mesmo valor (a palavra ok). É algo novo pra mim e me chamou a atenção. Porque criar um parâmetro que sempre receberá o mesmo valor???

Postei aqui nessa seção do fórum inicialmente pelo fato de ter tomado conhecimento de tais funções no ACBrNFe_demo, mas vejo que minha dúvida é mais de programação do que relacionada ao componente, portanto se achar devido peço que mova meu tópico.

Desde já agradeço sua atenção.

 

 

Link to comment
Share on other sites

  • Membros Pro
12 minutos atrás, André Ferreira de Moraes disse:

Não é uma palavra é uma variável do tipo Boolean que vc passa por referência. 

Oi André... Tudo bom?

Perfeito, mas como pode reparar eu não escrevo nem True e nem False, eu escrevo "ok".

 

Link to comment
Share on other sites

  • Moderadores
25 minutos atrás, doidopb disse:

Perfeito, mas como pode reparar eu não escrevo nem True e nem False, eu escrevo "ok".

A variável não precisa se chamar "ok", você pode dar o nome que quiser.

var
  deuCerto: Boolean;
  mod: TpcnModeloDF;
begin
  mod := StrToModeloDF(deuCerto, edtModelo.Text);
  if not deuCerto then
    ShowMessage('Modelo informado é inválido!');

Não pode passar True ou False porque no parâmetro do método tem o operador out que exige a passagem por referência, como o André explicou.

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link to comment
Share on other sites

  • Moderadores
2 horas atrás, doidopb disse:

Oi André... Tudo bom?

Perfeito, mas como pode reparar eu não escrevo nem True e nem False, eu escrevo "ok".

 

A função não espera TRUE or FALSE, ela espera uma variável do tipo boolean q irá permitir que vc confira se o valor foi convertido corretamente igual citado pelo @BigWings

djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.lambretinha.com.br
Link to comment
Share on other sites

  • Membros Pro

Agradeço a ambos suas explicações , realmente eu não me recordava sobre os tipos de passagens de parâmetros, a quem interessar:

http://blog.tecsystem.com.br/index.php/boas-praticas-de-programacao-em-delphi-2-parametros-de-metodos/

Só AGORA eu observei que nessa procedure do GerarNFe, onde uso as funções citadas no início do tópico, existe uma variável  Boolean chamada ok... E realmente ela é usada na passagem de referência. Eu não tinha observado a presença dela no código.

procedure GerarNFe(NumNFe : String);
var
  ok:Boolean;
  MeminfCpl, MeminfAdFisco:String;
begin
  with ACBrNFe1.NotasFiscais.Add.NFe do
   begin
		...
		Ide.indPres   := StrToPresencaComprador(ok, z_nfeide_indpres.AsString);
		...
   end

Pois bem... Esclarecido o que significa passagem por referência e localizado a variável ok em minha procedure, surgiu só mais uma dúvida:

  • Porque optaram em usar o out ok nessas funções citadas do pcnConversao? Por tudo que li eu suponho que o objetivo foi de permitir algum tratamento posterior no caso do valor não ter sido achado (ok = False), estou correto?
Edited by doidopb
Link to comment
Share on other sites

  • Moderadores
  • Solution
13 minutos atrás, doidopb disse:

Pois bem... Esclarecido o que significa passagem por referência e localizado a variável ok em minha procedure, surgiu só mais uma dúvida:

  • Porque optaram em usar o out ok nessas funções citadas do pcnConversao? Por tudo que li eu suponho que o objetivo foi de permitir algum tratamento posterior no caso do valor não ter sido achado (ok = False), estou correto?

Exato, como não é possível retornar um valor nil para um tipo enumerado, a única forma de saber se o método está retornando um valor confiável é testando a variável ok.

Teste sempre que tiver dúvida se o parâmetro string de entrada pode não estar na lista, como no meu exemplo acima.

  • Like 1
Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link to comment
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.