BlackTDN :: ADVPL ~ PARAMTYPE
| Dessa forma é possível atribuir valor “DEFAULT” a uma variável do tipo “OBJECT”, quando “OPTIONAL”, e ainda testar se o objeto passado corresponde à Classe Definida em “ParamType”. O mesmo podemos dizer para os demais tipos. No include padrão, quando o parâmetro é opcional com valor “DEFAULT” podemos, passar no “DEFAULT”, qualquer tipo que ele “engole”; já a versão BlackTDN não: a atribuição do “DEFAULT” é feita antes da verificação do tipo da variável. O arquivo “parmtype.ch” modificado poderá ser obtido ao clicar aqui e, para o código do exemplo, aqui. |
ei-la:
1: #ifndef __PARAMTYPE_CH
2: #define __PARAMTYPE_CH
3: #xcommand PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <text> [ MESSAGE <message> ] ; 4: => ; 5: [ UserException(<message>) ] ;;6: [ UserException("argument #"+<"param">+" error, expected "+<text>) ] ;;
7: UserException("argument error in parameter "+<"varname">+", expected "+<text>)
8: 9: #xcommand CLASSPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <text,...> [ MESSAGE <message> ] ; 10: => ; 11: [ UserException(<message>) ] ;;12: [ UserException("argument #"+<"param">+" error, class expected "+\"<text>\") ] ;;
13: UserException("argument error in parameter "+<"varname">+", class expected "+\"<text>\")
14: 15: #xcommand BLOCKPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <text> [ MESSAGE <message> ] ; 16: => ; 17: [ UserException(<message>) ] ;;18: [ UserException("argument #"+<"param">+" error , return expected "+<text>) ] ;;
19: UserException("argument error in block "+<"varname">+", return expected "+<text>)
20: 21: #xcommand PARAMTYPE [ <param> VAR ] <varname> AS <type: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL, OBJECT> ; 22: [ , <typeN: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL, OBJECT> ] ; 23: [ MESSAGE <message> ] ; 24: [ <optional: OPTIONAL> ] ; 25: [ DEFAULT <uVar> ] ; 26: => ; 27: if (<.optional.>);; 28: <varname> := If(<varname> == nil,<uVar>,<varname>);; 29: endif;; 30: If !(<.optional.> .and. ValType(<varname>) == "U") .and. !(ValType(<varname>) $ Subs(<"type">,1,1) [ + Subs(<"typeN">,1,1) ]) ;;
31: PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT Subs(<"type">,1,1) [ + "," + Subs(<"typeN">,1,1) ]+"->"+ValType(<varname>) [ MESSAGE <message> ] ;;
32: EndIf ;; 33: 34: #xcommand PARAMTYPE [ <param> VAR ] <varname> AS BLOCK EXPECTED <expected: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL, OBJECT> ; 35: [ MESSAGE <message> ] ; 36: [ <optional: OPTIONAL> ] ; 37: => ;38: If ValType(<varname>) == "B" ;;
39: __block := Eval(<varname>) ;;40: If ValType(__block) <> Subs(<"expected"> ,1,1) ;;
41: BLOCKPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT Subs(<"expected">,1,1) + "->"+ValType(__block) [ MESSAGE <message> ] ;;
42: EndIf ;;43: ElseIf !(<.optional.> .and. ValType(<varname>) == "U") ;;
44: PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT "B->"+ValType(<varname>) [ MESSAGE <message> ] ;;
45: EndIf 46: 47: #xcommand PARAMTYPE [ <param> VAR ] <varname> AS OBJECT CLASS <classname,...> ; 48: [ MESSAGE <message> ] ; 49: [ <optional: OPTIONAL> ] ; 50: [ DEFAULT <uVar> ] ; 51: => ; 52: if (<.optional.>);; 53: <varname> := If(<varname> == nil,<uVar>,<varname>);; 54: endif;; 55: If ValType(<varname>) == "O" ;;
56: __erro := ErrorBlock({|| "UNDEFINED"}) ;;
57: BEGIN SEQUENCE ;; 58: __classname := Upper(<varname>:ClassName()) ;; 59: END SEQUENCE ;; 60: ErrorBlock(__erro) ;; 61: If !(__classname $ Upper(\"<classname>\")) ;; 62: CLASSPARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT <classname> [ MESSAGE <message> ] ;; 63: EndIf ;;64: ElseIf !(<.optional.> .and. ValType(<varname>) == "U") ;;
65: PARAMEXCEPTION [ PARAM <param> VAR ] <varname> TEXT "O->"+ValType(<varname>) [ MESSAGE <message> ] ;;
66: EndIf ;; 67: 68: #xcommand PARAMTYPE [ <param> VAR ] <varname> AS <type: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL> ; 69: [ , <typeN: ARRAY, BLOCK, CHARACTER, DATE, NUMERIC, LOGICAL> ] ; 70: OR OBJECT CLASS <classname,...> ; 71: [ MESSAGE <message> ] ; 72: [ <optional: OPTIONAL> ] ; 73: => ; 74: If ValType(<varname>) == "O" ;; 75: PARAMTYPE [ <param> VAR ] <varname> AS OBJECT CLASS <classname> [ MESSAGE <message> ] [ <optional> ] ;; 76: Else ;; 77: PARAMTYPE [ <param> VAR ] <varname> AS <type> [, <typeN>] [ MESSAGE <message> ] [ <optional> ] ;; 78: EndIf79: #endif
um pequeno exemplo:
1: #include "parmtype.ch"
2: User Function ParamType() 3: Return(ParamType()) 4: Static Function ParamType(cVar,nVar,lVar,dVar,bVar,uVar,aVar,oVar) 5: 6: PARAMTYPE 1 VAR cVar AS CHARACTER OPTIONAL DEFAULT ""
7: PARAMTYPE 2 VAR nVar AS NUMERIC OPTIONAL DEFAULT 0 8: PARAMTYPE 3 VAR lVar AS LOGICAL OPTIONAL DEFAULT .T. 9: PARAMTYPE 4 VAR dVar AS DATE OPTIONAL DEFAULT Date() 10: PARAMTYPE 5 VAR bVar AS BLOCK OPTIONAL DEFAULT { || .F. }11: PARAMTYPE 6 VAR uVar AS CHARACTER,NUMERIC OPTIONAL DEFAULT "0"
12: PARAMTYPE 7 VAR aVar AS ARRAY OPTIONAL DEFAULT Array(0)13: PARAMTYPE 8 VAR oVar AS OBJECT CLASS THASH OPTIONAL DEFAULT THASH():New() //CUSTOMIZED BY BLACKTDN
14: 15: Return( NIL )[]s
иαldσ dj
Comentários
Postar um comentário