Jump to content
Manimal

Formatação de Entrada (Máscaras)

Recommended Posts

Motivo
 
Olá pessoal.
 
Vindo de um ambiente mais comercial, sempre vi com dificuldade o fato do AutoIt (e outras linguagens Windows) não aceitarem máscaras durante a entrada de dados.
 
Claro que temos os campos EDIT (GUICtrlCreateInput), porém normalmente são campos abertos que aceitam quaisquer tipo de informação. Percebi aqui e ali algumas tentativas de filtrar ou restringir alguns caracteres, permitir outros e assim por diante. Mas sempre havia a necessidade de personalizar o script para cada situação, o que eu acho um desperdício de tempo e código. E principalmente o fato de impedir vários programadores de apresentar um aspecto mais profissional ao seu trabalho, pois exigia programação e conhecimento adicionais.
 
Entendam que quando falamos em sistemas comerciais, a entrada de dados é bem significativa pois o volume de dados a ser digitado é muito grande. Quando efetuamos esta entrada de dados, qualquer interação entre teclado e mouse, demora e atrasa o lançamento das informações. Pensem quanto tempo se perde entre tirar a mão do teclado, pegar o mouse, localizar o cursor, clicar na opção (ou opções), clicar no próximo campo e finalmente voltar ao teclado. POde parecer neurose, mas esse processo repetido várias vezes ao dia faz uma enorme diferença. A solução não é "eliminar" o mouse, mas minimizar seu uso, maximizando o teclado como um todo, no processo de digitação de dados!
 
Outra situação que me chateia é o fato de todo controle precisar além das coordenadas inicial e final, tamanho e largura do campo (que troço chato ficar ajustando isso). E sem falar que esta "largura" e "altura" ainda são dependentes da fonte utilizada. As vezes, vc ajusta o tamanho com uma fonte, daí decide mudar (aumentar, diminuir, botar negrito, etc) e lá vai todo o serviço pro beleléu.
 
Pelo menos ao criar um label é possível ignorar estas etapas. Mesmo assim poucos sabem disso. Passei muito tempo fazendo telas e informando o tamanho e altura do label quando não precisava. Como diz o Help é opcional, mas os exemplos e outros códigos sempre informavam esses números e fui no embalo... Recentemente precisei trocar a fonte de uma tela já montada e truncou tudo! Pensei comigo mesmo que não podia ser assim tão atravessado e fui procurar, daí descobri que o tamanho e largura do label são opcionais, ou seja, ele ajusta de acordo com a fonte utilizada no momento da abertura da janela.
 
Mas se por um lado facilitou bastante a criação dos labels, o mesmo não pode ser dito em relação aos inputs. Teoricamente (pelo Help) é possível deixar em branco essas opções também mas o resultado é horrível!
Devagarinho foi montando um padrão na minha cabeça. O ideal é que essa formatação seguisse algumas regras:
 
  1. ser opcional (usa quem quer e quando quer) não atrapalhando os demais campos, inclusive para permitir a retro compatibilidade
  2. sendo opcional, é possível usar apenas para campos que precisem ou necessitem de formatação adicional
  3. precisaria ajustar o tamanho do campo à fonte escolhida (e suas características como tamanho, negrito, altura, etc)
  4. finalmente possibilitasse criar um sistema de máscaras que fosse facilmente utilizado (pouco treinamento mas altamente flexível)
  5. formatação "on-the-fly", ou seja, vai formatando à medida que vai digitando
 
 
Desafio
 
O maior desafio era montar o sistema das máscaras. As Expressões Regulares (RegExp) eram o mais indicado, mas nem todo mundo tem familiaridade suficiente para usar. Mas era um ponto de partida. Depois criei um segundo padrão que permitia tanto o uso das RegExp e um facilitador para os casos mais comuns. Cheguei no seguinte padrão, que chamei de macros:
  • 9 - permite somente números de 0 a 9. Em RegExp \d
  • A - permite somente letras de A a Z. Em RegExp [a-zA-Z]
  • X - permite letras (de A a Z) e números (de 0 a 9). Em RegExp [0-9a-zA-Z]
  • H - permite códigos hexadecimais, números de 0 a 9 e letras de A a F. Em RegExp [0-9a-fA-F]
  • @ - permite qualquer caracter entre os códigos ASC 32 (espaço) até o ASC 126 [~]. Em RegExp [\x20-\x7E]. Basicamente qualquer coisa possível digitar (dentro do alfabeto latino).
Com estas definições (macros) foi possível criar uma série de máscaras que podem facilmente ser adaptadas às mais variadas situações e campos. Por exemplo:
 
CPF: 11 dígitos com alguns separadores = 999.999.999-99
CNPJ: 14 dígitos com separadores = 99.999.999/9999-99
Placa de veículo: 3 letras e 4 números com separador = AAA-9999
CEP: 8 dígitos com separadores = 99.999-999
Celular Brasil: 11 dígitos (cód área, prefixo e número) = (99) 99999-9999
Telefone internacional: 13 dígitos (cód país, cód área, prefixo e número) = +99 (99) 99999-9999
MAC Address (código MAC da placa de rede): hexa agrupados de 2 em 2 = HH:HH:HH:HH:HH:HH
e assim por diante
 
Além disso, todo e qualquer campo pode ser descrito usando RegExp também, o que torna o sistema totalmente flexível e adaptável a qualquer situação. Por exemplo:
Placa de carro (modelo macro) = AAA-999
No modelo RegExp = [A-Z][A-Z][A-Z]-\d\d\d\d
Ou assim = [A-Z]3-[\d]4
Mas usando macros Fica mais fácil de entender e trabalhar né? Aliás, ainda não pode misturar padrão RegExp com macros. Talvez mais tarde...
 
Vamos complicar um pouco agora? Se precisar de um campo que só pode aceitar um caracter de B até J e depois 2 números e termina com mais 3 letras, fica assim:
[b-J]\d\d[A-Z][A-Z][A-Z]
Fica ruim de ler, mas funciona!
 
Outro ponto a ser explorado são os estilos combinados com as máscaras. Os estilos são os últimos parâmetros da função GUICtrlCreateInput e são muito importantes para complementar o assunto. Existem estilos para alinhar à direita e à esquerda, centralizar, aceitar somente maíusculs ou minúsculas, campos senha ou read-only (somente leitura). Assim uma definição ideal para as máscaras envolve esses dois fatores e mais o programador saber disso!
 
Para fazer um campo aceitar somente letras maíusculas => GUICtrlCreateInput("", 10, 35, 300, 20, $ES_UPPERCASE)
Somente minúsculas => GUICtrlCreateInput("", 10, 35, 300, 20, $ES_LOWERCASE)
Centralizado no campo => GUICtrlCreateInput("", 10, 35, 300, 20, $ES_CENTER)
Se quiser misturar também pode usando função BitOr => GUICtrlCreateInput("", 10, 35, 300, 20, (BitOr($ES_UPPERCASE, $ES_CENTER))
 
Sei que estou chovendo no molhado aqui porque tudo isso está no Help e vcs já sabem, mas não custa recordar!
Principalmente porque quando se monta uma máscara faz diferença. Imagine montar uma máscara [A-Z] e no estilo colocar $ES_LOWERCASE??? Não vai funcionar...
 
 
Conclusão
 
Ficou definido então que haveria 3 (três) tipos de campos, todos formatando "on-the-fly" conforme são digitados:
 
  1. campo TEXTO: aceita máscaras
  2. campo NUMERO: como se fosse uma calculadora, da direita para esquerda
  3. campo DATA: aceita apenas números mas que converte para um formato "expandido" (dd/MMM/yyyy) ao sair do campo e com várias opções de formato (DMY, MDY, etc). Com validação automática.
O formato DMY e suas variantes (MDY, YMD, etc) são para permitir a entrada de datas em outros padrões de acordo com cada país. Nos USA o padrão é MDY, no Brasil e Inglaterra é DMY. Militares usam YMD e assim por diante.
É possível usar o comando GUICtrlCreateDate para criar uma entrada de dados "text mais calendário", mas neste caso apenas o cálculo do tamanho será efetuado.
 
Então a função acabou assim:
 
_GUICtrlSetMask(<ControlID>, <Input Type>, <Mask>[, <Extra Info>])
 
onde:
 
ControlID = código do controle a ser formatado. Pode usar -1 se quiser que seja o último criado
Input Type = 0 ($INPUT_DATE), 1 ($INPUT_NUMBER), 2 ($INPUT_TEXT)
Mask = Máscaras mencionadas. Se usar as macros (@, 9, A, X, H) precisa colocar # no início e no final
Extra Info = depende do formato escolhido pode conter informações adicionais
 
Exemplo de cada tipo:
 
Números ($INPUT_NUMBER):
_GUICtrlSetMask($nCampo_Codigo, $INPUT_NUMBER, 6)     ; Configurando o campo para numero, com 6 (seis) digitos inteiros SEM decimais (999,999)
_GUICtrlSetMask($nCampo_Preco,  $INPUT_NUMBER, 9, 2)  ; Configurando o campo para numero, com 9 (nove) digitos inteiros MAIS 2 (dois) decimais (999,999,999.99)
Data ($INPUT_DATE):
_GUICtrlSetMask($nCampo_Aniversario, $INPUT_DATE, "DMY")      ; Configurando o campo para data e o formato DIA, MES e ANO, com o separador padrao / (barra)
_GUICtrlSetMask($nCampo_NF_Saida,    $INPUT_DATE, "YMD", "-") ; Configurando o campo para data e o formato ANO, MES e DIA com separador - (menos)
Texto ($INPUT_TEXT):
_GUICtrlSetMask($nCampo_Nome, $INPUT_TEXT, "#[@]50#")              ; Configurando o campo para texto com 50 caracteres maximo
_GUICtrlSetMask($nCampo_Nome, $INPUT_TEXT, "#[@]50#", 20)          ; Configurando o campo para texto com 50 caracteres maximo, mas com limite do campo em 20 caracteres e ativando rolamento horizontal
_GUICtrlSetMask($nCampo_CNPJ, $INPUT_TEXT, "#99.999.999/9999-99#") ; Configurando o campo para texto no formato CNPJ
_GUICtrlSetMask($nCampo_CEP,  $INPUT_TEXT, "#99.999-999#")         ; Configurando o campo para texto no formato CEP
 
Observações
 
  • Quando usar tipo TEXTO, não esquecer de colocar a máscara entre # (cerquilha ou jogo da velha).
  • Quando usar tipo DATA, não esquecer do formato da data, pois deve ser do mesmo formato da entrada.
  • Normalmente usamos a função _NowCalcDate() para inicializarmos nossas variáveis tipo data, mas tem que lembrar que neste caso o conteúdo está no formato YMD.
  • Neste caso, PRECISAMOS trocar o formato da data usando uma função auxiliar _MUDA_FORMATO_DATA selecionando o formato que desejamos.
  • Ex.: $sData = _MUDA_FORMATO_DATA(_NowCalcDate(), "YMD", "DMY") => inicializamos com _NowCalcDate (formato YMD) e trocamos para Brasil (formato DMY)
 
Para inicializar o subsistema de Mascaras é NECESSÁRIO chamar a função _INIT_MASCARAS que possui 3 (três) parâmetros, todos opcionais:
 
_INIT_MASCARAS([CorDeFundo][, <PRE-Format>[, <POS-Format>]])
 
onde:
CorDeFundo = cor para realçar o campo está sendo digitado. Padrão 0xFFFF99 (amarelo fraquinho)
PRE-Format = True (padrão) ou False. Serve para ao abrir a janela, pré-formatar os campos adequadamente conforme seu conteúdo
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"
POS-Format = True ou False (padrão). Serve para quando fechar a janela, desformatar os campos ou eliminar as máscaras aplicadas
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"
 
Essas definições servem para quando forem lidos os campos com o comando GUICtrlRead, venha conforme o padrão do AutoIt (sem formatação).
 
Finalmente após o fechamento da janela, liberar o subsistema através da função
_RELEASE_MASCARAS()
 
Também quando falamos em entrada de dados, na medida do possível o ideal é que a tecla ENTER (além da TAB) possa ser usada como terminador da entrada e mover para o próximo campo.
Poderia fazer isto internamente, mas percebi que isto é muito pessoal. Daí prefiro deixar a cargo de cada um, mas o modelo é bem simples e está no exemplo.
Também é possível fazer a validação "individual" de cada campo, o que completaria a formatação de entrada.
Por exemplo, ao terminar de receber um campo de CNPJ ou CPF, poder validar se o código informado é válido. Ou se determinada data é permitida e assim por diante.
 
Claro que a função não é perfeita nem nunca está completa, mas conto com a participação dos colegas para me apontarem os erros, suas sugestões e críticas.
 
 
Demonstração
 
#include "Mascaras.au3"

PRINCIPAL()
Exit

Func PRINCIPAL()
   _INIT_MASCARAS()

   Local $nTamanho_Fonte_Input = 12
   Local $nMsg, $nControle, $hJanela = GUICreate("Mascaras para digitacao", 620, 460)
   GUISetFont(11, $FW_NORMAL, $GUI_FONTNORMAL, "Arial", $hJanela, $CLEARTYPE_QUALITY)

   Local $Codigo = 1234
   Local $Valor = 12345.6
   Local $Nome = "Nome do Usuario"
   Local $CPF = "12345678901"
   Local $CNPJ = "12345678000901"
   Local $MAC = "7B891506F1C7"
   Local $CEP = "90040123"
   Local $sFormato_Data = "DMY"
   Local $Data = _MUDA_FORMATO_DATA(_NowCalcDate(), "YMD", $sFormato_Data)
   Local $Placa = "ABC1234"
   Local $Telefone = "11999706050"
   Local $Internacional = "1123456789"

   GUICtrlCreateLabel("Codigo:", 50, 50)
   Local $Campo_Codigo = GUICtrlCreateInput($Codigo, 100, 45)
   _GUICtrlSetMask(-1, $INPUT_NUMBER, 6, 0)
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("Valor:", 350, 50)
   Local $Campo_Valor = GUICtrlCreateInput($Valor, 400, 45)
   _GUICtrlSetMask(-1, $INPUT_NUMBER, 9, 2)
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("Nome:", 50, 100)
   Local $Campo_Nome = GUICtrlCreateInput($Nome, 100, 95, Default, Default, BitOR($ES_UPPERCASE, $ES_AUTOHSCROLL))
   _GUICtrlSetMask(-1, $INPUT_TEXT, "#[@]60#", 40)
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("Data1:", 50, 150)
   Local $Campo_Data1 = GUICtrlCreateInput($Data, 100, 145)
   _GUICtrlSetMask(-1, $INPUT_DATE, $sFormato_Data)
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("Data2:", 350, 150)
   Local $Campo_Data2 = GUICtrlCreateDate(_NowCalcDate(), 400, 145)
   _GUICtrlSetMask(-1, $INPUT_DATE, "dd/MMM/yyyy")
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("CNPJ:", 50, 200)
   Local $Campo_CNPJ = GUICtrlCreateInput($CNPJ, 100, 195)
   _GUICtrlSetMask(-1, $INPUT_TEXT, "#99.999.999/9999-99#")
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("CPF:", 350, 200)
   Local $Campo_CPF = GUICtrlCreateInput($CPF, 400, 195)
   _GUICtrlSetMask(-1, $INPUT_TEXT, "#999.999.999-99#")
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("MAC:", 50, 250)
   Local $Campo_MAC = GUICtrlCreateInput($MAC, 100, 245, Default, Default, $ES_UPPERCASE)
   _GUICtrlSetMask(-1, $INPUT_TEXT, "#HH:HH:HH:HH:HH:HH#")
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("CEP:", 350, 250)
   Local $Campo_CEP = GUICtrlCreateInput($CEP, 400, 245)
   _GUICtrlSetMask(-1, $INPUT_TEXT, "#99.999-999#")
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("Placa:", 50, 300)
   Local $Campo_Placa = GUICtrlCreateInput($Placa, 100, 295, Default, Default, $ES_UPPERCASE)
   _GUICtrlSetMask(-1, $INPUT_TEXT, "#AAA-9999#")
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("Placa1:", 350, 300)
   Local $Campo_Placa1 = GUICtrlCreateInput($Placa, 400, 295)
   _GUICtrlSetMask(-1, $INPUT_TEXT, "[a-zA-Z]3-[0-9]4")
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("Fone:", 50, 350)
   Local $Campo_Telefone = GUICtrlCreateInput($Telefone, 100, 345)
   _GUICtrlSetMask(-1, $INPUT_TEXT, "#(99) 99999-9999#")
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   GUICtrlCreateLabel("Fone:", 350, 350)
   Local $Campo_FoneIntl = GUICtrlCreateInput($Internacional, 400, 345)
   _GUICtrlSetMask(-1, $INPUT_TEXT, "#+55 (99) 9999-9999#")
   GUICtrlSetFont(-1, $nTamanho_Fonte_Input, $FW_BOLD, $GUI_FONTNORMAL, "Tahoma", $CLEARTYPE_QUALITY)

   Local $Ok = GUICtrlCreateButton("Ok", 145, 400, 75, 25, $WS_GROUP)
   Local $Cancelar = GUICtrlCreateButton("Cancelar", 360, 400, 75, 25, $WS_GROUP)

   Local $nMyDummy = GUICtrlCreateDummy()
   Local $aHotkey = [ [ "{ENTER}", $nMyDummy ], [ "{TAB}", $nMyDummy ] ]
   GUISetAccelerators($aHotkey)

   GUISetState(@SW_SHOW, $hJanela)
   While True
      $nMsg = GUIGetMsg()
      If $nMsg = $GUI_EVENT_CLOSE Then ExitLoop
      If $nMsg = $Ok or $nMsg = $Cancelar Then ExitLoop
      If $nMsg = $nMyDummy Then
         $nControle = _GuiCtrlGetFocus($hJanela)
         If $nControle = $Ok or $nControle = $Cancelar Then
            ExitLoop
         ElseIf $nControle = $Campo_Nome Then
            If GUICtrlRead($Campo_Nome) = "" Then ContinueLoop ; nao permite nome em branco
         ElseIf $nControle = $Campo_Data1 Then
            If GUICtrlRead($Campo_Data1) = "" Then ContinueLoop ; nao permite data em branco
         ElseIf $nControle = $Campo_CPF Then
;~             If not VERIF_CPF(GUICtrlRead($Campo_CPF)) Then ContinueLoop
         ElseIf $nControle = $Campo_CNPJ Then
;~             If not VERIF_CNPJ(GUICtrlRead($Campo_CNPJ)) Then ContinueLoop
         EndIf
         GUISetAccelerators("")
         ControlSend($hJanela, "", $nControle, "{TAB}")
         GUISetAccelerators($aHotkey)
      EndIf
   WEnd
   GUISetState(@SW_HIDE, $hJanela)

   ConsoleWrite("[" & GUICtrlRead($Campo_Codigo) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_Valor) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_Nome) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_CPF) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_CNPJ) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_MAC) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_CEP) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_Data1) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_Data2) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_Placa) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_Placa1) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_Telefone) & "]" & @CRLF)
   ConsoleWrite("[" & GUICtrlRead($Campo_FoneIntl) & "]" & @CRLF)

   GUIDelete($hJanela)
   _RELEASE_MASCARAS()
EndFunc   ;==>PRINCIPAL

Atenção!!!

Devido a mudanças entre as versões 3.3.14.2 e 3.3.14.3 do AutoIt existem 2 versões desta função para baixar!

Verifique e baixe a versão correta para sua instalação!

O programa de demonstração (ou exemplo) é o mesmo para ambas as versões!

 

A única diferença entra as duas versões são os #includes no início do arquivo.

Na versão 14.2 está assim:

 

E na versão 14.3 está assim:

 

Ou seja, na última versão tem os seguintes #includes a mais:

 

De resto é tudo igual.

Bom divertimento a todos!

Mascaras v14.2.au3

Mascaras v14.3.au3

  • Like 1

Share this post


Link to post
Share on other sites

@Manimal que coisa linda rapaz rs, ja perdi muitas horas com estas "formatações".. parabéns e muito obrigado por compartilhar!!!

 

Editado:

Obs: @Manimal qual versão do autoit esta usando? estou na 14.2 e imagino que esta usando a 14.3, aqui gerou uma porção de erros e falta de includes.

Edited by mutleey

Share this post


Link to post
Share on other sites

Olá Mutteey.

 

Sim, estou na 14.3, mas já tinha feito quase toda a rotina na 14.2. Como não houve muita diferença, não me preocupei com isto.

 

Pode me passar os erros? Vou providenciar a correção.

Share this post


Link to post
Share on other sites

Manimal de inicio os erros são a falta dos includes "WinAPIConv.au3" "WinAPIGdiDC.au3" "WinAPISysWin.au3" porem se eu baixar o include https://svn.wsusoffline.net/svn/wsusoffline/trunk/Include/WinAPIConv.au3 gera outros erros devidos as funções terem sidos adicionadas ou modificadas.

 

erro após baixar o include WinAPIConv.au3

>"C:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /Prod /AU3check /in "D:\AUTOIT\Scripts Uteis\Formatação de Entrada (Máscaras)\Exemplo.au3"
+>14:30:57 Starting AutoIt3Wrapper v.16.612.1119.0 SciTE v.3.6.6.0   Keyboard:00010416  OS:WIN_7/Service Pack 1  CPU:X64 OS:X64  Environment(Language:0416)  CodePage:0  utf8.auto.check:4
+>         SciTEDir => C:\Program Files (x86)\AutoIt3\SciTE   UserDir => C:\Users\Administrador\AppData\Local\AutoIt v3\SciTE\AutoIt3Wrapper   SCITE_USERHOME => C:\Users\Administrador\AppData\Local\AutoIt v3\SciTE 
>Running AU3Check (3.3.14.2)  from:C:\Program Files (x86)\AutoIt3  input:D:\AUTOIT\Scripts Uteis\Formatação de Entrada (Máscaras)\Exemplo.au3
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(89,50) : error: _WinAPI_ClientToScreen() already defined.
Func _WinAPI_ClientToScreen($hWnd, ByRef $tPoint)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(135,33) : error: _WinAPI_FloatToInt() already defined.
Func _WinAPI_FloatToInt($nFloat)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(147,65) : error: _WinAPI_GetXYFromPoint() already defined.
Func _WinAPI_GetXYFromPoint(ByRef $tPoint, ByRef $iX, ByRef $iY)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(156,36) : error: _WinAPI_GUIDFromString() already defined.
Func _WinAPI_GUIDFromString($sGUID)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(169,46) : error: _WinAPI_GUIDFromStringEx() already defined.
Func _WinAPI_GUIDFromStringEx($sGUID, $tGUID)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(235,28) : error: _WinAPI_HiWord() already defined.
Func _WinAPI_HiWord($iLong)
~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(254,31) : error: _WinAPI_IntToFloat() already defined.
Func _WinAPI_IntToFloat($iInt)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(286,28) : error: _WinAPI_LoWord() already defined.
Func _WinAPI_LoWord($iLong)
~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(302,52) : error: _WinAPI_MAKELANGID() already defined.
Func _WinAPI_MAKELANGID($iLngIDPrimary, $iLngIDSub)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(310,41) : error: _WinAPI_MAKELCID() already defined.
Func _WinAPI_MAKELCID($iLngID, $iSortID)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(318,34) : error: _WinAPI_MakeLong() already defined.
Func _WinAPI_MakeLong($iLo, $iHi)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(326,45) : error: _WinAPI_MakeQWord() already defined.
Func _WinAPI_MakeQWord($iLoDWORD, $iHiDWORD)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(352,91) : error: _WinAPI_MultiByteToWideChar() already defined.
Func _WinAPI_MultiByteToWideChar($vText, $iCodePage = 0, $iFlags = 0, $bRetString = False)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(377,80) : error: _WinAPI_MultiByteToWideCharEx() already defined.
Func _WinAPI_MultiByteToWideCharEx($sText, $pText, $iCodePage = 0, $iFlags = 0)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(400,58) : error: _WinAPI_PointFromRect() already defined.
Func _WinAPI_PointFromRect(ByRef $tRECT, $bCenter = True)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(419,36) : error: _WinAPI_PrimaryLangId() already defined.
Func _WinAPI_PrimaryLangId($iLngID)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(427,50) : error: _WinAPI_ScreenToClient() already defined.
Func _WinAPI_ScreenToClient($hWnd, ByRef $tPoint)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(494,36) : error: _WinAPI_StringFromGUID() already defined.
Func _WinAPI_StringFromGUID($tGUID)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(505,32) : error: _WinAPI_SubLangId() already defined.
Func _WinAPI_SubLangId($iLngID)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(513,32) : error: _WinAPI_SwapDWord() already defined.
Func _WinAPI_SwapDWord($iValue)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(528,32) : error: _WinAPI_SwapQWord() already defined.
Func _WinAPI_SwapQWord($iValue)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(543,31) : error: _WinAPI_SwapWord() already defined.
Func _WinAPI_SwapWord($iValue)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"C:\Program Files (x86)\AutoIt3\Include\WinAPIConv.au3"(558,80) : error: _WinAPI_WideCharToMultiByte() already defined.
Func _WinAPI_WideCharToMultiByte($vUnicode, $iCodePage = 0, $bRetString = True)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"D:\AUTOIT\Scripts Uteis\Formatação de Entrada (Máscaras)\Mascaras.au3"(7,10) : error: can't open include file <WinAPIGdiDC.au3>.
#include <WinAPIGdiDC.au3>
~~~~~~~~~^
"D:\AUTOIT\Scripts Uteis\Formatação de Entrada (Máscaras)\Mascaras.au3"(9,10) : error: can't open include file <WinAPISysWin.au3>.
#include <WinAPISysWin.au3>
~~~~~~~~~^
"D:\AUTOIT\Scripts Uteis\Formatação de Entrada (Máscaras)\Exemplo.au3"(112,53) : error: VERIF_CPF(): undefined function.
            If not VERIF_CPF(GUICtrlRead($Campo_CPF))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"D:\AUTOIT\Scripts Uteis\Formatação de Entrada (Máscaras)\Exemplo.au3"(114,55) : error: VERIF_CNPJ(): undefined function.
            If not VERIF_CNPJ(GUICtrlRead($Campo_CNPJ))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\AUTOIT\Scripts Uteis\Formatação de Entrada (Máscaras)\Exemplo.au3 - 27 error(s), 0 warning(s)
!>14:30:58 AU3Check ended. Press F4 to jump to next error.rc:2
+>14:30:58 AutoIt3Wrapper Finished.
>Exit code: 0    Time: 0.8577

Lembrando que minha versão é a 14.2, e acho que para você não perder muito tempo com isso o correto seria deixar uma observação que é necessario a versão 14.3 do autoit.

Edited by mutleey

Share this post


Link to post
Share on other sites

Eu também fui testar e deu erros e pediu vários includes, se quiser que o script fique independente sem erros e sem pedir nenhum include pode compilar criando uma versão que já inclui tudo que foi usado no script, eu uso isto as vezes quando preciso do código de uma versão mais recente e quero continuar coma antiga!

 

Parâmetros prá gerar um script único contendo os includes que foram usados nele:

#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/striponly

Obs: Basta pegar o arquivo _Obfuscated.au3 que será gerado quando compilar ai se quiser retira o código que fez prá testes e faz um include só do resto.

Share this post


Link to post
Share on other sites

Olá galera.

 

Eu sempre compilo e verifico meus scripts antes de postar no fórum.

 

Recompilei novamente e não tem nenhum erro, não falta nenhum include, são completamente independentes. Reinseri o arquivo novamente para ver se tinha alguma modificação, mas era igual ao anterior.

 

Programa de exemplo (demonstração):

>"C:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /Prod /AU3check /in "C:\Meu Windows\Meus Docs\Scripts\Mascaras_Exemplo.au3"
+>07:29:28 Starting AutoIt3Wrapper v.17.224.935.0 SciTE v.3.7.3.0   Keyboard:00020409  OS:WIN_7/Service Pack 1  CPU:X64 OS:X64  Environment(Language:0416)  CodePage:0  utf8.auto.check:4
+>         SciTEDir => C:\Program Files (x86)\AutoIt3\SciTE   UserDir => C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper
>Running AU3Check (3.3.14.3)  from:C:\Program Files (x86)\AutoIt3  input:C:\Meu Windows\Meus Docs\Scripts\Mascaras_Exemplo.au3
+>07:29:28 AU3Check ended.rc:0
+>07:29:28 AutoIt3Wrapper Finished.
>Exit code: 0    Time: 0.9104

Função principal

>"C:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /Prod /AU3check /in "C:\Meu Windows\Meus Docs\Scripts\Mascaras.au3"
+>07:31:03 Starting AutoIt3Wrapper v.17.224.935.0 SciTE v.3.7.3.0   Keyboard:00020409  OS:WIN_7/Service Pack 1  CPU:X64 OS:X64  Environment(Language:0416)  CodePage:0  utf8.auto.check:4
+>         SciTEDir => C:\Program Files (x86)\AutoIt3\SciTE   UserDir => C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper
>Running AU3Check (3.3.14.3)  from:C:\Program Files (x86)\AutoIt3  input:C:\Meu Windows\Meus Docs\Scripts\Mascaras.au3
+>07:31:03 AU3Check ended.rc:0
+>07:31:03 AutoIt3Wrapper Finished.
>Exit code: 0    Time: 0.9401

Mas estou usando a versão 3.3.14.3 do AutoIt e a versão 3.7.3 do Scite.

 

Acredito que a versão 14.3 trouxe vários include novos que a versão 14.2 não tinha. Agora com estes erros que apareceram é que posso notar isso. Durante o desenvolvimento da função (que ocorreu basicamente na 14.2) fui usando funções mais avançadas que provavelmente vieram na 14.3 (e seus includes).

 

Vou instalar a 14.2 e montar uma versão adequada!

 

@Belini: na versão que uso os parâmetros para gerar o Striiped é

  1. #AutoIt3Wrapper_Run_Au3Stripper=y
  2. #Au3Stripper_Parameters=/SO

Share this post


Link to post
Share on other sites

 

Mas estou usando a versão 3.3.14.3 do AutoIt e a versão 3.7.3 do Scite.

 

Vou baixar esta versão e gerar o script único aqui

Share this post


Link to post
Share on other sites

Ok, resolvido.

 

Baixei a versão 14.2 de volta e ajustei o script.

 

O problema ocorreu que na versão 14.3 os include foram rearranjados e certas funções e definições mudaram de lugar.

 

Assim o que estava na 14.2 em um include foi parar em outro e assim por diante. Isso exigia que se colocasse o outro include, mas na versão 14.2 estas definições ou funções estavam definidas em outro include. Que zona!

 

Ajustei a função original para 2 versões: a 14.2 e a 14.3.

 

Baixem a versão adequada e testem por favor!

Share this post


Link to post
Share on other sites

Rapaz que maravilha... já perdi tantas horas formatando estes dados. obrigado mesmo Manimal :aplausos: :aplausos:

  • Like 1

Share this post


Link to post
Share on other sites

@mutleey

 

Ficou legal né? E prático...

 

Claro que tem alguns ajustes ainda, mas já facilita bastante...

Share this post


Link to post
Share on other sites

@mutleey

 

Ficou legal né? E prático...

 

Nossa e como facilita, obrigado por compartilhar!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×