Sobre Save Topic is solved

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

Moderator: Gio

Nauany
Posts: 29
Joined: 12 Dec 2016, 01:37

Sobre Save

01 Oct 2019, 15:36

Boa tarde, a tempos eu uso o autoHK e sempre que eu fecho ele, quando abro novamente preciso fazer os mesmo procedimentos, coisa que poderia deixar salvo e não perder tempo...
eu gostaria de conseguir salvar sem ter que mexer no meu codigo com posições fixas, por exemplo:

Code: Select all

#SingleInstance Force

GuiW := 150, GuiH := 150
Gui, +LastFound +Resize +MinSize%GuiW%x%GuiH%
hGui1 := WinExist()
Gui, Margin, 20, 10

tabs:=1

gui, Add,Tab2,vTab TCS_BUTTONS	0x100,Teste

gui, Tab,Teste
gui, add, button, x135 y45 h30 w40 gteste, Arraste
gui, add, button, x190 y190 h30 w80 gexit, Exit Script

gui, show
return

teste: 
{
	MsgBox ,48 , , Selecione a o local para poder arrastar, 10
	KeyWait, LButton, D
	MouseGetPos, gpX, gpY
	
	mbutton::
	{
		MouseGetPos, xpos, ypos
		Send {Ctrl down}
		MouseClickDrag, L, %xpos%, %ypos%, %gpX%, %gpY%, 0
		MouseMove, %xpos%,%ypos%
		Send {Ctrl up}
		return
	}
}
return

guiclose:
exit:
 {
   exitapp
 }
return


Nesse caso ele iria primeiro salvar a posição para arrastar algo quando eu aperto a "bolinha do mouse", ele vai clicar e arrastar algo segurando ctrl até o ponto escolhido.
Agora que vem o X da questão, se eu por acaso fechar o programa desligar o pc, ou qualquer coisa do tipo, proxima vez que reabrir esse code, vou ter que escolher a posição novamente... como eu faria para ficar salvo a posição que eu ja escolhi uma vez?
(esse codigo que coloquei ai, é apenas um exemplo para eu poder entender como funciona...)
User avatar
Gio
Posts: 683
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Sobre Save

02 Oct 2019, 16:06

Boa tarde Nauany.

Quando você executa um programa, as informações daquela sessão de execução ficam salvas apenas na memória RAM. A memória RAM é uma memória mais rápida, porém é volátil, ou seja, os dados que ela contém são eliminados quando o programa encerra.

Para manter dados de programas salvos após o desligamento do computador, você deverá escrevê-los na memória física (Disco Rígido ou HD). Em outras palavras, você deverá fazer seu programa escrever um arquivo com aqueles dados antes de terminar aquela sessão de execução.

Para escrever um arquivo no HD do computador com dados na forma de texto, você poderá usar por exemplo o comando FileAppend. Depois, sempre que quiser ler esses dados daquele arquivo, poderá utilizar o comando FileRead. Este comando pode ser usado no início do seu script para que seu programa verifique se algo já estava escrito no arquivo antes daquela sessão de execução.

Exemplo:

Code: Select all

If (FileExist(A_ScriptDir . "/ULTIMA_FRASE_SALVA"))
{
	FileRead, FRASE_SALVA, %A_ScriptDir%/ULTIMA_FRASE_SALVA
}
gui, add, text, x20 y20, Escreva uma frase aqui:
gui, add, edit, x20 y50 w200 vFRASE_ESCRITA, %FRASE_SALVA%
Gui, add, button, x80 y90 gSALVAR_NO_DISCO, SALVAR
gui, show, w250 h200
Return


SALVAR_NO_DISCO:
Gui, submit, nohide
FileDelete, %A_ScriptDir%/ULTIMA_FRASE_SALVA
FileAppend, %FRASE_ESCRITA%, %A_ScriptDir%/ULTIMA_FRASE_SALVA
Msgbox, 0, Aviso, Frase salva com sucesso. Reinicie o programa para vê-la.
Return


Guiclose:
ExitApp
:arrow: Veja que no código acima, a frase escrita será salva somente se você apertar no botão SALVAR. Teste escrever algumas frases, fechando o programa antes e depois de salvar, e veja o que aparece quando reinicia o script depois.

Observe também o uso do comando FileDelete dentro da label SALVAR_NO_DISCO. Ele está lá porque o comando FileAppend não apaga sozinho o que já estiver escrito no arquivo. Estude um pouco a lógica desse programa e creio que entenderá facilmente como criar um programa que faça o mesmo com os dados coletados no seu próprio exemplo (Coordenadas de tela).

Se depois disso ainda tiver alguma dúvida, basta postar abaixo :thumbup:
Nauany
Posts: 29
Joined: 12 Dec 2016, 01:37

Re: Sobre Save

03 Oct 2019, 07:24

Então no caso eu usaria o FileExist para ler algo que eu tenha deixado salvo, e o FileRead para ler uma variavel.
FileDelete para apagar o ultimo save e FileAppend para salvar um novo por cima, certo?
no caso o que vc fez foi salvar seu texto em uma variavel e depois carregou a variavel para ler o texto novamente certo?
como eu quero coordenadas eu usaria mais de uma variavel, assim eu precisaria carregar varias vezes,


por exemplo como eu uso o programa..

Code: Select all

	KeyWait, LButton, D
	MouseGetPos, PHeal1X, PHeal1Y   ;ele salva a posição do clique
	PixelGetColor, colorhp1,   %PHeal1X%, %PHeal1Y%  ;ele salvou a cor de minha vida na posição anterior
	....
	....
	PixelGetColor, colorhp01,   %PHeal1X%, %PHeal1Y% 	; aqui ele estaria pegando uma nova cor na posição salva
	....
	....
	if (colorhp1 != colorhp01)  ; compararia a primeira cor com a segunda para enviar o F1
		{
			Send {F1}
			Sleep, 800
			return 			
		}
dai no caso eu gostaria de salvar as variaveis "PHeal1X", "PHeal1Y" e "colorhp1" para usa-las novamente
eu conseguiria salvar todas ou teria de fazer um save pra cada ação? eu tentei com algo assim

Code: Select all


If (FileExist(A_ScriptDir . "/SAVE"))
{
	FileRead, PHeal1X, %A_ScriptDir%/SAVE
	FileRead, PHeal1Y, %A_ScriptDir%/SAVE
	FileRead, colorhp1, %A_ScriptDir%/SAVE
}

Gui, add, button, x80 y130 gSALVAR_NO_DISCO, SALVAR



SALVAR_NO_DISCO:
Gui, submit, nohide
FileDelete, %A_ScriptDir%/SAVE
FileAppend, %PHeal1X%, %A_ScriptDir%/SAVE
FileAppend, %PHeal1Y%, %A_ScriptDir%/SAVE
FileAppend, %colorhp1%, %A_ScriptDir%/SAVE
Return



ou mesmo no caso com o exemplo de clique e arraste que eu havia usado antes
porém n está salvando... poderia me ajudar a ver meu erro por favor?

Code: Select all

If (FileExist(A_ScriptDir . "/SAVE1"))
{
	FileRead, gpX, %A_ScriptDir%/SAVE1
	FileRead, gpY, %A_ScriptDir%/SAVE1

}



#SingleInstance Force

GuiW := 150, GuiH := 150
Gui, +LastFound +Resize +MinSize%GuiW%x%GuiH%
hGui1 := WinExist()
Gui, Margin, 20, 10

tabs:=1

gui, Add,Tab2,vTab TCS_BUTTONS	0x100,Teste

gui, Tab,Teste
gui, add, button, x135 y45 h30 w40 gteste, Arraste
Gui, add, button, x80 y130 gSALVAR, SALVE
gui, add, button, x190 y190 h30 w80 gexit, Exit Script

gui, show
return

teste: 
{
	MsgBox ,48 , , Selecione a o local para poder arrastar, 10
	KeyWait, LButton, D
	MouseGetPos, gpX, gpY
	
	mbutton::
	{
		MouseGetPos, xpos, ypos
		Send {Ctrl down}
		MouseClickDrag, L, %xpos%, %ypos%, %gpX%, %gpY%, 0
		MouseMove, %xpos%,%ypos%
		Send {Ctrl up}
		return
	}
}
return


SALVAR:
Gui, submit, nohide
FileDelete, %A_ScriptDir%/SAVE1
FileAppend, %gpX%, %A_ScriptDir%/SAVE1
FileAppend, %gpY%, %A_ScriptDir%/SAVE1
Return

guiclose:
exit:
{
   exitapp
}
return

User avatar
Gio
Posts: 683
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Sobre Save

03 Oct 2019, 08:29

Bom dia Nauany.

FileExist() é uma função que verifica se um arquivo existe. Eu atrelei ela a uma condicional (If), de modo que a tentantiva de leitura do arquivo ocorra apenas se ele existir.
FileRead é o comando que vai ler o conteúdo do arquivo e colocar tudo o que estiver lá em uma variável.
FileDelete é o comando que vai apagar o arquivo.
FileAppend é o comando que vai escrever os dados de uma variável (ou texto) no arquivo.

No caso do seu script, você tem que observar o seguinte: se você usar o FileAppend duas vezes seguidas informando o mesmo arquivo, ele vai escrever os dados no mesmo arquivo um após o outro. Então se a coordenada X é 200 e a coordenada Y é 300, o conteúdo do arquivo vai fica assim: 200300

Naturalmente, se você ler o conteúdo do arquivo usando FileRead para as variáveis gpX e gpY, ambas ficarão com o valor 200300

Por isso você pode separar os arquivos (criar um arquivo para o conteúdo da variável X e outro para o conteúdo da variável Y, ajustando todos os comandos File) ou então você pode usar um arquivo só, mas vai ter que criar uma rotina de estruturação dos dados (por exemplo, você pode escrever um | entre os valores e daí usar o comando StringSplit para separar o conteúdo do arquivo nas duas variáveis desejadas...).

:arrow: Em tempo: embora a segunda opção pareça mais trabalhosa, arquivos normalmente seguem ela. Por isso, arquivos de computador normalmente agregam muitas informações juntas e por isso são estruturados, e isso pode ser feito com separadores (exemplo: arquivo .CSV) ou com as posições da informação no arquivo (exemplo: a informação A começa a partir do byte 90 e tem 10 bytes de tamanho. Já a informação B começa a partir do byte 100 e têm 20 bytes de tamanho.). As informações também não precisam ficar em formato de texto (embora isso facilite a leitura).

:arrow: Dica: para facilitar o seu trabalho, salve os arquivos na extensão .txt. Assim, você pode abri-lo no bloco de notas depois de executar o programa para ver o que foi escrito (e como foi escrito).
Nauany
Posts: 29
Joined: 12 Dec 2016, 01:37

Re: Sobre Save

03 Oct 2019, 08:56

Gio wrote:
03 Oct 2019, 08:29
Bom dia Nauany.

FileExist() é uma função que verifica se um arquivo existe. Eu atrelei ela a uma condicional (If), de modo que a tentantiva de leitura do arquivo ocorra apenas se ele existir.
FileRead é o comando que vai ler o conteúdo do arquivo e colocar tudo o que estiver lá em uma variável.
FileDelete é o comando que vai apagar o arquivo.
FileAppend é o comando que vai escrever os dados de uma variável (ou texto) no arquivo.
Desculpe a arrogância, Bom dia meu amigo, entendi melhor agora.. muito obrigado.

entendi a parte do FIleAppend lendo os valores igual vc citou exemplo ai de "200300".
e o sobre eu usar o | com string split vc poderia me dar um exeplo para me facilitar um pouco por favor?

gostei muuuito da dica de usar o .txt. muito obrigado =D
User avatar
Gio
Posts: 683
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Sobre Save  Topic is solved

03 Oct 2019, 09:13

O exemplo abaixo implementa a extensão .txt e também estrutura o arquivo da forma que falei (a partir do separador |). Veja que agora, o arquivo salvo (que fica na pasta do script) foi salvo com a extensão .txt, então você pode abri-lo no notepad e ver o que foi escrito depois que clicou em SALVAR. A separação das informações (após a leitura do arquivo) foi feita usando o comando StringSplit.

Code: Select all

If (FileExist(A_ScriptDir . "/ULTIMA_FRASE_SALVA.txt"))
{
	FileRead, CONTEUDO_DO_ARQUIVO, %A_ScriptDir%/ULTIMA_FRASE_SALVA.txt
	StringSplit, FRASE_, CONTEUDO_DO_ARQUIVO, |
}
gui, add, text, x20 y20, Escreva uma frase aqui:
gui, add, edit, x20 y50 w200 vFRASE_ESCRITA, %FRASE_1%
gui, add, text, x20 y80, Escreva OUTRA frase aqui:
gui, add, edit, x20 y100 w200 vOUTRA_FRASE_ESCRITA, %FRASE_2%
Gui, add, button, x80 y130 gSALVAR_NO_DISCO, SALVAR
gui, show, w250 h200
Return


SALVAR_NO_DISCO:
Gui, submit, nohide
FileDelete, %A_ScriptDir%/ULTIMA_FRASE_SALVA.txt
FileAppend, %FRASE_ESCRITA%, %A_ScriptDir%/ULTIMA_FRASE_SALVA.txt
FileAppend, |, %A_ScriptDir%/ULTIMA_FRASE_SALVA.txt
FileAppend, %OUTRA_FRASE_ESCRITA%, %A_ScriptDir%/ULTIMA_FRASE_SALVA.txt
Msgbox, 0, Aviso, Frase salva com sucesso. Reinicie o programa para vê-la.
Return


Guiclose:
ExitApp
:arrow: Outra dica: você pode usar apenas um comandos FileAppend para escrever todas as informações juntas. Basta juntar tudo (inclusive os separadores nas suas posições certas) em uma variável só ou então escrever direto no parâmetro comando FileAppend usando a sintaxe de expressão literal.

:arrow: As variáveis FRASE_1 e FRASE_2 foram criadas pelo comando StringSplit (ele separa os dados do arquivo e cria uma array indexada conforme a quantidade de separadores encontrados). Se o conteúdo do arquivo tivesse mais separadores (que no nosso caso foi o |), haveriam mais variáveis indexadas, como FRASE_3, FRASE_4, etc...
Nauany
Posts: 29
Joined: 12 Dec 2016, 01:37

Re: Sobre Save

03 Oct 2019, 09:49

Gio wrote:
03 Oct 2019, 09:13

:arrow: Outra dica: você pode usar apenas um comandos FileAppend para escrever todas as informações juntas. Basta juntar tudo (inclusive os separadores nas suas posições certas) em uma variável só ou então escrever direto no parâmetro comando FileAppend usando a sintaxe de expressão literal.
Prefiro usar um por vez igual vc passou pra ficar um pouco mais detalhado. Mas obrigado pela dica também =]


Eu coloquei as variaveis da coordenadas como "gp_" ai no StringSplit ele às criariam de forma sequencial igual vc disse, ficando "gp_1" para a coordenada "x" e o "gp_2" para "y".
Até ai tudo certo coloquei para salvar em .txt. também e ele salvou a posição perfeita dentro do arquivo gerado, só que o problema que quando eu fecho o programa e abro novamente, ao usar o "botão do mouse" para "arrastar" ele arrasta para uma posição nada ve, como se ele n estivesse carregando o "gp_" vou mostrar como fiz..

Code: Select all

If (FileExist(A_ScriptDir . "/SAVE1"))
{
	FileRead, dentrodosave1, %A_ScriptDir%/SAVE1.txt
	StringSplit, gp_, dentrodosave1, |
	
}



#SingleInstance Force

GuiW := 150, GuiH := 150
Gui, +LastFound +Resize +MinSize%GuiW%x%GuiH%
hGui1 := WinExist()
Gui, Margin, 20, 10

tabs:=1

gui, Add,Tab2,vTab TCS_BUTTONS	0x100,Teste

gui, Tab,Teste
gui, add, button, x135 y45 h30 w40 gteste, Arraste
Gui, add, button, x80 y130 gSALVAR, SALVE
gui, add, button, x190 y190 h30 w80 gexit, Exit Script

gui, show
return

teste: 
{
	MsgBox ,48 , , Selecione a o local para poder arrastar, 10
	KeyWait, LButton, D
	MouseGetPos, gp_1, gp_2
	
	mbutton::
	{
		MouseGetPos, xpos, ypos
		Send {Ctrl down}
		MouseClickDrag, L, %xpos%, %ypos%, %gp_1%, %gp_2%, 0
		MouseMove, %xpos%,%ypos%
		Send {Ctrl up}
		return
	}
}
return


SALVAR:
Gui, submit, nohide
FileDelete, %A_ScriptDir%/SAVE1.txt
FileAppend, %gp_1%, %A_ScriptDir%/SAVE1.txt
FileAppend, |, %A_ScriptDir%/SAVE1.txt
FileAppend, %gp_2%, %A_ScriptDir%/SAVE1.txt
Return

guiclose:
exit:
{
	exitapp
}
return
User avatar
Gio
Posts: 683
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Sobre Save

03 Oct 2019, 10:31

Na primeira linha do seu código, dentro da condicional If() o FileExist() está procurando por um arquivo chamado SAVE1, mas deveria procurar por um arquivo chamado SAVE1.txt.

:arrow: De primeiro, também não percebi somente com o olhar, mas coloquei algumas linhas de msgbox % gp_1 em alguns lugares do script até que vi que na rotina de leitura a variável estava vazia. Essa dica é muito boa para debugging de scripts: se não der certo, verifique os valores das variáveis nas posições chave do script.
Nauany
Posts: 29
Joined: 12 Dec 2016, 01:37

Re: Sobre Save

03 Oct 2019, 10:38

kkkkk que vergonha que deixei passar isso ai por falta de atenção...
mas muito obrigado novamente man.. vc sempre me ajudando ai no que é preciso, mesmo quando são coisas idiotas igual agora...
abrass boa tarde ae xD
Nauany
Posts: 29
Joined: 12 Dec 2016, 01:37

Re: Sobre Save

03 Oct 2019, 10:57

Gio wrote:
03 Oct 2019, 10:31
:arrow: De primeiro, também não percebi somente com o olhar, mas coloquei algumas linhas de msgbox % gp_1 em alguns lugares do script até que vi que na rotina de leitura a variável estava vazia. Essa dica é muito boa para debugging de scripts: se não der certo, verifique os valores das variáveis nas posições chave do script.
boaa n havia pensado em fazer esse role,mas realmente é uma dica muito boa.. vlws também =D

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 5 guests