#include-once #include #include #include #include #include #include #include #include #include #include Global $__INPUT_COLOR = 0xFFFF99 Global Enum $INPUT_DATE, $INPUT_NUMBER, $INPUT_TEXT Global Enum $__MASK_PARAM, $__MASK_PREFORMAT = 2, $__MASK_POSTFORMAT Global Enum $__MASK_CONTROLE, $__MASK_TIPO, $__MASK_MASCARA, $__MASK_EXTRA Global Enum $__MASK_FORMATO, $__MASK_TROCA, $__MASK_LIMPA, $__MASK_DESFORMATO, $__MASK_INPUT, $__MASK_FILLER Global Const $__GnLCID = _WinAPI_GetUserDefaultLCID() Global Const $__GsSEP_DATA = _WinAPI_GetLocaleInfo($__GnLCID, $LOCALE_SDATE) Global Const $__GsSEP_DECIMAL = _WinAPI_GetLocaleInfo($__GnLCID, $LOCALE_SDECIMAL) Global Const $__GsSEP_MILHAR = _WinAPI_GetLocaleInfo($__GnLCID, $LOCALE_STHOUSAND) ; #FUNCTION# ==================================================================================================================== ; Name ..........: _INIT_MASCARAS ; Description ...: Inicializa o subsistema de mascaras nos inputs ; Syntax ........: _INIT_MASCARAS([$nColor = 0xFFFF99[, $bPreFormat = True[, $bPostFormat = False]]]) ; Parameters ....: $nColor = [Number, Optional] O codigo hexa da cor de fundo. Default is 0xFFFF99. ; $bPreFormat = [Boolean, Optional] Se os valores devem ser pre-formatados ao abrir a janela ; $bPostFormat = [Boolean, Optional] Se os valores devem ou nao ser desformatados apos o fechamento da janela ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: _INIT_MASCARAS() ; Remarks .......: PreFormat eh para quando abrir a janela, pre-formatar os campos (numeros serao ajustados, mascaras serao aplicadas, etc). Por exemplo: ; TRUE => Campo CEP, mascara 99.999-999, conteudo "90123789", ao abrir janela mostra "90.123-789" ; FALSE => Campo CEP, mascara 99.999-999, conteudo "90123789", ao abrir janela mostra "90123789" ; PostFormat eh para quando fechar a janela, os dados manterem ou nao as mascaras aplicadas. Por exemplo: ; TRUE => Campo CEP, mascara 99.999-999, conteudo "90.123-789", ao fechar a janela mantem o conteudo como "90.123-789" ; FALSE => Campo CEP, mascara 99.999-999, conteudo "90.123-789", ao fechar a janela troca o conteudo para "90123789" ; =============================================================================================================================== Func _INIT_MASCARAS ($nColor = 0xFFFF99, $bPreFormat = True, $bPostFormat = False) If $bPreFormat = Default or not IsBool($bPreFormat) Then $bPreFormat = True If $bPostFormat = Default or not IsBool($bPostFormat) Then $bPostFormat = False If $nColor = Default or not IsNumber($nColor) Then $nColor = 0xFFFF99 $__INPUT_COLOR = $nColor ; http://www.rapidtables.com/web/color/RGB_Color.htm Global $__aInputs = [ [ 0, 0, $bPreFormat, $bPostFormat ] ] Global $__aMascaras = [ [ "", "", "", "", "", "" ] ] GUIRegisterMsg($WM_COMMAND, "__MASCARAS") GUIRegisterMsg($WM_SHOWWINDOW, "__MASCARAS") GUIRegisterMsg($WM_SYSCOMMAND, "__MASCARAS") EndFunc ;==>_INIT_MASCARAS ; #FUNCTION# ==================================================================================================================== ; Name ..........: _RELEASE_MASCARAS ; Description ...: Libera (ou reseta) as variaveis utilizadas pelo subsistema de Mascaras ; Syntax ........: _RELEASE_MASCARAS() ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: _RELEASE_MASCARAS() ; =============================================================================================================================== Func _RELEASE_MASCARAS () Global $__aInputs = [ [ 0, 0, True, False ] ] Global $__aMascaras = [ [ "", "", "", "", "", "" ] ] GUIRegisterMsg($WM_COMMAND, "") GUIRegisterMsg($WM_SHOWWINDOW, "") GUIRegisterMsg($WM_SYSCOMMAND, "") EndFunc ;==>_RELEASE_MASCARAS ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GUICTRLSETMASK ; Description ...: Configura o tipo de mascara aplicada a cada campo ; Syntax ........: _GUICTRLSETMASK($nCampo, $nTipo, $sMascara[, $sExtra = ""]) ; Parameters ....: $nCampo = [Number] O codigo de cada campo ; $nTipo = [Number] Tipo de campo (DATE, NUMBER ou TEXT) ; $sMascara = [String] Mascara a ser aplicada (depende do tipo do campo - ver exemplos abaixo) ; $sExtra = [String, optional] Complemento da mascara (depende do tipo do campo - ver exemplos abaixo) ; Return values .: Sucesso = [Boolean] TRUE se conseguiu adicionar a mascara no subsistema ; Falha = [Boolean] FALSE e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: Aqui separamos os exemplos por TIPO de campo ; Tipo NUMERICO ($INPUT_NUMBER) - com alinhamento a direita ; o 3o parametro eh a quantidade de digitos do campo ; o 4o parametro eh o numero de decimais do campo ; _GUICTRLSETMASK($Campo, $INPUT_NUMBER, 6, 0) ; 6 digitos SEM decimais = 999,999 ; _GUICTRLSETMASK($Campo, $INPUT_NUMBER, 8, 0) ; 8 digitos SEM decimais = 99,999,999 ; _GUICTRLSETMASK($Campo, $INPUT_NUMBER, 9, 2) ; 9 digitos MAIS 2 decimais = 999,999,999.99 ; Tipo DATA ($INPUT_DATE) - com alinhamento centralizado ; 3o parametro identifica o formato da data (D = dia, M = mes, Y = ano) ; formatos mais comuns sao: DMY (Brasil, Inglaterra), MDY (USA, Europa), YMD (militar) ; 4o parametro identifica o separador de data, por padrao usa o configurado no Windows ; _GUICtrlSetMask($Campo, $INPUT_DATE, "DMY") ; padrao brasileiro (dia, mes, ano) ; _GUICtrlSetMask($Campo, $INPUT_DATE, "MDY") ; padrao americano (mes, dia, ano) ; _GUICtrlSetMask($Campo, $INPUT_DATE, "YMD", "-") ; padrao militar (ano, mes, dia) com separador hifen ; Tipo TEXTO ($INPUT_TEXT) - sem alinhamento definido, recomendado a esquerda com opcao de rolamento horizontal ($ES_AUTOHSCROLL) ; 3o parametro identifica a mascara a ser aplicada ; aceita quaisquer expressoes RegExp para CADA caracter OU macros (definidas entre #) ; as macros possiveis sao: ; @ = qualquer coisa do ASCII 32 (espaco) ate o ASCII 126 (til) ; 9 = numeros = \d ; A = letras = [a-zA-Z] ; X = letras e numeros = [a-zA-Z0-9] ; H = hexa = [a-fA-F0-9] ; as macros podem ser utilizadas em quantidades se dispostas entre colchetes ; [@]ddd = ddd = qtde de cada caractere entre [] ; [@]50 = 50 alfanumericos ; [A]3 = 3 letras ; [9]4 = 4 numeros ; 4o parametro identifica o tamanho maximo do campo quando quantidade muito grande (para fins de rolamento horizontal) ; _GUICtrlSetMask($Campo, $INPUT_TEXT, "#[@]50#", 20) ; formato livre, alfanumerico com 50 caracteres mas com rolamento horizontal no 20 ; _GUICtrlSetMask($Campo, $INPUT_TEXT, "#99.999.999/9999-99#") ; formato CNPJ, somente numeros ; _GUICtrlSetMask($Campo, $INPUT_TEXT, "#999.999.999-99#") ; formato CPF, somente numeros ; _GUICtrlSetMask($Campo, $INPUT_TEXT, "#HH:HH:HH:HH:HH:HH#") ; formato MAC, somente codigos hexadecimais ; _GUICtrlSetMask($Campo, $INPUT_TEXT, "#99.999-999#") ; formato CEP, somente numeros ; _GUICtrlSetMask($Campo, $INPUT_TEXT, "#AAA-9999#") ; formato placa de carro, 3 letras e 4 numeros ; _GUICtrlSetMask($Campo, $INPUT_TEXT, "[a-zA-Z]3-[0-9]4") ; outro formato de placa de carro SEM as macros (3 letras e 4 nros) ; _GUICtrlSetMask($Campo, $INPUT_TEXT, "#(99) 99999-9999#") ; formato telefone, somente numeros ; =============================================================================================================================== Func _GUICTRLSETMASK ($nCampo, $nTipo, $sMascara, $sExtra = "") If $nCampo = -1 Then $nCampo = _GUIGetLastCtrlID() If not GUICtrlGetHandle($nCampo) Then Return SetError(1, 0, False) If not IsDeclared("__aInputs") or not IsArray($__aInputs) or UBound($__aInputs, 2) <> $__MASK_EXTRA + 1 Then _INIT_MASCARAS() If not IsDeclared("__aMascaras") or not IsArray($__aMascaras) or UBound($__aMascaras, 2) <> $__MASK_FILLER + 1 Then _INIT_MASCARAS() If not StringInStr($INPUT_DATE & "_" & $INPUT_NUMBER & "_" & $INPUT_TEXT, $nTipo) Then Return SetError(2, 0, False) If $nTipo = $INPUT_TEXT Then If not IsString($sMascara) or $sMascara = "" Then Return SetError(3, 0, False) If $sExtra = Default or not IsNumber($sExtra) Then $sExtra = 0 ElseIf $nTipo = $INPUT_NUMBER Then If not IsNumber($sMascara) or $sMascara <= 0 Then Return SetError(3, 0, False) If $sExtra = Default or not IsNumber($sExtra) or $sExtra < 0 or $sExtra > $sMascara Then $sExtra = 0 Local $aEstilos = _GUICtrlGetStyle($nCampo) GUICtrlSetStyle($nCampo, BitOR($aEstilos[0], $ES_RIGHT)) ElseIf $nTipo = $INPUT_DATE Then If _WinAPI_GetClassName(GUICtrlGetHandle($nCampo)) <> "Edit" Then Local $aTemp = StringSplit("d{1,4}[^dMy]$M{1,4}[^dMy]$(?:y{4}|y{2})[^dMy]", "$", $STR_NOCOUNT) If not IsString($sMascara) or not StringRegExp($sMascara, StringReplace(_ArrayToString(_ArrayUnique(_ArrayPermute($aTemp), Default, Default, 1, $ARRAYUNIQUE_NOCOUNT), "|", 1), "[^dMy]|", "|")) Then Return SetError(4, 1, False) Local $aSeparador = StringRegExp($sMascara, "(?i)([^dmy])", $STR_REGEXPARRAYGLOBALMATCH) If @error Then $sExtra = $__GsSEP_DATA $sExtra = StringLeft($aSeparador[0], 1) Else Local $aTemp = StringSplit("DMY", "", $STR_NOCOUNT) If not IsString($sMascara) or _ArraySearch(_ArrayPermute($aTemp), $sMascara, 1) = -1 Then Return SetError(4, 2, False) If $sExtra = Default or not IsString($sExtra) or $sExtra = "" Then $sExtra = $__GsSEP_DATA $sExtra = StringLeft($sExtra, 1) If StringRegExp($sExtra, "[0-9]") Then $sExtra = $__GsSEP_DATA Local $aEstilos = _GUICtrlGetStyle($nCampo) GUICtrlSetStyle($nCampo, BitOR($aEstilos[0], $ES_CENTER)) EndIf EndIf __ArrayAdd2D($__aInputs, $nCampo, $nTipo, $sMascara, $sExtra) Return SetError(0, 0, True) EndFunc ;==>_GUICTRLSETMASK ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __DAY ; Description ...: Dia do mes de uma data especifica ; Syntax ........: __DAY($sData_Hora, $sFormato) ; Parameters ....: $sData_Hora = [String] String contendo a data com ou sem separadores ou hora ; $sFormato = [String, optional] String com o formato da data. Default is "DMY". ; Return values .: Sucesso = [Number] Nro contendo o dia ; Falha = [Number] 0 e seta @error e @extended ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __DAY(_NowCalcDate(), "YMD") ; retorna o dia da data de hoje ; =============================================================================================================================== Func __DAY ($sData_Hora, $sFormato) Local $nDia = __EXTRACT_DATA($sData_Hora, $sFormato, "D") Return SetError(@error, 0, $nDia) EndFunc ;==>__DAY ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __EXT2DOW ; Description ...: Converte o dia da semana por extenso em numero ; Syntax ........: __EXT2DOW($sExtenso) ; Parameters ....: $sExtenso = [String] Dia da semana por extenso ; Return values .: Sucesso = [Number] Dia da semana (1 = dom, 2 seg, 3 = ter ... 7 = sab) ; Falha = [Number] 0 e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __EXT2DOW("segunda") ; return 2 ; __EXT2DOW("quarta-feira") ; return 4 ; __EXT2DOW("abobrinha") ; return 0 e seta @error ; =============================================================================================================================== Func __EXT2DOW ($sExtenso) Local $aNomes[0] For $nDow = 1 to 7 _ArrayAdd($aNomes, _DateDayOfWeek($nDow, $DMW_LOCALE_LONGNAME)) Next $nDow = _ArraySearch($aNomes, $sExtenso, 0, 0, 0, 1) ; ultimo parâmetro determina search parcial If @error Then Return SetError(1, @error, 0) Return SetError(0, 0, $nDow + 1) EndFunc ;==>__EXT2DOW ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __MONTH ; Description ...: Mes de uma data especifica ; Syntax ........: __YEAR($sData_Hora, $sFormato) ; Parameters ....: $sData_Hora = [String] String contendo a data com ou sem separadores ou hora ; $sFormato = [String] String com o formato da data. Default is "DMY". ; Return values .: Sucesso = [Number] Nro contendo o mes ; Falha = [Number] 0 e seta @error e @extended ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __MONTH(_NowCalcDate(), "YMD") ; retorna o mes da data de hoje ; =============================================================================================================================== Func __MONTH ($sData_Hora, $sFormato) Local $nMes = __EXTRACT_DATA($sData_Hora, $sFormato, "M") Return SetError(@error, 0, $nMes) EndFunc ;==>__MONTH ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __MONTH2EXT ; Description ...: Mes por extenso ; Syntax ........: __MONTH2EXT($nMes[, $nTamanho = 50[, $bCapital = True]]) ; Parameters ....: $nMes = [Number] Nro contendo o mes. ; $nTamanho = [Optional, Number] Nro com tamanho do retorno. Default is 50. ; $bCapital = [Optional, Boolean] Se deve capitalizar a primeira letra. Default is True. ; Return values .: Sucesso = [String] extenso ; Falha = [String] "" (vazio) e seta @error ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __MONTH2EXT(2) ; retorna Fevereiro ; __MONTH2EXT(8) ; retorna Agosto ; Remarks .......: Funcao internacionalizada, deve retornar o nome do mes na linguagem instalada padrao do Windows ; =============================================================================================================================== Func __MONTH2EXT ($nMes, $nTamanho = 50, $bCapital = True) If $nTamanho = Default Then $nTamanho = 50 If $bCapital = Default Then $bCapital = True Local $sTexto = _DateToMonth($nMes, $DMW_LOCALE_LONGNAME) If @error Then Return SetError(1, @error, "") If $bCapital Then $sTexto = StringUpper(StringLeft($sTexto, 1)) & StringTrimLeft($sTexto, 1) Return SetError(0, 0, StringLeft($sTexto, $nTamanho)) EndFunc ;==>__MONTH2EXT ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __MONTA_MASC_DATA ; Description ...: Monta a mascara para campos DATA (dd/mm/yyyy ou yyyy/mm/dd) ; Syntax ........: __MONTA_MASC_DATA($sFormato) ; Parameters ....: $sFormato = [String] String no formato DMY (e variantes) ou formato dd/mm/yyyy (e variantes) ; Return values .: Sucesso = [String] Mascara que sera aplicada no campo tipo DATA ; Falha = [Number] 99/99/9999 e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __MONTA_MASC_DATA("DMY") ; return 99/99/9999 ; __MONTA_MASC_DATA("YMD") ; return 9999/99/99 ; =============================================================================================================================== Func __MONTA_MASC_DATA ($sFormato) Local $sPeriodo, $sMascara = "" Local $nTamMaxSem = __TAM_WEEK_EXT(), $nTamMaxMes = __TAM_MONTH_EXT() Local $aSeparador = StringRegExp($sFormato, "(?i)([^dmy])", $STR_REGEXPARRAYGLOBALMATCH) If @error Then Return SetError(1, 0, "99/99/9999") Local $aMascara = StringRegExp($sFormato, "(?i)^([dmy]{1,4})[^dmy]([dmy]{1,4})[^dmy]([dmy]{4}|[dmy]{2})$", $STR_REGEXPARRAYGLOBALMATCH) If @error Then Return SetError(2, 0, "99/99/9999") For $nPeriodo = 0 to UBound($aMascara) - 1 $sPeriodo = $aMascara[$nPeriodo] If StringLeft($sPeriodo, 1) = "d" Then If StringLen($sPeriodo) = 3 Then $sMascara &= "AAA" ; abrev dia da semana ElseIf StringLen($sPeriodo) = 4 Then $sMascara &= _StringRepeat("9", $nTamMaxSem) ; dia da semana full Else $sMascara &= "99" EndIf ElseIf StringLeft($sPeriodo, 1) = "M" Then If StringLen($sPeriodo) = 3 Then $sMascara &= "AAA" ; abrev dia do mes ElseIf StringLen($sPeriodo) = 4 Then $sMascara &= _StringRepeat("9", $nTamMaxMes) ; mes full Else $sMascara &= "99" EndIf ElseIf StringLeft($sPeriodo, 1) = "y" Then $sMascara &= _StringRepeat("9", StringLen($sPeriodo)) EndIf If $nPeriodo < UBound($aSeparador) Then $sMascara &= $aSeparador[$nPeriodo] Next Return SetError(0, 0, $sMascara) EndFunc ;==>__MONTA_MASC_DATA ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __TAM_WEEK_EXT ; Description ...: Tamanho maximo do dia da semana ; Syntax ........: __TAM_WEEK_EXT() ; Return values .: Sucesso = [Number] tamanho em caracteres do maior dia da semana (em portugues segunda-feira = 13) ; Falha = [Number] 0 e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; =============================================================================================================================== Func __TAM_WEEK_EXT () Local $nAtual, $nMax = 0 For $nDow = 1 to 7 $nAtual = StringLen(_DateDayOfWeek($nDow, $DMW_LOCALE_LONGNAME)) If $nAtual > $nMax Then $nMax = $nAtual Next Return SetError(0, 0, $nMax) EndFunc ;==>__TAM_WEEK_EXT ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __TAM_MONTH_EXT ; Description ...: Tamanho maximo do mes ; Syntax ........: __TAM_MONTH_EXT() ; Return values .: Sucesso = [Number] tamanho em caracteres do maior mes do ano (em portugues fevereiro = 9) ; Falha = [Number] 0 e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; =============================================================================================================================== Func __TAM_MONTH_EXT () Local $nAtual, $nMax = 0 For $nMes = 1 to 12 $nAtual = StringLen(_DateToMonth($nMes, $DMW_LOCALE_LONGNAME)) If $nAtual > $nMax Then $nMax = $nAtual Next Return SetError(0, 0, $nMax) EndFunc ;==>__TAM_MONTH_EXT ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __MONTA_FORMATO_DATA ; Description ...: Converte o padrao dd/mm/yyyy para DMY ; Syntax ........: __MONTA_FORMATO_DATA($sMascara) ; Parameters ....: $sMascara = [String] padrao a ser convertido ; Return values .: Sucesso = [String] novao padrao ; Falha = [Number] YMD e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __MONTA_FORMATO_DATA("99/99/9999") ; returns "DMY" ; =============================================================================================================================== Func __MONTA_FORMATO_DATA ($sMascara) Local $sFormato = "", $aMascara = StringRegExp($sMascara, "(?i)^([dmy]{1,4})[^dmy]+([dmy]{1,4})[^dmy]+([dmy]{2}|[dmy]{4})$", $STR_REGEXPARRAYGLOBALMATCH) If @error Then Return SetError(2, 0, "YMD") For $sPeriodo in $aMascara $sFormato &= StringUpper(StringLeft($sPeriodo, 1)) Next Return SetError(0, 0, $sFormato) EndFunc ;==>__MONTA_FORMATO_DATA ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __MONTA_SEPARADOR_DATA ; Description ...: Analisa a string de data para extrair o separador correto ; Syntax ........: __MONTA_SEPARADOR_DATA($sMascara) ; Parameters ....: $sMascara = [String] Data no formato de CampoData (GUICtrlCreateDate) ; Return values .: Sucesso = [String] Separador de data ; Falha = [Number] $__GsSEP_DATA padrao do Windows e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __MONTA_SEPARADOR_DATA("dd/MMM/yyyy") ; return "/" ; =============================================================================================================================== Func __MONTA_SEPARADOR_DATA ($sMascara) Local $aSeparador = StringRegExp($sMascara, "(?i)([^dmy])", $STR_REGEXPARRAYGLOBALMATCH) If @error Then Return SetError(1, 0, $__GsSEP_DATA) Return SetError(0, 0, $aSeparador[0]) EndFunc ;==>__MONTA_SEPARADOR_DATA ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __EXT2MONTH ; Description ...: Mes de acordo com o extenso ; Syntax ........: __EXT2MONTH($sExtenso) ; Parameters ....: $sExtenso = [String] Texto contendo o nome do mes ; Return values .: Sucesso = [Number] Nro contendo mes ; Falha = [Number] 0 e seta @error ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __EXT2MONTH("Abril") ; retorna 4 ; __EXT2MONTH("Set") ; retorna 9 ; =============================================================================================================================== Func __EXT2MONTH ($sExtenso) Local $aNomes[0] For $nMes = 1 to 12 _ArrayAdd($aNomes, _DateToMonth($nMes, $DMW_LOCALE_LONGNAME)) Next $nMes = _ArraySearch($aNomes, $sExtenso, 0, 0, 0, 1) ; ultimo parâmetro determina search parcial If @error Then Return SetError(1, @error, 0) Return SetError(0, 0, StringFormat("%02d", $nMes + 1)) EndFunc ;==>__EXT2MONTH ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __YEAR ; Description ...: Ano de uma data especifica ; Syntax ........: __YEAR($sData_Hora, $sFormato) ; Parameters ....: $sData_Hora = [String] String contendo a data com ou sem separadores ou hora ; $sFormato = [String] String com o formato da data. Default is "DMY". ; Return values .: Sucesso = [Number] Nro contendo o ano ; Falha = [Number] 0 e seta @error e @extended ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __YEAR(_NowCalcDate(), "YMD") ; retorna o ano da data de hoje ; =============================================================================================================================== Func __YEAR ($sData_Hora, $sFormato) Local $nAno = __EXTRACT_DATA($sData_Hora, $sFormato, "Y") Return SetError(@error, 0, $nAno) EndFunc ;==>__YEAR ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __DT2EXP ; Description ...: Expande a data para o formato dd/MMM/yyyy (usado em inputs) ; Syntax ........: __DT2EXP($sData_Hora, $sFormato[, $sSeparador = $__GsSEP_DATA[, $nTamanho = 3[, $bCapital = True]]]) ; Parameters ....: $sData_Hora = [String] String contendo a data com ou sem separadores ou hora ; $sFormato = [String] String com o formato da data. Default is "DMY". ; $sSeparador = [String, optional] String com o separador de data. Default is $SEP_DATA. ; $nTamanho = [Optional, Number] Nro com tamanho do retorno. Default is 3. ; $bCapital = [Optional, Boolean] Se deve capitalizar a primeira letra. Default is True. ; Return values .: Sucesso = [String] data formatada ; Falha = [String] "" (vazio) e seta @error ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __DT2EXP("20171225", "YMD") ; retorna 2017/Dez/25 ; =============================================================================================================================== Func __DT2EXP ($sData_Hora, $sFormato, $sSeparador = $__GsSEP_DATA, $nTamanho = 3, $bCapital = True) If not IsString($sData_Hora) Then Return SetError(1, 0, "Err") If $sData_Hora = "" Then Return SetError(0, 1, "") Local $aTemp = StringSplit("DMY", "", $STR_NOCOUNT) If not IsString($sFormato) or _ArraySearch(_ArrayPermute($aTemp), $sFormato, 1) = -1 Then Return SetError(2, 0, "Err") If $sSeparador = Default or not IsString($sSeparador) or $sSeparador = "" or StringRegExp($sSeparador, "^[0-9]$") Then $sSeparador = $__GsSEP_DATA If $nTamanho = Default or not IsNumber($nTamanho) Then $nTamanho = 3 If $bCapital = Default or not IsBool($bCapital) Then $bCapital = True Local $sRetorno = "" For $nIndice = 1 to StringLen($sFormato) Switch StringMid($sFormato, $nIndice, 1) Case "D" $sRetorno &= __DAY($sData_Hora, $sFormato) Case "M" $sRetorno &= __MONTH2EXT(__MONTH($sData_Hora, $sFormato), $nTamanho, $bCapital) Case "Y" $sRetorno &= __YEAR($sData_Hora, $sFormato) EndSwitch If $nIndice < StringLen($sFormato) Then $sRetorno &= $sSeparador Next Return SetError(0, 0, $sRetorno) EndFunc ;==>__DT2EXP ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __EXP2DT ; Description ...: Restaura a data extended para formato numerico ; Syntax ........: __EXP2DT($sExp_Data_Hora[, $sFormato = "DMY"[, $sSeparador = $__GsSEP_DATA]]) ; Parameters ....: $sData_Hora = [String] String contendo a data com ou sem separadores ou hora ; $sFormato = [String, optional] String com o formato da data. Default is "DMY". ; $sSeparador = [String, optional] String com o separador de data. Default is $SEP_DATA. ; Return values .: Sucesso = [String] data formato numerico ; Falha = [String] "" (vazio) e seta @error ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __EXP2DT("2017/Dez/25", "YMD") ; retorna 20171225 ; =============================================================================================================================== Func __EXP2DT ($sData_Hora, $sFormato, $sSeparador = $__GsSEP_DATA) If not IsString($sData_Hora) Then Return SetError(1, 0, "Err") If $sData_Hora = "" Then Return SetError(0, 1, "") Local $aTemp = StringSplit("DMY", "", $STR_NOCOUNT) If not IsString($sFormato) or _ArraySearch(_ArrayPermute($aTemp), $sFormato, 1) = -1 Then Return SetError(2, 0, "Err") If $sSeparador = Default or not IsString($sSeparador) or StringRegExp($sSeparador, "^[0-9]$") Then $sSeparador = $__GsSEP_DATA Local $sRegExp = "^" For $nIndice = 1 to StringLen($sFormato) Switch StringMid($sFormato, $nIndice, 1) Case "D" $sRegExp &= "(\d{2})" Case "M" $sRegExp &= "(\w{3})" Case "Y" $sRegExp &= "(\d{4})" EndSwitch If $nIndice < StringLen($sFormato) Then $sRegExp &= "\D" Next Local $aTemp = StringRegExp($sData_Hora, $sRegExp, $STR_REGEXPARRAYGLOBALMATCH) If @error Then Return SetError(2, 0, "Err") Local $sRetorno = "" For $nIndice = 1 to StringLen($sFormato) Switch StringMid($sFormato, $nIndice, 1) Case "D", "Y" $sRetorno &= $aTemp[$nIndice - 1] Case "M" $sRetorno &= __EXT2MONTH($aTemp[$nIndice - 1]) EndSwitch If $nIndice < StringLen($sFormato) Then $sRetorno &= $sSeparador Next Return SetError(0, 0, $sRetorno) EndFunc ;==>__EXP2DT ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __EXTRACT_DATA ; Description ...: Recupera a informacao adequada dependendo do formato escolhido ; Syntax ........: __EXTRACT_DATA($sData_Hora, $sFormato, $sEscolhido) ; Parameters ....: $sData_Hora = [String] Data onde deve ser extraido a informacao ; $sFormato = [String] Formato que esta a data (DMY e variantes) ; $sEscolhido = [String] Qual a informacao (D ou M ou Y) ; Return values .: Sucesso = [Number] Dia, mes ou ano ; Falha = [Number] 0 e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __EXTRACT_DATA("25/12/2001", "DMY", "M") ; return 12 ; __EXTRACT_DATA("12/25/2001", "MDY", "D") ; return 25 ; __EXTRACT_DATA("2001/12/25", "YMD", "Y") ; return 2001 ; =============================================================================================================================== Func __EXTRACT_DATA ($sData_Hora, $sFormato, $sEscolhido) If not IsString($sData_Hora) or $sData_Hora = "" Then Return SetError(1, 0, 0) Local $aTemp = StringSplit("DMY", "", $STR_NOCOUNT) If not IsString($sFormato) or _ArraySearch(_ArrayPermute($aTemp), $sFormato, 1) = -1 Then Return SetError(2, 0, 0) If not IsString($sEscolhido) or not StringRegExp($sEscolhido, "^[MDY]$") Then Return SetError(3, 0, 0) Local $sRegExp = "^" For $nIndice = 1 to StringLen($sFormato) Switch StringMid($sFormato, $nIndice, 1) Case "D", "M" $sRegExp &= "(\d{2})" Case "Y" $sRegExp &= "(\d{4})" EndSwitch Next Local $aTemp = StringRegExp(StringRegExpReplace($sData_Hora, "\D", ""), $sRegExp, $STR_REGEXPARRAYGLOBALMATCH) If @error Then Return SetError(4, @error, 0) Return SetError(0, 0, $aTemp[StringInStr($sFormato, $sEscolhido) - 1]) EndFunc ;==>__EXTRACT_DATA ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __VERIF_DATA ; Description ...: Verifica se a data eh valida ; Syntax ........: __VERIF_DATA($sData_Hora, $sFormato[, $bVazio = False]) ; Parameters ....: $sData_Hora = [String] Data a ser verificada ; $sFormato = [String] Formato da data (DMY e variantes) ; $bVazio = [Optional] a boolean value. Default is False. ; Return values .: Sucesso = [ ; Falha = [Number] 0 e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __VERIF_DATA("25/12/2001") ; return True ; __VERIF_DATA("25/15/2001") ; return False ; =============================================================================================================================== Func __VERIF_DATA ($sData_Hora, $sFormato, $bVazio = False) If not IsString($sData_Hora) Then Return SetError(1, 0, False) Local $aTemp = StringSplit("DMY", "", $STR_NOCOUNT) If not IsString($sFormato) or _ArraySearch(_ArrayPermute($aTemp), $sFormato, 1) = -1 Then Return SetError(2, 0, False) If $bVazio = Default or not IsBool($bVazio) Then $bVazio = False If $sData_Hora = "" Then Return SetError(0, 1, $bVazio) If not _DateIsValid(_MUDA_FORMATO_DATA($sData_Hora, $sFormato, "YMD")) Then Return SetError(3, 0, False) If __YEAR($sData_Hora, $sFormato) < 1900 or __YEAR($sData_Hora, $sFormato) > 2099 Then Return SetError(4, 0, False) Return SetError(0, 0, True) EndFunc ;==>__VERIF_DATA ; #FUNCTION# ==================================================================================================================== ; Name ..........: _MUDA_FORMATO_DATA ; Description ...: Modifica a data conforme o formato ; Syntax ........: _MUDA_FORMATO_DATA($sData_Hora, $sAntigo, $sNovo) ; Parameters ....: $sData_Hora = [String] Data a ser convertida ; $sAntigo = [String] formato DMY (ou variantes) ; $sNovo = [String] formato DMY (ou variantes) ; Return values .: Sucesso = [String] Data convertida ; Falha = [Number] "Err" e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: _MUDA_FORMATO_DATA("25/12/2001", "DMY", "MDY") ; return "12/25/2001" ; _MUDA_FORMATO_DATA("12/25/2001", "MDY", "YMD") ; return "2001/12/25" ; =============================================================================================================================== Func _MUDA_FORMATO_DATA ($sData_Hora, $sAntigo, $sNovo) If not IsString($sData_Hora) Then Return SetError(1, 0, "Err") If $sData_Hora = "" Then Return SetError(0, 1, "") Local $aTemp = StringSplit("DMY", "", $STR_NOCOUNT) If not IsString($sAntigo) or _ArraySearch(_ArrayPermute($aTemp), $sAntigo, 1) = -1 Then Return SetError(2, 0, "Err") If not IsString($sNovo) or _ArraySearch(_ArrayPermute($aTemp), $sNovo, 1) = -1 Then Return SetError(3, 0, "Err") If $sAntigo = $sNovo Then Return SetError(0, 0, $sData_Hora) Local $sRegExp = "^", $sSeparador = StringLeft(StringRegExpReplace($sData_Hora, "\d", ""), 1) For $nIndice = 1 to StringLen($sAntigo) Switch StringMid($sAntigo, $nIndice, 1) Case "D", "M" $sRegExp &= "(\d{2})" Case "Y" $sRegExp &= "(\d{4})" EndSwitch Next Local $aTemp = StringRegExp(StringRegExpReplace($sData_Hora, $sSeparador, ""), $sRegExp, $STR_REGEXPARRAYGLOBALMATCH) If @error Then Return SetError(4, @error, "Err") Local $sRetorno = "" For $nIndice = 1 to StringLen($sNovo) $sRetorno &= $aTemp[StringInStr($sAntigo, StringMid($sNovo, $nIndice, 1)) - 1] If $nIndice < StringLen($sNovo) Then $sRetorno &= $sSeparador Next Return SetError(0, 0, $sRetorno) EndFunc ;==>_MUDA_FORMATO_DATA ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __MASCARAS ; Description ...: Funcao principal ; Syntax ........: __MASCARAS($nWnd, $nMsg, $nwParam, $nlParam) ; Parameters ....: $nWnd = [Number] Nro da janela ; $nMsg = [Number] Mensagem interna ; $nwParam = [Number] 1o parametro padrao $VM_MESSAGE ; $nlParam = [Number] 2o parametro padrao $VM_MESSAGE ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; =============================================================================================================================== Func __MASCARAS ($nWnd, $nMsg, $nwParam, $nlParam) Local Static $nCampo = -1, $bAtivado = False, $sAnterior = "", $bDecimal = False Local $nWndFrom = $nlParam, $nIDFrom = _WinAPI_LoWord($nwParam), $nCode = _WinAPI_HiWord($nwParam) Local $nLimite, $nQuanto, $hControle, $sOriginal, $sFiller, $sConteudo, $bAjusta_Tamanho, $nPosicao, $tNMHDR, $sDiferenca, $nMaximo, $bNegativo If $nMsg = $WM_SHOWWINDOW Then If $nwParam = 1 Then ; ativou a janela via GUISetState(@SW_SHOW) $bAtivado = False ; to avoid double calls in $VM_COMMAND For $nCampo = 1 to UBound($__aInputs) - 1 If not $__aInputs[$nCampo][$__MASK_CONTROLE] Then __ArrayAdd2D($__aMascaras, "", "", "", "", "", "") ContinueLoop EndIf $nLimite = 0 $sAnterior = "" $hControle = Abs($__aInputs[$nCampo][$__MASK_CONTROLE]) $bAjusta_Tamanho = ($__aInputs[$nCampo][$__MASK_CONTROLE] > 0) $__aInputs[$nCampo][$__MASK_CONTROLE] = $hControle If $__aInputs[$nCampo][$__MASK_TIPO] = $INPUT_NUMBER Then __MONTA_MASCARAS("#" & __NUMBERFORMAT(_StringRepeat("9", $__aInputs[$nCampo][$__MASK_MASCARA]) & "." & _StringRepeat("9", $__aInputs[$nCampo][$__MASK_EXTRA]), $__aInputs[$nCampo][$__MASK_EXTRA]) & "#", ($__aInputs[$nCampo][$__MASK_EXTRA] > 0)) If $bAjusta_Tamanho Then __AJUSTA_TAMANHO($hControle, $__aMascaras[$nCampo][$__MASK_FILLER] & "'") If $__aInputs[$__MASK_PARAM][$__MASK_PREFORMAT] Then ; para formatar os campos GUICtrlSetData($hControle, __NUMBERFORMAT(StringRegExpReplace(GUICtrlRead($__aInputs[$nCampo][$__MASK_CONTROLE]), "[^.\d-]", ""), $__aInputs[$nCampo][$__MASK_EXTRA])) EndIf ElseIf $__aInputs[$nCampo][$__MASK_TIPO] = $INPUT_TEXT Then __MONTA_MASCARAS($__aInputs[$nCampo][$__MASK_MASCARA], False) $nLimite = StringLen($__aMascaras[$nCampo][$__MASK_FILLER]) GUICtrlSetLimit($hControle, $nLimite) If $__aInputs[$nCampo][$__MASK_EXTRA] > 0 and $__aInputs[$nCampo][$__MASK_EXTRA] < $nLimite Then $nLimite = $__aInputs[$nCampo][$__MASK_EXTRA] If $bAjusta_Tamanho Then __AJUSTA_TAMANHO($hControle, StringLeft($__aMascaras[$nCampo][$__MASK_FILLER], $nLimite)) If $__aInputs[$__MASK_PARAM][$__MASK_PREFORMAT] Then ; para formatar os campos $sConteudo = __DESFORMATA_CAMPO($nCampo, GUICtrlRead($__aInputs[$nCampo][$__MASK_CONTROLE])) ; precisa desformatar para garantir que o conteudo original nao esteja pre-formatado If $sConteudo <> "" Then GUICtrlSetData($__aInputs[$nCampo][$__MASK_CONTROLE], __FORMATA_CAMPO($nCampo, $sConteudo)) EndIf ElseIf $__aInputs[$nCampo][$__MASK_TIPO] = $INPUT_DATE Then If _WinAPI_GetClassName(GUICtrlGetHandle($__aInputs[$nCampo][$__MASK_CONTROLE])) <> "Edit" Then ; https://msdn.microsoft.com/pt-br/library/windows/desktop/bb761726(v=vs.85).aspx GUICtrlSendMsg($__aInputs[$nCampo][$__MASK_CONTROLE], $DTM_SETFORMATW, 0, $__aInputs[$nCampo][$__MASK_MASCARA]) $sFiller = __MONTA_MASC_DATA($__aInputs[$nCampo][$__MASK_MASCARA]) __MONTA_MASCARAS("#" & $sFiller & "#", False) If $bAjusta_Tamanho Then __AJUSTA_TAMANHO($hControle, $sFiller & "O00") $__aMascaras[$nCampo][$__MASK_FILLER] = $__aInputs[$nCampo][$__MASK_MASCARA] $__aInputs[$nCampo][$__MASK_EXTRA] = __MONTA_SEPARADOR_DATA($__aMascaras[$nCampo][$__MASK_FILLER]) $__aInputs[$nCampo][$__MASK_MASCARA] = __MONTA_FORMATO_DATA($__aMascaras[$nCampo][$__MASK_FILLER]) Else $sOriginal = $__aInputs[$nCampo][$__MASK_MASCARA] $__aInputs[$nCampo][$__MASK_MASCARA] = StringRegExpReplace($__aInputs[$nCampo][$__MASK_MASCARA], "(\w)(\w)(\w)", "$1" & $__aInputs[$nCampo][$__MASK_EXTRA] & "$2" & $__aInputs[$nCampo][$__MASK_EXTRA] & "$3") $sFiller = StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($__aInputs[$nCampo][$__MASK_MASCARA], "D", "99"), "M", "AAA"), "Y", "9999") $__aInputs[$nCampo][$__MASK_MASCARA] = "#" & StringRegExpReplace(StringRegExpReplace($__aInputs[$nCampo][$__MASK_MASCARA], "[DM]", "99"), "Y", "9999") & "#" GUICtrlSetLimit($hControle, StringLen($__aInputs[$nCampo][$__MASK_MASCARA]) - 2) __MONTA_MASCARAS($__aInputs[$nCampo][$__MASK_MASCARA], False) $__aInputs[$nCampo][$__MASK_MASCARA] = $sOriginal $__aMascaras[$nCampo][$__MASK_FILLER] = "dd/MMM/yyyy" If $bAjusta_Tamanho Then __AJUSTA_TAMANHO($hControle, $sFiller) If $__aInputs[$__MASK_PARAM][$__MASK_PREFORMAT] Then ; para formatar os campos $sConteudo = __DESFORMATA_CAMPO($nCampo, GUICtrlRead($__aInputs[$nCampo][$__MASK_CONTROLE])) ; precisa desformatar para garantir que o conteudo original nao esteja pre-formatado If $sConteudo <> "" Then GUICtrlSetData($__aInputs[$nCampo][$__MASK_CONTROLE], __DT2EXP($sConteudo, $__aInputs[$nCampo][$__MASK_MASCARA], $__aInputs[$nCampo][$__MASK_EXTRA])) EndIf EndIf EndIf Next $bAtivado = True ElseIf $nwParam = 0 Then ; desativou a janela via GUISetState(@SW_HIDE) If $bAtivado Then $bAtivado = False ; to avoid double calls in $VM_COMMAND __DESFORMATA_TUDO() EndIf EndIf ElseIf $nMsg = $WM_COMMAND and $bAtivado Then If $nCode = $EN_SETFOCUS Then ; entrou no campo For $nCampo = 1 to UBound($__aInputs) - 1 ; ignora 1a linha If GUICtrlGetHandle(Abs($__aInputs[$nCampo][$__MASK_CONTROLE])) = $nWndFrom Then ; identifica campo GUICtrlSetBkColor($__aInputs[$nCampo][$__MASK_CONTROLE], $__INPUT_COLOR) If $__aInputs[$nCampo][$__MASK_TIPO] = $INPUT_DATE Then $sConteudo = __DESFORMATA_CAMPO($nCampo, __EXP2DT(GUICtrlRead($__aInputs[$nCampo][$__MASK_CONTROLE]), $__aInputs[$nCampo][$__MASK_MASCARA], $__aInputs[$nCampo][$__MASK_EXTRA])) If $sConteudo <> "" Then GUICtrlSetData($__aInputs[$nCampo][$__MASK_CONTROLE], __FORMATA_CAMPO($nCampo, $sConteudo)) Send("^+{HOME}") EndIf $sAnterior = GUICtrlRead($__aInputs[$nCampo][$__MASK_CONTROLE]) $bDecimal = False ExitLoop EndIf Next ElseIf $nCode = $EN_CHANGE Then ; mudou o campo If $nCampo > 0 and $nCampo < UBound($__aInputs) Then $nQuanto = 0 $nPosicao = 0 $sOriginal = GUICtrlRead($__aInputs[$nCampo][$__MASK_CONTROLE]) $sDiferenca = __StringDifference($sAnterior, $sOriginal) $sConteudo = __DESFORMATA_CAMPO($nCampo, $sOriginal) If $__aInputs[$nCampo][$__MASK_TIPO] = $INPUT_NUMBER Then $bNegativo = (StringLeft($sOriginal, 1) = "-" or Number($sConteudo) < 0) If $bNegativo Then $sConteudo = $sConteudo * -1 $sConteudo = __FORMATA_CAMPO($nCampo, $sConteudo) $nMaximo = Number(__DESFORMATA_CAMPO($nCampo, $__aMascaras[$nCampo][$__MASK_FILLER])) If $__aInputs[$nCampo][$__MASK_EXTRA] > 0 Then $nQuanto = $__aInputs[$nCampo][$__MASK_EXTRA] If $sDiferenca = "." or $sDiferenca = $__GsSEP_DECIMAL Then If $sOriginal = "." or $sOriginal = $__GsSEP_DECIMAL or StringInStr($sOriginal, $__GsSEP_DECIMAL) Then $sConteudo = StringTrimRight($sConteudo, $__aInputs[$nCampo][$__MASK_EXTRA]) Else $nQuanto += 1 $sConteudo = StringTrimRight($sOriginal, $__aInputs[$nCampo][$__MASK_EXTRA]) & $__GsSEP_DECIMAL EndIf $sConteudo &= _StringRepeat("0", $__aInputs[$nCampo][$__MASK_EXTRA]) Else If StringRegExp($sOriginal, $__GsSEP_DECIMAL & "0{" & $__aInputs[$nCampo][$__MASK_EXTRA] + 1 & "}$") Then $nQuanto -= 1 Else $nQuanto = 0 If StringInStr($sConteudo, $__GsSEP_DECIMAL) Then For $nIndice = $__aInputs[$nCampo][$__MASK_EXTRA] to 1 Step -1 If StringRegExp($sConteudo, "0{" & $nIndice & "}$") Then $nQuanto = $nIndice ExitLoop EndIf Next If $nQuanto = $__aInputs[$nCampo][$__MASK_EXTRA] Then $nQuanto += 1 EndIf EndIf EndIf EndIf If Number(__DESFORMATA_CAMPO($nCampo, $sConteudo)) > $nMaximo Then GUICtrlSetData($__aInputs[$nCampo][$__MASK_CONTROLE], $sAnterior) ElseIf $sDiferenca = "-" Then If $bNegativo Then $sConteudo = __DESFORMATA_CAMPO($nCampo, $sConteudo) Else $sConteudo = __DESFORMATA_CAMPO($nCampo, "-" & $sConteudo) EndIf GUICtrlSetData($__aInputs[$nCampo][$__MASK_CONTROLE], __FORMATA_CAMPO($nCampo, Number($sConteudo))) Else If $bNegativo Then $sConteudo = "-" & $sConteudo $sConteudo = __DESFORMATA_CAMPO($nCampo, $sConteudo) GUICtrlSetData($__aInputs[$nCampo][$__MASK_CONTROLE], __FORMATA_CAMPO($nCampo, Number($sConteudo))) EndIf Else While $nPosicao < StringLen($sConteudo) If StringRegExp(StringLeft($sConteudo, $nPosicao + 1), "^" & ($__aMascaras[$nCampo][$__MASK_INPUT])[$nPosicao]) Then $nPosicao += 1 Else $nQuanto = StringLen($sOriginal) - StringInStr($sOriginal, StringMid($sConteudo, $nPosicao + 1, 1), 1, 1) $sConteudo = StringReplace($sConteudo, StringMid($sConteudo, $nPosicao + 1, 1), "") $nPosicao = 0 EndIf WEnd GUICtrlSetData($__aInputs[$nCampo][$__MASK_CONTROLE], __FORMATA_CAMPO($nCampo, $sConteudo)) EndIf If $nQuanto > 0 Then Send("{LEFT " & $nQuanto & "}") $sAnterior = GUICtrlRead($__aInputs[$nCampo][$__MASK_CONTROLE]) EndIf ElseIf $nCode = $EN_KILLFOCUS Then ; saiu do campo APOS a validacao no loop principal If $nCampo > 0 and $nCampo < UBound($__aInputs) Then GUICtrlSetBkColor($__aInputs[$nCampo][$__MASK_CONTROLE], $CLR_DEFAULT) If $__aInputs[$nCampo][$__MASK_TIPO] = $INPUT_DATE Then $sConteudo = __DESFORMATA_CAMPO($nCampo, GUICtrlRead($__aInputs[$nCampo][$__MASK_CONTROLE])) If StringLen($sConteudo) < 8 Then $sConteudo = __COMPLETA_DATA($sConteudo, $__aInputs[$nCampo][$__MASK_MASCARA]) If __VERIF_DATA(__FORMATA_CAMPO($nCampo, $sConteudo), $__aInputs[$nCampo][$__MASK_MASCARA], True) Then GUICtrlSetData($__aInputs[$nCampo][$__MASK_CONTROLE], __DT2EXP($sConteudo, $__aInputs[$nCampo][$__MASK_MASCARA], $__aInputs[$nCampo][$__MASK_EXTRA])) Else GUICtrlSetBkColor($__aInputs[$nCampo][$__MASK_CONTROLE], $__INPUT_COLOR) ControlFocus($nWnd, "", $nWndFrom) Send("^+{HOME}") EndIf EndIf EndIf EndIf ElseIf $nMsg = $WM_SYSCOMMAND Then If $nwParam = $SC_CLOSE Then ; fechou a janela If $bAtivado Then $bAtivado = False ; to avoid double calls in $VM_COMMAND __DESFORMATA_TUDO() EndIf EndIf EndIf Return $GUI_RUNDEFMSG EndFunc ;==>__MASCARAS ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __MONTA_MASCARAS ; Description ...: Cria as expressoes Regex necessarias para o recebimento das mascaras ; Syntax ........: __MONTA_MASCARAS($sMascara, $bNumero) ; Parameters ....: $sMascara = [String] Mascara para converter em RexExp ; $bNumero = [Boolean] Se eh um numero (formato numerico) ; Return values .: Sucesso = [Array of Strings] Array contendo as RegExp para serem usadas na __MASCARAS ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; =============================================================================================================================== Func __MONTA_MASCARAS ($sMascara, $bNumero) Local $bMacro = False If StringRegExp($sMascara, "^#.+#$") Then $bMacro = True $sMascara = StringTrimLeft(StringTrimRight($sMascara, 1), 1) If not StringRegExp($sMascara, "[@9aAxXhH]]") Then ; mascaras simples tipo AAA-9999 ou 99/99/9999 If StringInStr($sMascara, "@") Then $sMascara = StringReplace($sMascara, "@", "[@]1%&%&%&") If StringInStr($sMascara, "9") Then $sMascara = StringReplace($sMascara, "9", "[9]1%&%&%&") If StringInStr($sMascara, "a", $STR_CASESENSE) Then $sMascara = StringReplace($sMascara, "a", "[a]1%&%&%&", 0, $STR_CASESENSE) If StringInStr($sMascara, "A", $STR_CASESENSE) Then $sMascara = StringReplace($sMascara, "A", "[A]1%&%&%&", 0, $STR_CASESENSE) If StringInStr($sMascara, "x", $STR_CASESENSE) Then $sMascara = StringReplace($sMascara, "x", "[x]1%&%&%&", 0, $STR_CASESENSE) If StringInStr($sMascara, "X", $STR_CASESENSE) Then $sMascara = StringReplace($sMascara, "X", "[X]1%&%&%&", 0, $STR_CASESENSE) If StringInStr($sMascara, "h", $STR_CASESENSE) Then $sMascara = StringReplace($sMascara, "h", "[h]1%&%&%&", 0, $STR_CASESENSE) If StringInStr($sMascara, "H", $STR_CASESENSE) Then $sMascara = StringReplace($sMascara, "H", "[H]1%&%&%&", 0, $STR_CASESENSE) EndIf EndIf Local $aMascara = StringRegExp($sMascara, "((\[.+?])(\d{1,3}))", $STR_REGEXPARRAYGLOBALMATCH) For $nGrupo = 0 to UBound($aMascara) - 1 Step 3 $sMascara = StringReplace($sMascara, $aMascara[$nGrupo], _StringRepeat($aMascara[$nGrupo + 1], $aMascara[$nGrupo + 2]), 1) Next If $bMacro Then $sMascara = StringRegExpReplace($sMascara, "(\[[@9aAxXhH]+])%&%&%&", "$1") Local $sSeps = $sMascara Local $aGrupos = StringRegExp($sMascara, "((?:\[.+?])+)", $STR_REGEXPARRAYGLOBALMATCH) If @error Then Local $aSeps[0] Local $aGrupos = [ $sMascara ] Else $sSeps = StringRegExpReplace($sMascara, "((?:\[.+?])+)", "%&%&%&") If $sSeps = "" Then Local $aSeps[0] Else Local $aSeps = StringSplit($sSeps, "%&%&%&", $STR_ENTIRESPLIT + $STR_NOCOUNT) Local $aDel = _ArrayFindAll($aSeps, "") _ArrayInsert($aDel, 0, UBound($aDel)) _ArrayDelete($aSeps, $aDel) EndIf EndIf Local $bPrefixo = False If UBound($aSeps) > 0 Then $bPrefixo = StringRegExp($sMascara, "^" & __TRATAMENTO($aSeps[0])) ; StringRegExpReplace($aSeps[0], "([" & $sTratamento & "])", "\\$1") Local $sFormato = "", $sTroca = $sMascara For $nGrupo = 0 to UBound($aGrupos) - 1 If $nGrupo = 0 and not $bPrefixo Then $sFormato &= "(" & $aGrupos[$nGrupo] & ")" Else $aSubGrupos = StringRegExp($aGrupos[$nGrupo], "\[[^[]+]", $STR_REGEXPARRAYGLOBALMATCH) $sFormato &= "(" & $aSubGrupos[0] For $nPosicao = 1 to UBound($aSubGrupos) - 1 $sFormato &= $aSubGrupos[0] & "?" Next $sFormato &= ")" If $nGrupo > 0 Then $sFormato &= "?" EndIf $sTroca = StringReplace($sTroca, $aGrupos[$nGrupo], "$" & $nGrupo + 1, 1) Next If $sTroca = "$1" Then $sTroca = "" Local $sLimpa = "" For $nSep = 0 to UBound($aSeps) - 1 If StringLen($aSeps[$nSep]) = 1 Then $sLimpa &= __TRATAMENTO($aSeps[$nSep]) & "?" Else $sLimpa &= "(?:" & __TRATAMENTO($aSeps[$nSep]) & ")?" EndIf Next $sLimpa = StringTrimRight($sLimpa, 1) & "?$" Local $sDesformato = "" If $sLimpa = "?$" Then $sLimpa = "" Else Local $aDesformato = _ArrayUnique($aSeps, Default, Default, Default, $ARRAYUNIQUE_NOCOUNT) If $bNumero Then _ArrayDelete($aDesformato, UBound($aDesformato) - 1) For $nSep = 0 to UBound($aDesformato) - 1 If $nSep > 0 Then $sDesformato &= "|" $sDesformato &= __TRATAMENTO($aDesformato[$nSep]) Next EndIf If $bMacro Then If StringInStr($sFormato, "[9]") Then $sFormato = StringReplace($sFormato, "[9]", "[\d]") If StringInStr($sFormato, "[@]") Then $sFormato = StringReplace($sFormato, "[@]", "[\x20-\x7E]") ; qualquer coisa do ASCII 32 (espaco) ate o ASCII 126 (til) If StringInStr($sFormato, "[a]", $STR_CASESENSE) Then $sFormato = StringReplace($sFormato, "[a]", "[a-z]", 0, $STR_CASESENSE) If StringInStr($sFormato, "[A]", $STR_CASESENSE) Then $sFormato = StringReplace($sFormato, "[A]", "[A-Z]", 0, $STR_CASESENSE) If StringInStr($sFormato, "[x]", $STR_CASESENSE) Then $sFormato = StringReplace($sFormato, "[x]", "[a-z0-9]", 0, $STR_CASESENSE) If StringInStr($sFormato, "[X]", $STR_CASESENSE) Then $sFormato = StringReplace($sFormato, "[X]", "[A-Z0-9]", 0, $STR_CASESENSE) If StringInStr($sFormato, "[h]", $STR_CASESENSE) Then $sFormato = StringReplace($sFormato, "[h]", "[a-z0-9]", 0, $STR_CASESENSE) If StringInStr($sFormato, "[H]", $STR_CASESENSE) Then $sFormato = StringReplace($sFormato, "[H]", "[A-F0-9]", 0, $STR_CASESENSE) EndIf Local $sInput = "", $aInput[0], $aCaracteres If StringRegExp($sMascara, "[@9aAxXhH]]") Then ; mascaras simples tipo AAA-9999 ou 99/99/9999 $aCaracteres = StringRegExp($sFormato, "\[.+?]", $STR_REGEXPARRAYGLOBALMATCH) Else $aCaracteres = StringRegExp($sMascara, ".", $STR_REGEXPARRAYGLOBALMATCH) EndIf For $nIndice = 0 to UBound($aCaracteres) - 1 $sInput &= $aCaracteres[$nIndice] _ArrayAdd($aInput, $sInput) Next Local $sFiller = $sMascara $aCaracteres = StringRegExp($sMascara, "\[[^]]+]", $STR_REGEXPARRAYGLOBALMATCH) For $sConteudo in $aCaracteres If StringRegExp($sConteudo, "[A-GI-Z]") Then ; tudo menos H $sFiller = StringReplace($sFiller, $sConteudo, "O", 1) ; letra O maiuscula Else $sFiller = StringReplace($sFiller, $sConteudo, "9", 1) ; letra O maiuscula EndIf Next __ArrayAdd2D($__aMascaras, $sFormato, $sTroca, $sLimpa, $sDesformato, $aInput, $sFiller) Return SetError(0, 0, $__aMascaras) EndFunc ;==>__MONTA_MASCARAS ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __TRATAMENTO ; Description ...: Funcao auxiliar para tratar certos carcteres na RegExp ; Syntax ........: __TRATAMENTO($sRegExp) ; Parameters ....: $sRegExp = [String] Caracter a ser verificado ; Return values .: Sucesso = [String] Expressao RegExp adequada ; Falha = [String] Mesmo caracter de entrada e seta @error cfe erro ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __TRATAMENTO("x") ; return "x" ; __TRATAMENTO(".") ; return "\." ; =============================================================================================================================== Func __TRATAMENTO ($sRegExp) Local Const $TRATAMENTO = "/\.()+-" ; lista de caracteres que precisam tratamento especial Return SetError(@error, @extended, StringRegExpReplace($sRegExp, "([" & $TRATAMENTO & "])", "\\$1")) EndFunc ;==>__TRATAMENTO ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __DESFORMATA_CAMPO ; Description ...: Funcao para remover as formatacoes do campo ; Syntax ........: __DESFORMATA_CAMPO($nCampo, $sConteudo) ; Parameters ....: $nCampo = [Number] Nro do campo ; $sConteudo = [String] Conteudo a ser limpo ; Return values .: Sucesso = [String] Conteudo limpo ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __DESFORMATA_CAMPO("12.345-678") ; return "12345678" ; __DESFORMATA_CAMPO("ABC-1234") ; return "ABC1234" ; =============================================================================================================================== Func __DESFORMATA_CAMPO ($nCampo, $sConteudo) If $sConteudo = "" Then Return SetError(0, 1, "") $sConteudo = StringRegExpReplace($sConteudo, $__aMascaras[$nCampo][$__MASK_DESFORMATO], "") If $__aInputs[$nCampo][$__MASK_TIPO] = $INPUT_NUMBER Then $sConteudo = __Trunc(StringReplace($sConteudo, $__GsSEP_DECIMAL, "."), $__aInputs[$nCampo][$__MASK_EXTRA]) Return SetError(0, 0, $sConteudo) EndFunc ;==>__DESFORMATA_CAMPO ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __FORMATA_CAMPO ; Description ...: Formata campo de acordo com a mascara correta ; Syntax ........: __FORMATA_CAMPO($nCampo, $sConteudo) ; Parameters ....: $nCampo = [Number] Nro do campo a ser formatado ; $sConteudo = [String] Conteudo do campo ; Return values .: Sucesso = [String] Conteudo formatado ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __FORMATA_CAMPO("12345678") ; return "12.345-678" ; __FORMATA_CAMPO("ABC1234") ; return "ABC-1234" ; =============================================================================================================================== Func __FORMATA_CAMPO ($nCampo, $sConteudo) If $__aInputs[$nCampo][$__MASK_TIPO] = $INPUT_NUMBER Then Return SetError(0, 0, __NUMBERFORMAT($sConteudo, $__aInputs[$nCampo][$__MASK_EXTRA])) If $sConteudo = "" Then Return SetError(0, 1, "") If $__aMascaras[$nCampo][$__MASK_TROCA] = "" Then Return SetError(0, 0, $sConteudo) ElseIf $__aMascaras[$nCampo][$__MASK_LIMPA] = "" Then Return SetError(0, 0, StringRegExpReplace($sConteudo, $__aMascaras[$nCampo][$__MASK_FORMATO], $__aMascaras[$nCampo][$__MASK_TROCA])) Else Return SetError(0, 0, StringRegExpReplace(StringRegExpReplace($sConteudo, $__aMascaras[$nCampo][$__MASK_FORMATO], $__aMascaras[$nCampo][$__MASK_TROCA]), $__aMascaras[$nCampo][$__MASK_LIMPA], "")) EndIf EndFunc ;==>__FORMATA_CAMPO ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __DESFORMATA_DATA ; Description ...: Converte data estilo (GUICtrlCreateDate) para valor ; Syntax ........: __DESFORMATA_DATA($nCampo, $sConteudo) ; Parameters ....: $nCampo = [Number] Nro do campo ; $sConteudo = [String] Conteudo a ser convertido ; Return values .: Sucesso = [String] Data no formato DMY (ou variantes) ; Falha = [Number] "" (vazio) e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; =============================================================================================================================== Func __DESFORMATA_DATA ($nCampo, $sConteudo) Local $sPeriodo, $sTexto = "", $sDesformato = "", $sFormato = $__aInputs[$nCampo][$__MASK_MASCARA] Local $sSeparador = __TRATAMENTO($__aInputs[$nCampo][$__MASK_EXTRA]) If @error Then Return SetError(1, 0, "") Local $aPeriodo = StringRegExp($sConteudo, "^([^" & $sSeparador & "]+)" & $sSeparador & "([^" & $sSeparador & "]+)" & $sSeparador & "([^" & $sSeparador & "]+)$", $STR_REGEXPARRAYGLOBALMATCH) If @error Then Return SetError(2, 0, "") For $nPeriodo = 0 to UBound($aPeriodo) - 1 $sPeriodo = $aPeriodo[$nPeriodo] If StringMid($sFormato, $nPeriodo + 1, 1) = "D" Then If StringIsDigit($sPeriodo) Then $sTexto &= StringFormat("%02d", $sPeriodo) Else $sTexto &= __EXT2DOW($sPeriodo) EndIf $sDesformato &= "dd" ElseIf StringMid($sFormato, $nPeriodo + 1, 1) = "M" Then If StringIsDigit($sPeriodo) Then $sTexto &= StringFormat("%02d", $sPeriodo) Else $sTexto &= __EXT2MONTH($sPeriodo) EndIf $sDesformato &= "MM" ElseIf StringMid($sFormato, $nPeriodo + 1, 1) = "Y" Then $sTexto &= $sPeriodo $sDesformato &= "yyyy" EndIf Next If _WinAPI_GetClassName(GUICtrlGetHandle($__aInputs[$nCampo][$__MASK_CONTROLE])) = "Edit" Then Return SetError(0, 1, $sTexto) Return SetError(0, 2, $sDesformato) EndFunc ;==>__DESFORMATA_DATA ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __COMPLETA_DATA ; Description ...: Completa (preenche) a data conforme o que foi digitado ; Syntax ........: __COMPLETA_DATA($sConteudo, $sFormato) ; Parameters ....: $sConteudo = [String] Data ; $sFormato = [String] Data "preenchida" (inclusao de dia, mes ou ano conforme o caso) - data atual ; Return values .: Sucesso = [String] Data completa ; Falha = [String] Mesma contedo que recebeu e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __COMPLETA_DATA("25") ; return "25122001" ; __COMPLETA_DATA("255") ; return "25052001" ; =============================================================================================================================== Func __COMPLETA_DATA ($sConteudo, $sFormato) Local $nTamanho = StringLen($sConteudo) Switch $nTamanho Case 1,2 If $nTamanho = 1 Then $sConteudo = "0" & $sConteudo If StringLeft($sFormato, 1) = "D" Then If StringRight($sFormato, 1) = "M" Then $sConteudo &= @YEAR & @MON Else $sConteudo &= @MON & @YEAR EndIf ElseIf StringLeft($sFormato, 1) = "M" Then If StringRight($sFormato, 1) = "D" Then $sConteudo &= @YEAR & @MDAY Else $sConteudo &= @MDAY & @YEAR EndIf Else $sConteudo = "20" & $sConteudo If StringRight($sFormato, 1) = "D" Then $sConteudo &= @MON & @MDAY Else $sConteudo &= @MDAY & @MON EndIf EndIf Case 3 If StringLeft($sFormato, 1) = "D" Then If StringRight($sFormato, 1) = "M" Then Return SetError(1, 0, $sConteudo) ElseIf StringLeft($sFormato, 1) = "M" Then If StringRight($sFormato, 1) = "D" Then Return SetError(1, 0, $sConteudo) Else Return SetError(1, 0, $sConteudo) EndIf $sConteudo = _StringInsert($sConteudo, "0", 2) & @YEAR Case 4 If StringLeft($sFormato, 1) = "D" Then If StringRight($sFormato, 1) = "Y" Then $sConteudo &= @YEAR Else $sConteudo = StringLeft($sConteudo, 2) & __AJUSTA_ANO(StringRight($sConteudo, 2)) & StringRight($sConteudo, 2) & @MON EndIf ElseIf StringLeft($sFormato, 1) = "M" Then If StringRight($sFormato, 1) = "Y" Then $sConteudo &= @YEAR Else $sConteudo = StringLeft($sConteudo, 2) & __AJUSTA_ANO(StringRight($sConteudo, 2)) & StringRight($sConteudo, 2) & @MDAY EndIf Else If StringRight($sFormato, 1) = "D" Then $sConteudo &= @MON & @MDAY Else $sConteudo &= @MDAY & @MON EndIf EndIf Case 5 If StringLeft($sFormato, 1) = "D" Then If StringRight($sFormato, 1) = "Y" Then Return SetError(1, 0, $sConteudo) $sConteudo = "0" & $sConteudo & @MON ElseIf StringLeft($sFormato, 1) = "M" Then If StringRight($sFormato, 1) = "Y" Then Return SetError(1, 0, $sConteudo) $sConteudo = "0" & $sConteudo & @MDAY Else $sConteudo = _StringInsert($sConteudo, "0", 4) If StringRight($sFormato, 1) = "D" Then $sConteudo &= @MDAY Else $sConteudo &= @MON EndIf EndIf Case 6 If StringLeft($sFormato, 1) = "D" Then If StringRight($sFormato, 1) = "Y" Then $sConteudo = StringLeft($sConteudo, 4) & __AJUSTA_ANO(StringRight($sConteudo, 2)) & StringRight($sConteudo, 2) Else $sConteudo &= @MON EndIf ElseIf StringLeft($sFormato, 1) = "M" Then If StringRight($sFormato, 1) = "Y" Then $sConteudo = StringLeft($sConteudo, 4) & __AJUSTA_ANO(StringRight($sConteudo, 2)) & StringRight($sConteudo, 2) Else $sConteudo &= @MDAY EndIf Else If StringRight($sFormato, 1) = "D" Then $sConteudo &= @MDAY Else $sConteudo &= @MON EndIf EndIf Case 7 If StringLeft($sFormato, 1) = "D" Then If StringRight($sFormato, 1) = "Y" Then Return SetError(1, 0, $sConteudo) ElseIf StringLeft($sFormato, 1) = "M" Then If StringRight($sFormato, 1) = "Y" Then Return SetError(1, 0, $sConteudo) EndIf $sConteudo = _StringInsert($sConteudo, "0", 6) EndSwitch Return SetError(0, 0, $sConteudo) EndFunc ;==>__COMPLETA_DATA ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __AJUSTA_ANO ; Description ...: Reconhece e completa ano com 19 ou 20 na frente. Ate 10 anos de hoje = 20, alem disso = 19 ; Syntax ........: __AJUSTA_ANO($sAno) ; Parameters ....: $sAno = [String] Ano a ser completado ; Return values .: Sucesso = [String] Ano completado ; Falha = [String] "" (vazio) e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __AJUSTA_ANO("73") ; return "1973" ; __AJUSTA_ANO("25") ; return "2025" ; =============================================================================================================================== Func __AJUSTA_ANO ($sAno) If not IsString($sAno) or $sAno = "" Then Return SetError(1, 0, "") If Number("20" & $sAno) > @YEAR + 10 Then Return SetError(0, 1, "19") Return SetError(0, 2, "20") EndFunc ;==>__AJUSTA_ANO ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __DESFORMATA_TUDO ; Description ...: Desformata todos os campos apos o fechamento da janela ; Syntax ........: __DESFORMATA_TUDO() ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; =============================================================================================================================== Func __DESFORMATA_TUDO () If not $__aInputs[$__MASK_PARAM][$__MASK_POSTFORMAT] Then ; para desformatar os campos For $nCampo = 1 to UBound($__aInputs) - 1 If $__aInputs[$nCampo][$__MASK_CONTROLE] > 0 Then If $__aInputs[$nCampo][$__MASK_TIPO] = $INPUT_DATE Then If _WinAPI_GetClassName(GUICtrlGetHandle($__aInputs[$nCampo][$__MASK_CONTROLE])) = "Edit" Then GUICtrlSetData($__aInputs[$nCampo][$__MASK_CONTROLE], __DESFORMATA_DATA($nCampo, GUICtrlRead($__aInputs[$nCampo][$__MASK_CONTROLE]))) Else GUICtrlSendMsg($__aInputs[$nCampo][$__MASK_CONTROLE], $DTM_SETFORMATW, 0, __DESFORMATA_DATA($nCampo, GUICtrlRead($__aInputs[$nCampo][$__MASK_CONTROLE]))) EndIf Else GUICtrlSetData($__aInputs[$nCampo][$__MASK_CONTROLE], __DESFORMATA_CAMPO($nCampo, GUICtrlRead($__aInputs[$nCampo][$__MASK_CONTROLE]))) EndIf EndIf Next EndIf EndFunc ;==>__DESFORMATA_TUDO ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __PEGA_LARGURA ; Description ...: Retorna a largura calculada do controle dependendo da fonte, tamanho e caracteristicas ; Syntax ........: __PEGA_LARGURA($nControle[, $sFiller = ""]) ; Parameters ....: $nControle = [Number] Nro do campo (controle) ; $sFiller = [Optional, String] Mascara a ser considerada se diferente do conteudo do campo. Default conteudo do campo ; Return values .: Sucesso = [Number] Largura correta ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; =============================================================================================================================== Func __PEGA_LARGURA ($nControle, $sFiller = "") Return TXT2PIXEL($nControle, $sFiller)[0] EndFunc ;==>__PEGA_LARGURA ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __PEGA_ALTURA ; Description ...: Retorna a altura calculada do controle dependendo da fonte, tamanho e caracteristicas ; Syntax ........: __PEGA_ALTURA($nControle[, $sFiller = ""]) ; Parameters ....: $nControle = [Number] Nro do campo (controle) ; $sFiller = [Optional, String] Mascara a ser considerada se diferente do conteudo do campo. Default conteudo do campo ; Return values .: Sucesso = [Number] Altura correta ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; =============================================================================================================================== Func __PEGA_ALTURA ($nControle, $sFiller = "") Return TXT2PIXEL($nControle, $sFiller)[1] EndFunc ;==>__PEGA_ALTURA ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __AJUSTA_TAMANHO ; Description ...: Ajusta o tamanho do campo para conter o conteudo certo dependendo da fonte, tamanho e caracteristicas ; Syntax ........: __AJUSTA_TAMANHO($nControle[, $sFiller = ""[, $bMargens = True]]) ; Parameters ....: $nControle = [Number] Nro do campo (controle) ; $sFiller = [Optional, String] Mascara a ser considerada se diferente do conteudo do campo. Default conteudo do campo ; $bMargens = [Optional, [Boolean] Se deve adicionar um extra de margens (arredondamento). Default False ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; =============================================================================================================================== Func __AJUSTA_TAMANHO ($nControle, $sFiller = "", $bMargens = True) If $nControle = 0 Then Return Local Enum $nPIX_LARGURA, $nPIX_ALTURA Local $aTamanho = TXT2PIXEL($nControle, $sFiller, $bMargens) If not @error Then GUICtrlSetPos($nControle, Default, Default, $aTamanho[$nPIX_LARGURA], $aTamanho[$nPIX_ALTURA]) If not $__aInputs[$__MASK_PARAM][$__MASK_PREFORMAT] Then GUICtrlSetData($nControle, GUICtrlRead($nControle)) ; to adjust text inside the control EndIf EndFunc ;==>__AJUSTA_TAMANHO ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __TXT2PIXEL ; Description ...: Calcula o tamanho em pixels de uma string levando em conta as caracteristicas da fonte usada ; Syntax ........: __TXT2PIXEL($nControle) ; Parameters ....: $nControle = [Number] Codigo do controle (label, input...) ; $sTexto = [Optional, String] String para considerar o tamanho. Default is texto do controle ; Return values .: Sucesso = [Array] Contendo a largura e a altura em pixels ; Falha = [Number] 0 e seta @error: ; 1 = parâmetro incorreto ; 2 = erro de handle ; 3 = erro de DLL na DC (Device Context) e seta @extended ; 1 = erro na chamada do DC ; 2 = erro no GetFont ($VM_GETFONT) ; 3 = erro no SelectObject ; 4 = erro no calcular o tamanho (GetTextExtentPoint32) ; 5 = erro no recuperar as configs (2o SelectObject) ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Based on code from Melba23 (https://www.autoitscript.com/forum/profile/38576-melba23/) and Trancexx (https://www.autoitscript.com/forum/profile/33569-trancexx/) ; Example .......: __TXT2PIXEL($nLabel) ; returns [ width, height ] do label previamente definido via GUICtrlCreateLabel ; __TXT2PIXEL($nInput) ; returns [ width, height ] do input previamente definido via GUICtrlCreateInput ; =============================================================================================================================== Func TXT2PIXEL ($nControle, $sTexto = "", $bMargens = True) Local Const $aVazio = [ 0, 0 ] If not IsNumber($nControle) or $nControle <= 0 Then Return SetError(1, 0, $aVazio) If $sTexto = Default or not IsString($sTexto) or $sTexto = "" Then $sTexto = GUICtrlRead($nControle) & " " ; pega o texto associado If $bMargens = Default or not IsBool($bMargens) Then $bMargens = True $nControle = GUICtrlGetHandle($nControle) ; transforma no handle If $nControle = 0 Then Return SetError(2, 0, $aVazio) Local $hDC = _WinAPI_GetDC($nControle) ; pega o DC (Device Context) do controle => https://msdn.microsoft.com/en-us/library/dd144871(v=vs.85).aspx If $hDC = 0 Then Return SetError(3, 1, $aVazio) Local $nLargura = _WinAPI_GetDeviceCaps($hDC, 90) ; LOGPIXELSY = nro de pixels por polegada logica considerando o tamanho do desktop => https://msdn.microsoft.com/pt-br/library/windows/desktop/dd144877(v=vs.85).aspx Local $hFonte = _SendMessage($nControle, $WM_GETFONT) ; pega as informacoes da fonte If @error Then Return SetError(3, __TXT2PIXEL_ERROR(2, $nControle, $hDC), $aVazio) Local $hSelectObject = _WinAPI_SelectObject($hDC, $hFonte) ; seleciona a fonte e guarda a anterior => https://msdn.microsoft.com/en-us/library/dd162957(v=vs.85).aspx If $hSelectObject <= 0 Then SetError(3, __TXT2PIXEL_ERROR(3, $nControle, $hDC, $hFonte), $aVazio) Local $aTamanho = _WinAPI_GetTextExtentPoint32($hDC, $sTexto); & "'") ; pega o tamanho => https://msdn.microsoft.com/en-us/library/dd144938(v=vs.85).aspx If @error Then Return SetError(3, __TXT2PIXEL_ERROR(4, $nControle, $hDC, $hFonte), $aVazio) _WinAPI_SelectObject($hDC, $hSelectObject) ; restaura as configuracoes anteriores If $hSelectObject <= 0 Then Return SetError(3, __TXT2PIXEL_ERROR(5, $nControle, $hDC, $hFonte), $aVazio) _WinAPI_ReleaseDC($nControle, $hDC) ; libera o DC => https://msdn.microsoft.com/en-us/library/dd144871(v=vs.85).aspx If not $bMargens Then Local $aRetorno[2] = [ DllStructGetData($aTamanho, 1), DllStructGetData($aTamanho, 2) ] ; pega a largura (width) e a altura (height) Else Local $nMargem = $nLargura * StringLen($sTexto) / 72 ; calculo de unidades logicas de pixels pelo tamanho da fonte $nMargem = Floor($nMargem / 2) ; Ajuste da margem adicional para 1/2 de caracter Local $aRetorno[2] = [ DllStructGetData($aTamanho, 1) + $nMargem, DllStructGetData($aTamanho, 2) + 4 ] ; pega a largura (width) e a altura (height) + margens limite do controle EndIf Return SetError(0, 0, $aRetorno) EndFunc ;==>TXT2PIXEL ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __TXT2PIXEL_ERROR ; Description ...: Funcao para liberar DC (Device Context) se der erro na funcao principal ; Syntax ........: __TXT2PIXEL_ERROR($nErro, $nControle, $hDC[, $hFonte = 0]) ; Parameters ....: $nErro = [Number] Nro do erro ; $nControle = [Handle] Handle do controle ; $hDC = [Handle] Handle do DC ; $hFonte = [Optional, Handle] Handle da fonte ; Return values .: $nErro = [Number] Nro do erro previamente passado ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Based on code from Melba23 (https://www.autoitscript.com/forum/profile/38576-melba23/) and Trancexx (https://www.autoitscript.com/forum/profile/33569-trancexx/) ; Remarks .......: FUNCAO INTERNA - NAO PODE SER CHAMADA DIRETAMENTE ; =============================================================================================================================== Func __TXT2PIXEL_ERROR ($nErro, $nControle, $hDC, $hFonte = 0) If $hFonte <> 0 Then _WinAPI_DeleteObject($hFonte) _WinAPI_ReleaseDC($nControle, $hDC) Return SetError($nErro) EndFunc ;=>__TXT2PIXEL_ERROR ; #FUNCTION# ==================================================================================================================== ; Name ..........: TXT2PIXELALT - Alternative way to define width and height ; Description ...: Calcula o tamanho em pixels de uma string levando em conta as caracteristicas da fonte usada ; Syntax ........: TXT2PIXELALT($sTexto[, $sFonte = ""[, $nTamanho = 12[, $nAtributo1 = $FW_NORMAL[, $nAtributo2 = $GUI_FONTNORMAL]]]]) ; Parameters ....: $sTexto = [String] Texto ; $sFonte = [Optional, String] Nome da fonte. Default is padrao da GUI ; $nTamanho = [Optional, Number] Tamanho da fonte. Default is 12 ; $nAtributo1 = [Optional, Number] Atributo/Largura da fonte. Default is $FW_NORMAL. As opcoes sao: ; $FW_DONTCARE = 0 (Use a largura padrao) ; $FW_THIN = 100 ; $FW_EXTRALIGHT = 200 ; $FW_LIGHT = 300 ; $FW_NORMAL = 400 ; $FW_MEDIUM = 500 ; $FW_SEMIBOLD = 600 ; $FW_BOLD = 700 (negrito) ; $FW_EXTRABOLD = 800 ; $FW_HEAVY = 900 ; $nAtributo2 = [Optional, Number] 2o Atributo da fonte. Default is $GUI_FONTNORMAL. As opcoes sao: ; $GUI_FONTNORMAL (0) = Normal ; $GUI_FONTITALIC (2) = Italico ; $GUI_FONTUNDER (4) = Sublinhado ; $GUI_FONTSTRIKE (8) = Cortado ; Return values .: Sucesso = [Array] Contendo a largura e a altura em pixels ; Falha = [Number] 0 e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: TXT2PIXELALT("Exemplo", "Verdana", 12) ; returns [ width, height ] of text "Exemplo" in selected font size ; =============================================================================================================================== Func TXT2PIXELALT ($sTexto, $sFonte = "", $nTamanho = 12, $nAtributo1 = $FW_NORMAL, $nAtributo2 = $GUI_FONTNORMAL) If $sFonte = Default or not IsString($sFonte) Then $sFonte = "" ; Usa a fonte padrao da GUI If $nTamanho = Default or not IsNumber($nTamanho) Then $nTamanho = 12 If $nAtributo1 = Default or not IsNumber($nAtributo1) Then $nAtributo1 = $FW_NORMAL If $nAtributo2 = Default or not IsNumber($nAtributo2) Then $nAtributo2 = $GUI_FONTNORMAL Local $hHandle = GUICreate($sTexto, 0, 0, 0, 0, BitOR($WS_POPUP, $WS_MINIMIZE), BitOR($WS_EX_TOOLWINDOW, $WS_EX_TRANSPARENT)) If @error Then Return SetError(1, @error, 0) Local $hJanela = GUISwitch($hHandle) If $hJanela = Null Then SetError(2, @error, 0) GUISetFont($nTamanho, $nAtributo1, $nAtributo2, $sFonte, $hHandle) If @error Then Return SetError(3, @error, 0) Local $aDimensoes = ControlGetPos($hHandle, "", GUICtrlCreateLabel($sTexto, 0, 0)) If @error Then Return SetError(4, @error, 0) Local $aRetorno = [ $aDimensoes[2], $aDimensoes[3] ] GUIDelete($hHandle) GUISwitch($hJanela) Return SetError(0, 0, $aRetorno) EndFunc ;==>TXT2PIXELALT ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GUICtrlGetStyle ; Description ...: Retrieves the Styles/ExStyles value(s) of a control. ; Syntax ........: _GUICtrlGetStyle($hWnd) ; Parameters ....: $hWnd = [Number] Control ID/Handle to the control ; Return values .: $aArray[2] = [Array] return [Style, ExStyle] ; Author ........: guinness (https://www.autoitscript.com/forum/profile/101698-guiness/) ; =============================================================================================================================== Func _GUICtrlGetStyle($hWnd) If not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd) Local $aReturn = [ _WinAPI_GetWindowLong($hWnd, $GWL_STYLE), _WinAPI_GetWindowLong($hWnd, $GWL_EXSTYLE) ] Return SetError(0, 0, $aReturn) EndFunc ;==>_GUICtrlGetStyle ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GUIGetLastCtrlID ; Description ...: Retorna o ultimo codigo de controle utilizado (equivalente ao -1 nas funcoes oficiais) ; Syntax ........: _GUIGetLastCtrlID() ; Return values .: Sucesso = [Number] Nro do campo (controle) ; Author ........: MrCreatoR (https://www.autoitscript.com/forum/profile/20477-mrcreator/) ; =============================================================================================================================== Func _GUIGetLastCtrlID() Local $aReturn = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", GUICtrlGetHandle(-1)) Return SetError(0, 0, $aReturn[0]) EndFunc ;==>_GUIGetLastCtrlID ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GuiCtrlGetFocus ; Description ...: Retorna qual controle que esta no foco ; Syntax ........: _GuiCtrlGetFocus([$hGui = ""]) ; Parameters ....: $hGui = [Optional, [Handle] Handle da janela onde o controle esta ; Return values .: Sucesso = [Number] Retorna o nro do controle que esta em foco ; Author ........: ResNullius (https://www.autoitscript.com/forum/profile/22276-resnullius/) ; =============================================================================================================================== Func _GuiCtrlGetFocus ($hGui = "") If $hGui = Default Then $hGui = "" Local $hInputID = ControlGetHandle($hGui, "", ControlGetFocus($hGui)) Return SetError(0, 0, __ControlGetGUIId($hInputID)) EndFunc ;==>_GuiCtrlGetFocus ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __ControlGetGUIId ; Description ...: Retorna o codigo do contrle associado (ver _GUIGetLastCtrlID) ; Syntax ........: __ControlGetGUIId($hCtrl) ; Parameters ....: $hCtrl = [Handle] Handle do controle ; Return values .: Sucesso = [Number] Codigo do controle desejado ; Falha = [Number] 0 e seta @error = 1 ; Author ........: ResNullius (https://www.autoitscript.com/forum/profile/22276-resnullius/) ; =============================================================================================================================== Func __ControlGetGUIId ($hCtrl) Local $Result = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hCtrl) If not @error Then Return SetError(0, 0, $Result[0]) Return SetError(1, @error, 0) EndFunc ;==>__ControlGetGUIId ; =============================================================================================================================== ; Functions from here are duplicate from Framework.au3 but brought here for code independance ; =============================================================================================================================== ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __ARRAYADD2D ; Description ...: Adiciona elementos em uma matriz de 2 ou mais colunas ; Syntax ........: __ARRAYADD2D(Byref $aVetor, $Elemento1, $Elemento2[, $Elemento3 = Default[, $Elemento4 = Default[, $Elemento5 = Default[, $Elemento6 = Default[, $Elemento7 = Default[, $Elemento8 = Default[, $Elemento9 = Default[, $Elemento10 = Default[, $Elemento11 = Default[, $Elemento12 = Default[, $Elemento13 = Default[, $Elemento14 = Default[, $Elemento15 = Default]]]]]]]]]]]]]) ; Parameters ....: $aVetor = [in/out, Array] Array que deve ser adicionado ; $Elemento1 - Elemento a ser colocado na 1a coluna ; $Elemento2 - Elemento a ser colocado na 2a coluna ; $Elemento3 = [Optional] Elemento a ser colocado na 3a coluna ; $Elemento4 = [Optional] Elemento a ser colocado na 4a coluna ; $Elemento5 = [Optional] Elemento a ser colocado na 5a coluna ; $Elemento6 = [Optional] Elemento a ser colocado na 6a coluna ; $Elemento7 = [Optional] Elemento a ser colocado na 7a coluna ; $Elemento8 = [Optional] Elemento a ser colocado na 8a coluna ; $Elemento9 = [Optional] Elemento a ser colocado na 9a coluna ; $Elemento10 = [Optional] Elemento a ser colocado na 10a coluna ; $Elemento11 = [Optional] Elemento a ser colocado na 11a coluna ; $Elemento12 = [Optional] Elemento a ser colocado na 12a coluna ; $Elemento13 = [Optional] Elemento a ser colocado na 13a coluna ; $Elemento14 = [Optional] Elemento a ser colocado na 14a coluna ; $Elemento15 = [Optional] Elemento a ser colocado na 15a coluna ; Return values .: Sucesso = [Array] Array com mais um linha cotendo os parâmetros acima ; Falha - Seta @error ; Author ........: Manimal, Luigi (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __ARRAYADD2D($aVetor, 1, 2, "Texto") ; retorna o $aVetor com uma linha a mais contendo [ 1, 2, "Texto"] ; Remarks .......: Parametro $Elemento do 1 ao 15 foi deixado propositalmente sem a identificacao do tipo (string, number, etc) ; =============================================================================================================================== Func __ARRAYADD2D (ByRef $aVetor, $Elemento1, $Elemento2, $Elemento3 = Default, $Elemento4 = Default, $Elemento5 = Default, $Elemento6 = Default, $Elemento7 = Default, $Elemento8 = Default, $Elemento9 = Default, $Elemento10 = Default, $Elemento11 = Default, $Elemento12 = Default, $Elemento13 = Default, $Elemento14 = Default, $Elemento15 = Default) If UBound($aVetor, $UBOUND_DIMENSIONS) < 2 Then Return SetError(1) ; so funciona com com subarrays de no minimo 2 colunas Local $Linha = UBound($aVetor, $UBOUND_ROWS) ReDim $aVetor[$Linha + 1][UBound($aVetor, $UBOUND_COLUMNS)] For $Coluna = 2 to @NumParams $aVetor[$Linha][$Coluna - 2] = Eval("Elemento" & $Coluna - 1) Next Return SetError(0) EndFunc ;==>__ARRAYADD2D ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __NUMBERFORMAT ; Description ...: Formata um nro com separador de milhares e decimais ; Syntax ........: __NUMBERFORMAT($nNumero[, $nDecimais = 2[, $bContabil = False[, $sSep_Decimal = $GsSep_Decimal[, $sSep_Milhar = $GsSep_Milhar]]]]) ; Parameters ....: $nNumero = [Number] Nro a ser formatado ; $nDecimais = [Number, Optional] Quantidade de decimais. Default is 2. ; $nTamanho = [Number, Optional] Tamanho da formatacao. Default is 0 = tamanho que der ; $bContabil = [Boolean, Optional] Se o valor NEGATIVO deve aparecer entre parentesis (padrao contabil) ; $sSep_Decimal = [String, Optional] Separador de decimais. Default is "," para Brasil ; $sSep_Milhar = [String, Optional] Separador de milhar. Default is "." para Brasil ; Return values .: Sucesso = [String] Nro formatado ; Falha = [String] "" (vazio) e seta @error ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __NUMBERFORMAT(12345, 0) ; retorna "12.345" ; __NUMBERFORMAT(12345, 2) ; retorna "12.345,00" ; __NUMBERFORMAT(-12345, 0) ; retorna "-12.345" ; __NUMBERFORMAT(-12345, 2) ; retorna "-12.345,00" ; __NUMBERFORMAT(12345, 0, 15) ; retorna " 12.345" ; __NUMBERFORMAT(12345, 2, 15) ; retorna " 12.345,00" ; __NUMBERFORMAT(-12345, 0, 15, True) ; retorna " (12.345)" ; __NUMBERFORMAT(-12345, 2, 15, True) ; retorna " (12.345,00)" ; Remarks .......: Se for informado um tamanho E nao couber o nro, retorna o nro independente do tamanho ; __NUMBERFORMAT(12345, 2, 5) ; retorna "12.345,00" ; =============================================================================================================================== Func __NUMBERFORMAT ($nNumero, $nDecimais = 2, $nTamanho = 0, $bContabil = False, $sSep_Decimal = $__GsSEP_DECIMAL, $sSep_Milhar = $__GsSEP_MILHAR) If $nDecimais = Default Then $nDecimais = 2 If $nTamanho = Default Then $nTamanho = 0 If $bContabil = Default Then $bContabil = False If $sSep_Decimal = Default Then $sSep_Decimal = $__GsSEP_DECIMAL If $sSep_Milhar = Default Then $sSep_Milhar = $__GsSEP_MILHAR Local $sNumero = _WinAPI_GetNumberFormat($__GnLCID, $nNumero, _WinAPI_CreateNumberFormatInfo($nDecimais, 0, 3, $sSep_Decimal, $sSep_Milhar, ($bContabil) ? 0 : 1)) If $nTamanho > 0 and $nTamanho > StringLen($sNumero) Then $sNumero = __PADL($sNumero, $nTamanho) Return SetError(0, 0, $sNumero) EndFunc ;==>__NUMBERFORMAT ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __PADL ; Description ...: Completa uma string com espacos NO COMECO ate uma determinada quantidade ; Syntax ........: __PADL($sTexto, $nTamanho[, $sChar = " "]) ; Parameters ....: $sTexto = [String] Texto a ser preenchido ; $nTamanho = [Number] Tamanho total da string ; $sChar = [String, Optional] Caracter a preencher. Default is " ". ; Return values .: Sucesso = [String] Texto preenchido ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __PADL("ABCDE", 10) ; retorna " ABCDE" ; __PADL("ABCDE", 3) ; retorna "ABCDE" ; Remarks .......: Se o tamanho for menor do que a string informada, retorna a string original ; =============================================================================================================================== Func __PADL ($sTexto, $nTamanho, $sChar = " ") If $sChar = Default Then $sChar = " " If $nTamanho <= StringLen($sTexto) Then Return SetError(0, 1, $sTexto) Return SetError(0, 0, StringRight(_StringRepeat($sChar, $nTamanho) & $sTexto, $nTamanho)) EndFunc ;==>__PADL ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __STRINGDIFFERENCE ; Description ...: Mostra a diferenca entre duas strings ; Syntax ........: __STRINGDIFFERENCE($sAntiga, $sNova) ; Parameters ....: $sAntiga = [String] String original ; $sNova = [String] String modificada ; Return values .: Sucesso = [String] String que contem as modificacoes ; Falha = [String] "" (vazio) e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __STRINGDIFFERENCE("abc", "abcde") ; return "de" ; __STRINGDIFFERENCE("123456", "246") ; return "135" ; =============================================================================================================================== Func __STRINGDIFFERENCE ($sAntiga, $sNova) If $sAntiga = "" Then Return SetError(0, 1, $sNova) If $sNova = "" Then Return SetError(0, 2, $sAntiga) If $sAntiga = $sNova Then Return SetError(0, 3, "") If StringLen($sAntiga) > StringLen($sNova) Then Return SetError(0, 0, __StringDifference($sNova, $sAntiga)) For $nIndice = 1 to StringLen($sAntiga) $sNova = StringReplace($sNova, StringMid($sAntiga, $nIndice, 1), "", 1) Next Return SetError(0, 0, $sNova) EndFunc ;==>__STRINGDIFFERENCE ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name ..........: __TRUNC ; Description ...: Trunca numeros (corta o nro desprezando as decimais) ; Syntax ........: __TRUNC($nNumero, $nDecimais) ; Parameters ....: $nNumero = [Number] Numero a ser truncado ; $nDecimais = [Number] Qtde de decimais para truncar ; Return values .: Sucesso = [Number] Numero truncado ; Falha = [Number] 0 e seta @error = 1 ; Author ........: Manimal (visite Forum AutoIT Brasil - http://forum.autoitbrasil.com/) ; Example .......: __TRUNC(1.238, 2) ; returns 1.23 ; =============================================================================================================================== Func __TRUNC ($nNumero, $nDecimais) Local $sRegExp = "(-?\d*)\.?\d*" If $nDecimais > 0 Then $sRegExp = "(-?\d*\.?\d{1," & $nDecimais & "})\d*" Local $sRetorno = StringRegExpReplace($nNumero, $sRegExp, "$1") If @error Then Return SetError(@error, @extended, 0) Return SetError(0, 0, Number($sRetorno)) EndFunc ;==>__TRUNC