Projeto MiniGui - Biblioteca visual para Harbour/xHarbour
18 Jun 2020 20:16
Olá pessoal.
Peço desculpas se já existir algo relacionado no fórum, mas não achei mesmo. Se houver peço por favor que deletem este tópico.
No meu caso uso Minigui e Harbour 3.2. Tem como definir um valor padrão para um parâmetro de uma função ?
No exemplo abaixo, caso o acceptZero não for passado na chamada, irá assumir true.
- Código:
METHOD ValidateVendedor(window, name, lblname, acceptZero = .T.)
...
RETURN .T.
Mas ao tentar compilar, recebo erro:
- Código:
d:\loja-windows\config\..\app\modules\class\JsysValidateFilterForm.prg(69) Error E0030 Syntax error "syntax error at '='"
Então estou contornando isso deste jeito:
- Código:
IF acceptZero
RETURN .T.
ENDIF
Mas para evitar repetição de código gostaria de fazer da primeira maneira, é possível?
Obrigado!
18 Jun 2020 20:43
Olá!
Da forma como você codificou vai dar erro mesmo. Tanto para funções quanto para procedures e métodos, os parâmetros são recebidos na assinatura destes elementos. Caso precise verificar se o parâmetro foi passado (o que é uma das boas práticas em programação), existem algumas formas.
Utilizando o teu código como exemplo:
- Código:
METHOD ValidateVendedor(window, name, lblname, acceptZero) // ==> Aqui falta o nome da classe à qual o método pertence <==
// por exemplo: METHOD ValidateVendedor(window, name, lblname, acceptZero) CLASS NomeDaTuaClasse
...
If acceptZero == NIL
acceptZero := .T.
Endif
// ou
If Hb_IsNil( acceptZero )
acceptZero := .T.
Endif
// ou
If Empty( acceptZero )
acceptZero := .T.
Endif
// ou
acceptZero := If( Hb_IsNil( acceptZero ), .T., acceptZero )
acceptZero := If( acceptZero == NIL, .T., acceptZero )
acceptZero := If( Empty( acceptZero ), .T., acceptZero )
RETURN .T.
18 Jun 2020 22:08
alxsts,
Obrigado pela resposta. Sobre a classe, é pq não copiei do código mesmo kkkkkkkkkkkkkkk. Mas está assim:
- Código:
METHOD ValidateVendedor(window, name, lblname, acceptZero) CLASS JsysValidateFilterForm
De qualquer forma, obrigado por deixar claro de como lidar com essa questão dos parâmetros.
18 Jun 2020 22:32
A função hb_default resolve esse problema.
Funciona assim
Hb_default( @cvar , "" )
Use ela no início do código, logo após receber o parâmetro.
Uma vantagem é que se o tipo de dado passado for diferente do tipo de dado do valor default, então o valor default é usado. Aí resolve ao problema do NIL.
19 Jun 2020 01:30
Olá!
Vlademiro escreveu:A função hb_default resolve esse problema.
Sim, não tenho dúvidas quanto a isto.
Propositalmente deixei esta função fora dos exemplos que postei acima, mais por uma questão de gosto pessoal. Acho esta função pouco clara, tanto que gerou dúvidas em outro
tópico aqui do fórum, que contou com importante participação do colega Vlademiro. Outro ponto que não gosto é usar passagem de parâmetros por referência. Penso que este é outro ponto que dificulta a legibilidade do código...
19 Jun 2020 08:21
Era eu lá kkkk
Como passa rápido o tempo.
Infelizmente o Harbour é mal documentado, a gente descobre muita coisa nos grupos. Por isso aqui é importante.
Tb não gosto de passagem por referência, mas acabei me rendendo dada a praticidade.
Mas tb tem hb_defaultValue que faz a mesma coisa e não usa referência. Ela retorna o valor.
19 Jun 2020 09:56
alxsts escreveu:Outro ponto que não gosto é usar passagem de parâmetros por referência. Penso que este é outro ponto que dificulta a legibilidade do código...
Isso é a melhor coisa que existe, é justamente isso que deixa os fontes independentes
Mas é lógico... como tudo na programação, não é pra exagerar e colocar em todo e qualquer fonte.
19 Jun 2020 10:03
Sobre valores default, 3 possibilidades que me lembro:
- Código:
FUNCTION x( a, b, c )
IF PCount() < 3
c := 0
IF PCount() < 2
b := 0
IF PCount() < 1
a := 0
ENDIF
ENDIF
ENDIF
FUNCTION x( a, b, c )
a := iif( a == NIL, 0, a )
b := iif( b == NIL, 0, b )
c := iif( c == NIL, 0, c )
FUNCTION x( a, b, c )
hb_Default( @a, 0 )
hb_Default( @b, 0 )
hb_Default( @c, 0 )
19 Jun 2020 10:18
Convém lembrar também do seguinte:
Existe a forma correta de programar, e a forma errada.
TALVEZ seja problema usar hb_Default() se programar igual os tempos de quando não existia variável LOCAL.
Aquele negócio de:
FUNCTION x
PARAMETERS a, b, c
hb_Default( @a, 0 )
hb_Default( @b, 0 )
hb_Default( @c, 0 )
Nem faço idéia, talvez nesse caso tenham resultados imprevisíveis, porque as variáveis nem vão existir.
É apenas um comentário, porque nunca se sabe o que cada um vai usar no fonte.
Geralmente a gente se baseia no que é comum, e acontece de usarem tudo de forma errada.
Às vezes pego fontes com essas exceções, talvez 1 vez a cada ano, mas acontece.
19 Jun 2020 11:53
Ola!
Antigamente, convencionou-se como padrão usar:
Para comparar "if x = 0" então numa passagem de parâmetros o uso xFunc(a,b,x=0) mas neste caso x vai como se fosse "if x=0"
Então para melhorar a leitura do código, "de uns tempos para cá" usamos para atribuir os dois pontos ":".
xFunc(a,b,x:=0) logo na leitura já estamos percebendo que está atribuindo e não comparando.
X=A pode ser entendido como; Se X for igual a A, mas com os dois pontos não tem esse "talvez".
X := A, mesmo se colocar "IF" está atribuindo e sempre vai retornar .T.
Dai veio a necessidade de usar "==" para comparação.
IF A = "A " retorna TRUE
IF A == "A " retorna FALSE
Então a boa pratica diz o seguinte:
Sempre que atribuir usar ":=" e sempre que comparar usar "=="
Se deseja ver se contém usamos "$"
Saudações,
Itamar M. Lins Jr.
19 Jun 2020 14:15
Me perdi um pouco, mas entendi.
De qualquer jeito, NÃO é aceito colocar na definição de função.
O Itamar apenas indicou sobre o uso de sinal de igual.
x = 10
x = iif( x = 10, x = 11, x = 10 )
? x
Isso confunde principalmente o compilador.
Qual vai ser o valor de X?
10 ? 11 ?
Não, o valor de x vai ser .F.
19 Jun 2020 14:34
Ola!
Existe variantes quando comparamos, se vai ou não contar com os espaços em branco, ou toda a string veja:
cA := "A"+space(20)
If cA = "A" //return true
If cA == "A" //return false.
Dai ainda tem isso:
SET EXACT ON
If cA = "A" //return false
SET EXACT OFF
? "12345" = "123" // Result: .T.
Por isso não é mais aconselhavel usar "set exact on", se usar ter cuidado!
E usar sempre os sinais :=, ==
Saudações,
Itamar M. Lins Jr.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.