Ajuda com Script

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

jrufino
Posts: 31
Joined: 25 Oct 2019, 07:17

Ajuda com Script

Post by jrufino » 17 Dec 2020, 10:44

Bom dia pessoal, tudo tranquilo?
Seguinte, tenho a seguinte Janela abaixo:

Code: Select all

listaTipoImovel := "Apartamento|Casa|Garagem|Prédio Comercial|Prédio residencial|Terreno rural|Terreno Urbano"
listaTipoEndereco := "Alameda|Avenida|Beco|Estrada|Largo|Linha|Localidade|Passagem|Praça|Rodovia|Rua|Servidão|Travessa|Via|Viela"
listaTipoMedidas := "Acre|Alq.|Alq.paulista|Are|ft²|ha|Lit|m²"
listaTipoApart := "Comercial|Residencial"

Gui, add, text, x10 y10 HwndIDADE_DO_SUJEITO, TIPO:
Gui, add, Edit, x70 y6 w100 h20 vCAMPO_TIPO			;1
Gui, add, text, x180 y10, NUMERO_AP:
Gui, add, Edit, x255 y6 w50 h20 vCAMPO_NUMERO_AP	;2
Gui, add, text, x310 y10, ANDAR:
Gui, add, Edit, x355 y6 w100 h20 vCAMPO_ANDAR		;3
Gui, add, text, x465 y10, BLOCO:
Gui, add, Edit, x510 y6 w50 h20 vCAMPO_BLOCO		;4
Gui, add, text, x10 y35, QUADRA:
Gui, add, Edit, x70 y30 w100 h20 vCAMPO_QUADRA		;5
Gui, add, text, x180 y35, LOTE:
Gui, add, Edit, x255 y30 w50 h20 vCAMPO_LOTE		;6
Gui, add, text, x310 y35, PAVIMENTO:							
Gui, add, Edit, x380 y30 w75 h20 vCAMPO_PAVIMENTO	;7		
Gui, add, text, x465 y35, SETOR:
Gui, add, Edit, x510 y30 w50 h20 vCAMPO_SETOR		;8
Gui, add, text, x10 y60, INSC. FISCAL:
Gui, add, Edit, x100 y55 w100 h20 vCAMPO_FISCAL		;9
Gui, add, text, x215 y60, EMPREENDIMENTO:
Gui, add, Edit, x330 y55 w230 h20 vCAMPO_EMPREENDIMENTO		;10
Gui, add, text, x10 y85, LOCALIZAÇÃO:
Gui, add, Edit, x100 y80 w230 h20 vCAMPO_LOCALIZACAO		;11
Gui, add, DropDownList, x350 y80 vCAMPO_TIPO_AP, %listaTipoApart%
Gui, add, text, x10 y110, ÁREA:
Gui, add, Edit, x50 y105 w70 h20 vCAMPO_AREA				;12
Gui, add, DropDownList, x130 y105 w40 vCAMPO_TIPO_MEDIDA, %listaTipoMedidas%
Gui, add, text, x180 y110, Á.CONST.:					
Gui, add, Edit, x240 y105 w50 h20 vCAMPO_AREA_CONSTRUIDA	;13
Gui, add, text, x300 y110, Á.PRIV.:
Gui, add, Edit, x350 y105 w50 h20 vCAMPO_AREA_PRIVATIVA		;14
Gui, add, text, x410 y110, ÁREA COMUM:
Gui, add, Edit, x495 y105 w65 h20 vCAMPO_AREA_COMUM			;15
Gui, add, text, x10 y135, FRAÇAO DO SOLO:
Gui, add, Edit, x110 y130 w60 h20 vCAMPO_FRACAO_SOLO		;16
Gui, add, DropDownList, x180 y130 w40 vCAMPO_TIPO_MEDIDA_FRACAO, %listaTipoMedidas%
Gui, add, text, x230 y135, VAGAS:
Gui, add, Edit, x275 y130 w60 h20 vCAMPO_VAGAS				;17
Gui, add, text, x350 y135, CEP:
Gui, add, Edit, x380 y130 w70 h20 vCAMPO_CEP, 67.000-000	;18
Gui, add, text, x10 y160, TP_ENDEREÇO:
Gui, add, DropDownList, x100 y155 vCAMPO_TP_ENDERECO, %listaTipoEndereco%
Gui, add, text, x10 y185, ENDEREÇO:
Gui, add, Edit, x100 y180 w350 h20 vCAMPO_ENDERECO			;19
Gui, add, text, x10 y210, NUMERO:
Gui, add, Edit, x100 y205 w100 h20 vCAMPO_NUMERO			;20
Gui, add, text, x10 y235, COMPLEMENTO:
Gui, add, Edit, x100 y230 w200 h20 vCAMPO_COMPLEMENTO		;21
Gui, add, text, x10 y260, BAIRRO:
Gui, add, Edit, x100 y255 w200 h20 vCAMPO_BAIRRO			;22
Gui, add, text, x10 y285, OBSERVAÇÕES:
Gui, add, Edit, x100 y280 w450 h20 vCAMPO_OBS				;23
Gui, add, text, x10 y310, TIPO DE IMÓVEL:
Gui, add, DropDownList, x100 y305 vCAMPO_TIPO_IMOVEL, %listaTipoImovel%
Gui, add, text, x10 y340, MAT. ANTERIOR:
Gui, add, Edit, x100 y335 vCAMPO_MAT_ANTERIOR				;24
Gui, Add, Button, x170 y400 w100 h20 gLABEL_LIMPAR_CAMPOS, Limpar Campos
Gui, Add, Button, x80 y400 w70 h20 gLABEL_ALTERAR, Alterar dados
Gui, Add, Button, x290 y400 w70 h20 gLABEL_SAIR, Sair
Gui, add, text, x85 y420, (Ctrl+Enter)
Gui, add, text, x190 y420, (Ctrl+End)
Gui, add, text, x307 y420, (Alt+F4)
Gui, add, text, x400 y420, (Ctrl+E)
Gui, add, text, x490 y400, => Nº da Linha
Gui, Add, Button, x380 y400 w70 h20 gLABEL_EXCEL, Excel
Gui, add, Edit, x450 y400 w40 h20 vCAMPO_INDICE	1, 7	;25					(PRIMEIRO NUMERO 1 FAZ CENTRALIZAR, O SEGUNDO 1 VEM PREENCHIDO NO CAMPO)

Gui, add, text, x290 y310, MATRICULA BASE:
Gui, Font, bold, Verdana						;Altera o tipo de Fonte e deixa Negrito
Gui, add, Edit, x390 y305 w70 h20 vMAT_BASE,0			;26
Gui, Font, norm, 								;Aqui volta para o Padrão, se não tudo que vier depois vai pegar pegar a alteração
Gui, Show, w600 h500, Assistente para Preenchimento (Empreendimentos)
Return
eu tenho a seguinte função que uso para alterar os campos:

Code: Select all

^Enter::
	LABEL_ALTERAR:			
		Gui, submit, nohide			
		funcaoAlteraCampos(CAMPO_TIPO,CAMPO_NUMERO_AP,CAMPO_ANDAR,CAMPO_BLOCO,CAMPO_QUADRA,....)					
	Return
Return)
o que acontece, eu estou chamando a função "funcaoAlteraCampos" de dentro de outra função porém percebi que não consigo pegar os valores dos campos da GUI utilizando seus respectivos nomes como faço no momento que chamo a função direto pela hotkey.
Os campos Edit eu consegui pegar utilizando o ControlGetText porém as Listas que são meu problema, não sei como pegar o valor selecionado nelas.
User avatar
Gio
Posts: 1118
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda com Script

Post by Gio » 18 Dec 2020, 11:00

Bom dia Jrufino.


As funções cumprem alguns objetivos da programação, um dos quais é a organização do código. Por isso, elas operam, por padrão, com um namespace (espaço de nomes) próprio. Isso significa que uma variável chamada VAR1 dentro do corpo de uma função NÃO será a mesma variável VAR1 que estiver fora do corpo da função.

Você pode alterar isso definindo uma variável (ou a função inteira) como pertencendo ao namespace global. Para fazer isso, basta escreve a palavra Global na primeira linha interna do corpo da função.

Exemplo: No código abaixo, se você remover a linha Global do corpo da função, a variável CONTEUDO_DO_EDIT vai ficar em branco dentro da função EXIBIR_CONTEUDO_DO_CAMPO, mas com esta designação, ela erá a mesma variável que definimos para o campo.

Code: Select all

gui, add, edit, x20 y20 w200 vCONTEUDO_DO_EDIT
gui, add, button, x20 y50 gRODAR, RODAR
gui, show, w400 h200
Return

RODAR:
EXIBIR_CONTEUDO_DO_CAMPO()
Return


EXIBIR_CONTEUDO_DO_CAMPO()
{
	Global
	Gui, submit, nohide
	msgbox % CONTEUDO_DO_EDIT
}
Return

:arrow: O controle dos Namespaces existe por questões de organização. Algumas vezes, principalmente quando estamos trabalhando em códigos grandes, queremos definir variáveis com nomes comuns como "conteiner", "resultado", etc, mas se o namespace global fosse sempre utilizado, correríamos um sério risco de reescrever variáveis importantes em outro lugar do código, de modo que o controle dos namespaces permite que escrevamos nomes de variávies em funções sem ter que verificar o código inteiro para saber se eles não foram usados em outro lugar.

DICA: é possível definir apenas ALGUMAS variáveis como sendo global. Caso você quisesse que apenas a variável CONTEUDO_DO_EDIT fosse global no script acima, bastaria escrever o nome dela logo após a palavra global na primeira linha do corpo da função.
jrufino
Posts: 31
Joined: 25 Oct 2019, 07:17

Re: Ajuda com Script

Post by jrufino » 18 Dec 2020, 11:57

Gio wrote:
18 Dec 2020, 11:00
Bom dia Jrufino.


As funções cumprem alguns objetivos da programação, um dos quais é a organização do código. Por isso, elas operam, por padrão, com um namespace (espaço de nomes) próprio. Isso significa que uma variável chamada VAR1 dentro do corpo de uma função NÃO será a mesma variável VAR1 que estiver fora do corpo da função.

Você pode alterar isso definindo uma variável (ou a função inteira) como pertencendo ao namespace global. Para fazer isso, basta escreve a palavra Global na primeira linha interna do corpo da função.

Exemplo: No código abaixo, se você remover a linha Global do corpo da função, a variável CONTEUDO_DO_EDIT vai ficar em branco dentro da função EXIBIR_CONTEUDO_DO_CAMPO, mas com esta designação, ela erá a mesma variável que definimos para o campo.

Code: Select all

gui, add, edit, x20 y20 w200 vCONTEUDO_DO_EDIT
gui, add, button, x20 y50 gRODAR, RODAR
gui, show, w400 h200
Return

RODAR:
EXIBIR_CONTEUDO_DO_CAMPO()
Return


EXIBIR_CONTEUDO_DO_CAMPO()
{
	Global
	Gui, submit, nohide
	msgbox % CONTEUDO_DO_EDIT
}
Return

:arrow: O controle dos Namespaces existe por questões de organização. Algumas vezes, principalmente quando estamos trabalhando em códigos grandes, queremos definir variáveis com nomes comuns como "conteiner", "resultado", etc, mas se o namespace global fosse sempre utilizado, correríamos um sério risco de reescrever variáveis importantes em outro lugar do código, de modo que o controle dos namespaces permite que escrevamos nomes de variávies em funções sem ter que verificar o código inteiro para saber se eles não foram usados em outro lugar.

DICA: é possível definir apenas ALGUMAS variáveis como sendo global. Caso você quisesse que apenas a variável CONTEUDO_DO_EDIT fosse global no script acima, bastaria escrever o nome dela logo após a palavra global na primeira linha do corpo da função.
Obrigado pelo retorno Gio. Desculpa minha ignorância mas não consegui fazer funcionar e acho que me expressei mal tb rsrs.
Vou tentar ser mais direto, como faço para pegar o valor que está selecionado na DropDownList abaixo em uma função?

Code: Select all

Gui, add, DropDownList, x350 y80 vCAMPO_TIPO_AP, %listaTipoApart%
Pela função do botão "Alterar dados" eu consigo pegar o valor chamando a variável correspondente dele que é "CAMPO_TIPO_AP" , mas ainda não entendi como posso pegar o valor selecionado por outra função qualquer. Com os campos Edit eu consigo através do "ControlGetText", meu problema está sendo com a DropDownList.
Poder me exemplificar Gio? Por favor?
User avatar
Gio
Posts: 1118
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda com Script

Post by Gio » 19 Dec 2020, 11:21

Bom dia Jrufino.
Pela função do botão "Alterar dados" eu consigo pegar o valor chamando a variável correspondente dele que é "CAMPO_TIPO_AP" , mas ainda não entendi como posso pegar o valor selecionado por outra função qualquer.

Ainda não entendi porque a resposta anterior não elucidou a questão. Quando você diz "função" está se referindo à palavra "funcionalidade" ou a uma função no sentido que função tem para a programação mesmo?

De qualquer forma, o código abaixo traz 2 formas diferentes de coletar os dados do DropDownList, uma atrelada à hotkey F2 e a outra atrelada à hotkey F3. Ambas as hotkeys ativam "funções" (no sentido função de programação mesmo), mas você logo vai perceber que o método (funcionalidade) usado na segunda (ControlGetText) poderia ser usado fora de uma função também.

Code: Select all

listaTipoApart := "Comercial|Residencial"


Gui, add, DropDownList, x350 y80 vCAMPO_TIPO_AP Choose1, %listaTipoApart%
Gui, Show, w600 h500, Assistente para Preenchimento (Empreendimentos)
Return



f2::
RECUPERAR_DADOS()
Return


RECUPERAR_DADOS()
{
	global
	Gui, submit, nohide
	msgbox % CAMPO_TIPO_AP
	
}
Return



f3::
RECUPERAR_DADOS_COM_CONTROLGETTEXT()
Return


RECUPERAR_DADOS_COM_CONTROLGETTEXT()
{
	ControlGetText, DADOS_DO_DROP_DOWN, COMBOBOX1, Assistente para Preenchimento (Empreendimentos)
	msgbox % DADOS_DO_DROP_DOWN
}
Return

:arrow: O ClassNN da DropDownList (COMBOBOX1) foi obtido através do WindowSpy, que é uma ferramente embutida no AutoHotkey (execute qualquer script que não termine rápido, clique no ícone de H verde com o botão direito do mouse (o ícone fica na parte inferior-direita da tela) e selecione "Window Spy". Depois, é só posionar o mouse em cima do controle de janela desejado para ver o ClassNN dele (Follow mouse" precisa estar marcado).

Espero ter ajudado, se ainda não tiver respondido sua pergunta, por favor explique melhor o que está tentando fazer que tentarei ser mais claro também :beer:
jrufino
Posts: 31
Joined: 25 Oct 2019, 07:17

Re: Ajuda com Script

Post by jrufino » 19 Dec 2020, 13:42

Gio wrote:
19 Dec 2020, 11:21
Bom dia Jrufino.
Pela função do botão "Alterar dados" eu consigo pegar o valor chamando a variável correspondente dele que é "CAMPO_TIPO_AP" , mas ainda não entendi como posso pegar o valor selecionado por outra função qualquer.

Ainda não entendi porque a resposta anterior não elucidou a questão. Quando você diz "função" está se referindo à palavra "funcionalidade" ou a uma função no sentido que função tem para a programação mesmo?

De qualquer forma, o código abaixo traz 2 formas diferentes de coletar os dados do DropDownList, uma atrelada à hotkey F2 e a outra atrelada à hotkey F3. Ambas as hotkeys ativam "funções" (no sentido função de programação mesmo), mas você logo vai perceber que o método (funcionalidade) usado na segunda (ControlGetText) poderia ser usado fora de uma função também.

Code: Select all

listaTipoApart := "Comercial|Residencial"


Gui, add, DropDownList, x350 y80 vCAMPO_TIPO_AP Choose1, %listaTipoApart%
Gui, Show, w600 h500, Assistente para Preenchimento (Empreendimentos)
Return



f2::
RECUPERAR_DADOS()
Return


RECUPERAR_DADOS()
{
	global
	Gui, submit, nohide
	msgbox % CAMPO_TIPO_AP
	
}
Return



f3::
RECUPERAR_DADOS_COM_CONTROLGETTEXT()
Return


RECUPERAR_DADOS_COM_CONTROLGETTEXT()
{
	ControlGetText, DADOS_DO_DROP_DOWN, COMBOBOX1, Assistente para Preenchimento (Empreendimentos)
	msgbox % DADOS_DO_DROP_DOWN
}
Return

:arrow: O ClassNN da DropDownList (COMBOBOX1) foi obtido através do WindowSpy, que é uma ferramente embutida no AutoHotkey (execute qualquer script que não termine rápido, clique no ícone de H verde com o botão direito do mouse (o ícone fica na parte inferior-direita da tela) e selecione "Window Spy". Depois, é só posionar o mouse em cima do controle de janela desejado para ver o ClassNN dele (Follow mouse" precisa estar marcado).

Espero ter ajudado, se ainda não tiver respondido sua pergunta, por favor explique melhor o que está tentando fazer que tentarei ser mais claro também :beer:
O erro foi meu Gio, tua primeira resposta já resolvia meu problema mas não sei o quê eu fiz que ao tentar fazer no meu script não estava funcionando usando o Global, creio que eu estava usando a variável com aquele "v" minúsculo do começo pois agora testei das 2 formas que vc exemplificou e funcionou perfeitamente. Então mais uma vez muito obrigado.

Até estranhei quando não funcionou pois o senhor sempre é preciso nas respostas :lol: ... mas foi eu que fiz algo errado.
Agora achei outro problema, a minha função "funcaoDadosExcel" pega dados de uma linha de uma planilha do Excel e preenche os campos do meu script, porém quando eu chamo as variáveis dos campos, o script me mostra o valor antigo delas e não o valor autal, pro exemplo, digamos que eu tenha o MAT_BASEc om valor 100 e após eu chamar essa função o valor passe para 200, no momento que faço "msgbox % MAT_BASE" era pra me mostrar o valor de 200 pois é ele o valor atual, porém o valor que me mostra é o 100.
Qual é a minha intenção, é pegar os valores de uma planilha, carrega-los no meu script e posteriormente copia-los para outro programa aqui do meu trabalho... eu já consigo fazer isso através das hotkeys porém queria deixar o script mais automatizado.

Code: Select all

IfMsgBox, Yes
	{			
		sleep, 200
		send, {down}
		sleep, 250
		send, {Alt down}a{Alt up}
				
		ControlGetText, CAMPO_INDICE, Edit25, Assistente para Preenchimento (Empreendimentos)
		Gui, submit, nohide
		funcaoDadosExcel(CAMPO_INDICE)
		msgbox % MAT_BASE
		return
		
		sleep, 200
		send, {escape}
		sleep, 300
		funcaoAlteraTipoImovel()
		Gui, Show		
	}	
Vou explicar como quero que meu script funcione pra você entender melhor, eu aparto uma hotkey, ele puxa os dados da planilha e altera no software e salva, depois eu faço a pergunta se quer ir para o proximo, e puxaria os dados da proxima linha da planilha e alteraria no software novamente... então faria um laço de repetição, porém como
mencionei acima, este ultimo passo não está funcionando pois na hora que é pra jogar no software os dados da proxima planilha, o script tá jogando os dados antigos, e nao os dados que foram carregados por último no script.

Espero ter conseguido explicar bem rsrsrs
jrufino
Posts: 31
Joined: 25 Oct 2019, 07:17

Re: Ajuda com Script

Post by jrufino » 19 Dec 2020, 14:22

Adicionei um print pra ajudar.
Como podes ver, no Script o campo MATRICULA-BASE está com o número 60588, mas o valor continua o antigo que é 60587.
Attachments
Script GIO.jpg
Script GIO.jpg (171.2 KiB) Viewed 73 times
Post Reply

Return to “Ajuda e Suporte Geral”