LYSTVIEW: Botão "Alterar" gravando novos dados.

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

Moderator: Gio

User avatar
Ria
Posts: 23
Joined: 03 Sep 2018, 17:54

LYSTVIEW: Botão "Alterar" gravando novos dados.

31 Oct 2018, 13:41

Boa tarde,
Desde já agradeço aos cracks na matéria…!
Solicito ajuda para o seguinte evento:

- Codificação do botão "Alterar" de forma a que, após alterar dados no 2.º menu (editar), guarde as novas alterações na
respetiva linha selecionada que lhe deu origem!

Bloco de código do Menu 2, aqui já com botão "Cancelar"...preciso de codificar o "Alterar":

;--------------- modify ----------------
Editarx:
Gui,1:submit,nohide ; Mantém a janela 1
Gui,3: Color, +A9A9A9 ; Cor do backround Alterar
Gui,3:Font, s8 cBlack, Tahoma
Gui,3:Add,Text , x210 y8 w20, ID:
Gui,3:Add,Edit , x210 y23 w50 h18
Gui,3:Add,Text , x10 y8 w90, Matrícula:
Gui,3:Add,Edit, x10 y23 w60 h18 vA32, %C2%
Gui,3:Add,Text , x10 y45 w80, Proprietário:
Gui,3:Add,Edit , x10 y60 w250 h18 vA31, %C3%
Gui, 3:Add, text, x10 y85 w195, Informações complementares:
Gui, 3:Add, Edit, x10 y100 w250 h45, %C4%
Gui,3:Add, Button, x35 y155 w90 h21 gCancelar, &Cancelar
Gui,3:Add, Button, x140 y155 w90 h21, Alterar
Gui,3:Show, x1490 y885 w270 h200, ALTERAR:
Gui, 3:Add, StatusBar,, Created by %creator% %versão% ; Dia.Rev.Ano.Mês
GuiControl,3:Focus,A31
send,^{end}
return
;-------------
Cancelar: ; Botão Cancelar da Gui 3
gui, 3: destroy
return

CÓDIGO COMPLETO (Para percepção):
#warn
;
; ************** Versão/ Revisão
versão = Rev. 27.1.6.2018.10
creator = AHK BR-PT@2018
; *******************************
;
REPOSITORIO_DE_ORDEM := 1 ; INICIAMOS EM 1

setworkingdir,%a_scriptdir%
F1=%A_scriptdir%\Registo.txt
MainWindowTitle=ListView_Test1
transform,T,chr,09
Gui,1:default
gosub,testfile
Gui Add, StatusBar,, Created by %creator% %versão% ; Dia.Rev.Ano.Mês
Gui Color, +A9A9A9 ; Cor do backround 2
Gui, Font, s8 cBlack, Tahoma
Gui Add, GroupBox, cBlue x12 y5 w245 h143, BASE DE DADOS:
Gui, add, ListView, x20 y20 h120 w230 gLVa vLV1 +altsubmit , ID: | Matricula: | Proprietário: |Informações Complementares: | Processo: ; AQUI ADICIONAMOS A COLUNA INFORMACOES COMPLEMENTARES
Lv_ModifyCol(1, 25)
Lv_ModifyCol(2, 60)
gosub,fill
Gui, Add, text, x20 y152 w80 h20, Pesquisar:
Gui, Add, Edit, x20 y166 w85 h22 gFind vSrc,
Gui, Add, Button,x115 y165 w134 h22 gEliminarx, Eliminar selecionados(as)
Gui Add, GroupBox, -cBlue x12 y192 w245 h148, REGISTO:
Gui, add, Text, x20 y205, Matricula: ; Matrícula
Gui, Add, Edit, x20 y220 w60 h21 vNOME,
Gui, add, text, x90 y205, Proprietário: ; Proprietário
Gui, add, Edit, x90 y220 w160 h21 vFONE,
Gui, Add, text, x20 y244 w195 h20, Informações complementares: ; ADICIONAMOS A GROUPBOX
Gui, Add, Edit, vINFORM_COMPL x20 y259 w230 h30 ; ADICONAMOS O CAMPO DE INFORMAÇOES COMPLEMENTARES
Gui, Add, Button,x20 y304 w55 h24 gAdd , Guardar
Gui, Add, Button,x80 y304 w55 h24 gLimpa, Limpar
Gui, Add, text, x152 y292 w100 h20, Processo:
Gui, Add, Edit, x152 y307 w50 h20 vNPP, Inativo! ;NPP
Gui, Add, text, x206 y309 w20 h21, /
Gui, Add, Edit, x214 y307 w36 h20, ------ ;Ano
Gui, show, w267 h368, BASE DE DADOS ; ATUALIZARMOS ESTA LINHA PARA QUE A TELA TENHA UM TAMANHO QUE COMPORTE O NOVO CAMPO
Menu, CMenu, Add, Eliminar, menuDo
Menu, CMenu, Add, Editar , menuDo
Return
; -------------------------------------------
Add:
Gui, submit, nohide
Fileappend,%nome%`;%fone%`;%INFORM_COMPL%`r`n,%f1% ; LINHA ATUALIZADA COM AS INFORMACOES COMPLEMENTARES.
gosub,fill
sleep,1500
GuiControl,1:,fone,
GuiControl,1:,nome,
GuiControl,1:,INFORM_COMPL,
Return

GuiClose:
ExitApp
;-------------- Fill Listview -----------
Fill:
Gui,1:default
gui,1:listview,LV1
LV_Delete()
loop,read,%F1%
{
LR=%A_loopReadLine%
if LR=
continue
C1 =
C2 =
C3 =
stringsplit,C,LR,`;,
LV_Add("", A_Index, c1,c2, c3) ; LINHA TUALIZADA COM O C3 (INFORMACOES COMPLEMENTARES).
}
LV_ModifyCol(1, "Sort CaseLocale")
LV_Modify(LV_GetCount(), "Vis")
return
;----------------------------------------

;----------- Listview click on row -------
LVa:
Gui,1:Submit,nohide
if A_GuiEvent = Normal
{
LV_GetText(C2,A_EventInfo,2) ; LINHAS ATUALIZADAS
LV_GetText(C3,A_EventInfo,3) ; LINHAS ATUALIZADAS
LV_GetText(C4,A_EventInfo,4) ; LINHAS ATUALIZADAS
cx=%c2%;%c3%;%c4% ; LINHAS ATUALIZADAS
RN:=LV_GetNext("C")
RF:=LV_GetNext("F")
GC:=LV_GetCount()
}

if A_GuiEvent = Rightclick
{
LV_GetText(C2,A_EventInfo,2) ; LINHAS ATUALIZADAS
LV_GetText(C3,A_EventInfo,3) ; LINHAS ATUALIZADAS
LV_GetText(C4,A_EventInfo,4) ; LINHAS ATUALIZADAS
cx=%c2%;%c3%;%c4%
RN:=LV_GetNext("C")
RF:=LV_GetNext("F")
GC:=LV_GetCount()
goto,menux
}
return
;----------------------------

;------------- MENU when rightclick on row ----------
menux:
MouseGetPos, musX, musY
Menu, CMenu, Show, %musX%,%musY%
return
menudo:
If (A_ThisMenuItem = "Eliminar")
gosub,Eliminarx2
If (A_ThisMenuItem = "Editar")
gosub,Editarx
return
;-------------------------------
Limpa:
Gui, submit, nohide ; Limpa os dados do campo
GuiControl,1:,fone,
GuiControl,1:,nome,
GuiControl,1:,INFORM_COMPL,
GuiControl,1:,Src,
return
;--------------------------------
Eliminarx2:
Gui,1:default
gui,1:listview,LV1
if RF=0
return
;LV_GetText(C1, RF, 1)
LV_GetText(C2, RF, 2)
LV_GetText(C3, RF, 2)
LV_GetText(C4, RF, 2)
CT=%c2%;%C3%;%C4% ; LINHA TUALIZADA COM O C3 (INFORMACOES COMPLEMENTARES).
msgbox, 262180, APAGAR ,Tem a certeza que deseja eliminar a(s) linha(s) selecionada(s)? ;: %C1% ?
IfMsgBox,No
Return
LV_Delete(RF)
FileRead,AA,%F1%
Filedelete,%F1%
StringReplace,BB,AA,%ct%`r`n,,
FileAppend,%BB%,%F1%
return

;--------------- DELETE multiple selected rows --------------
Eliminarx:
;Gui, 2: Add, Text, x20 y20, Esta é a GUI 2!! ; ADICIONADO AQUI SOMENTE PARA EFEITO DIDATICO !!
;Gui, 2: Show, w500 h600 ; ADICIONADO AQUI SOMENTE PARA EFEITO DIDATICO !!
C1 =
RF = 0
RFL =
Loop
{
RF:=LV_GetNext(RF)
if RF=0
break
RFL = %RF%|%RFL%
LV_GetText(C1_Temp, RF, 1)
C1 = %C1%`n%C1_Temp%
}
if C1 !=
{
msgbox, 262180, APAGAR , Tem a certeza que deseja eliminar a(s) linha(s) selecionada(s)? ;: %C1% ?
IfMsgBox,No
Return
Else
{
Loop, parse, RFL, |
LV_Delete(A_LoopField)
filedelete,%F1%
Loop % LV_GetCount()
{
BX1=
BX2=
LV_GetText(BX2,A_INDEX,2) ; LINHA ATUALIZADA
LV_GetText(BX3,A_INDEX,3) ; LINHA ATUALIZADA
LV_GetText(BX4,A_INDEX,4) ; LINHA ATUALIZADA
fileappend,%BX2%`;%BX3%`;%BX4%`r`n,%F1%
}
}
C1=
C2=
}
return

;--------------- modify ----------------
Editarx:
Gui,1:submit,nohide ; Mantém a janela 1
Gui,3: Color, +A9A9A9 ; Cor do backround Alterar
Gui,3:Font, s8 cBlack, Tahoma
Gui,3:Add,Text , x210 y8 w20, ID:
Gui,3:Add,Edit , x210 y23 w50 h18
Gui,3:Add,Text , x10 y8 w90, Matrícula:
Gui,3:Add,Edit, x10 y23 w60 h18 vA32, %C2%
Gui,3:Add,Text , x10 y45 w80, Proprietário:
Gui,3:Add,Edit , x10 y60 w250 h18 vA31, %C3%
Gui, 3:Add, text, x10 y85 w195, Informações complementares:
Gui, 3:Add, Edit, x10 y100 w250 h45, %C4%
Gui,3:Add, Button, x35 y155 w90 h21 gCancelar, &Cancelar
Gui,3:Add, Button, x140 y155 w90 h21, Alterar
Gui,3:Show, x1490 y885 w270 h200, ALTERAR:
Gui, 3:Add, StatusBar,, Created by %creator% %versão% ; Dia.Rev.Ano.Mês
GuiControl,3:Focus,A31
send,^{end}
return
;-------------
Cancelar: ; Botão Cancelar da Gui 3
gui, 3: destroy
return
;--------
3GuiClose:
3GuiEscape:
Gui, 3:Destroy
return
3ButtonOK:
Gui,3:submit
if A31=
{
Gui,3: Destroy
return
}
FileRead, FileContent, %f1%
FileDelete, %f1%
StringReplace, FileContent, FileContent, %C1%`;%C2%, %A31%`;%A32%`;
FileAppend, %FileContent%, %f1%
GoSub,fill
Gui,3:destroy
return
;------------------- SEARCH -------------------------------
Find:
Gui,1: Submit, Nohide
Gui,1:listview, LV1
checkempty:
if (src="")
{
settimer,checkempty,off
goto,fill
return
}
settimer,checkempty,1000

LV_Delete()
loop,read,%f1%
{
LR=%A_loopReadLine%
if SRC<>
{
if LR contains %src%
{
stringsplit,C,A_LoopReadLine,`;
LV_Add("",A_index, C1,C2, C3) ; LINHA TUALIZADA COM O C3 (INFORMACOES COMPLEMENTARES).
}
}
else
continue
}
LV_Modify(LV_GetCount(), "Vis")
if (SRC="")
goto,Fill
return
;--------------- create testfile ----------------------
testfile:
ifnotexist,%f1%
{
e1=
(Ltrim Join`r`n

)
Fileappend,%e1%`r`n,%f1%
e1=
}
return
;============ END script ====================================
Podemos não voltar, mas vamos e...se fosse fácil, também não era mesmo para nós…! :superhappy:
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: LYSTVIEW: Botão "Alterar" gravando novos dados.

01 Nov 2018, 09:39

Bom dia Ria.

Vejo que o seu script está ficando bem robusto :bravo:
- Codificação do botão "Alterar" de forma a que, após alterar dados no 2.º menu (editar), guarde as novas alterações na
respetiva linha selecionada que lhe deu origem!
Você deve codificar a alteração da linha da listview usando a função Lv_Modify(), que permite mudar o texto da respectiva linha da listview. Vejo que ao iniciar a Gui 3, o script já coleta e guarda os dados dessa linha na variável RN, então da parte da listview tudo é uma questão de usar a Lv_Modify(), passando a ela o conteúdo da variável RN e também o novo conteúdo dos campos da Gui 3.

Depois, será necessário alterar o conteúdo do próprio arquivo, pois não queremos que a modificação seja perdida caso o usuário feche o aplicativo. Isso pode ser feito lendo o conteúdo atual do arquivo, alterando somente a linha correspondente e depois salvando o novo conteúdo no arquivo.

Na rotina abaixo, eu fiz algumas escolhas pessoais de como fazer essas coisas. Como estamos alterando um arquivo que pode ter informações importantes, todo cuidado é pouco, então ao invés de deletar o arquivo e escrever um novo em seguida, eu prefiro criar um novo, verificar seu conteúdo e depois movê-lo sobreescrevendo para o antigo (usando FileMove). Mas lembre-se que mais seguro ainda é fazer uma rotina de backup automático, caso você venha a trabalhar com muita informação nesse programa!

Partes alteradas ou incluídas do script:
Editarx:
Gui,1:submit, nohide ; Mantém a janela 1
Gui,3: Color, +A9A9A9 ; Cor do backround Alterar
Gui,3:Font, s8 cBlack, Tahoma
Gui,3:Add,Text , x210 y8 w20, ID:
Gui,3:Add,Edit , x210 y23 w50 h18
Gui,3:Add,Text , x10 y8 w90, Matrícula:
Gui,3:Add,Edit, x10 y23 w60 h18 vA32, %C2%
Gui,3:Add,Text , x10 y45 w80, Proprietário:
Gui,3:Add,Edit , x10 y60 w250 h18 vA31, %C3%
Gui, 3:Add, text, x10 y85 w195, Informações complementares:
Gui, 3:Add, Edit, x10 y100 w250 h45 vVARIAVEL_DAS_INFORMACOES_COMPLEMENTARES, %C4%
Gui,3:Add, Button, x35 y155 w90 h21 gCancelar, &Cancelar
Gui,3:Add, Button, x140 y155 w90 h21 gALTERAR_A_LISTVIEW, Alterar
Gui, 3:Add, StatusBar,, Created by %creator% %versão% ; Dia.Rev.Ano.Mês
Gui, 3: Show, x590 y85 w270 h200, ALTERAR:
GuiControl,3:Focus,A31
send,^{end}
return
;-------------

ALTERAR_A_LISTVIEW:
Gui, 3: Submit, nohide
Gui, 1: Default
Lv_Modify(RN, "Col2", A32)
Lv_Modify(RN, "Col3", A31)
Lv_Modify(RN, "Col4", VARIAVEL_DAS_INFORMACOES_COMPLEMENTARES)
FileRead, CONTEUDO_ATUAL_DO_ARQUIVO, %A_ScriptDir%/Registo.txt
StringReplace, NOVO_CONTEUDO_DO_ARQUIVO, CONTEUDO_ATUAL_DO_ARQUIVO, %C2%`;%C3%`;%C4%, %A32%`;%A31%`;%VARIAVEL_DAS_INFORMACOES_COMPLEMENTARES%
FileAppend, %NOVO_CONTEUDO_DO_ARQUIVO%, %A_ScriptDir%/Registo_NOVO.txt
FileRead, ARQUIVO_ESCRITO, %A_ScriptDir%/Registo_NOVO.txt
If (ARQUIVO_ESCRITO = NOVO_CONTEUDO_DO_ARQUIVO)
{
FileMove, %A_ScriptDir%/Registo_NOVO.txt, %A_ScriptDir%/Registo.txt, 1
If (ErrorLevel)
{
msgbox, 0x10, Erro, Houve um erro na gravação dos dados da alteração no arquivo. Por favor, tente novamente.
Return
}
else
{
msgbox, 0, Sucesso, Alteração efetuada com sucesso !
Gui, 3: Destroy
Return
}
}
Else
{
msgbox, 0x10, Erro, Houve um erro na gravação dos dados da alteração no arquivo. Por favor, tente novamente.
}
Return
OBS: No código acima, a alteração na linha do arquivo usa o StringReplace. Ocorre que a Gui 3 ainda não estava exibindo a ID. Será muito importante colocar essa informação e usá-la no StringReplace do código acima, pois este é o campo que em tese torna a linha única no arquivo e impede o StringReplace de acabar mudando uma linha idêntica que tenha outro ID.

OBS2: Adicionei um comando para destruir a GUI 3 quando a alteração estiver feita. Fiz isso porque após uma alteração, os dados coletados da GUI inicialmente não mais corresponderiam a uma linha do arquivo, o que poderia gerar uma falha em encontrar a linha para fazer o StringReplace. Se você quiser, pode tirar essa necessidade de destruir a janela para forçar o usuário a abrir novamente se quiser editar de novo, mas vai ter que resolver a questão dos dados da linha para efetuar o segundo stringreplace corretamente (do contrário, a segunda alteração não vai salvar no arquivo!).

Se ainda tiver alguma dúvida sobre a como alterar os dados da listview ou de um arquivo, basta postar abaixo :thumbup:
User avatar
Ria
Posts: 23
Joined: 03 Sep 2018, 17:54

Re: LYSTVIEW: Botão "Alterar" gravando novos dados.

01 Nov 2018, 17:26

Olá Gio,
Você é o cara…!!! Quero ver quando fico como você! :headwall:
Tudo a funcionar na perfeição, exceto a variável das informações complementares, que é a única que se recusa a atualizar… :oops:
Tou ainda pesquisando pelo erro, começando pela confirmação da correção das variaveis...
Vejo que o seu script está ficando bem robusto :bravo:
Você tem me ajudado muito e mantido meu interesse neste assunto.
Na verdade esse script está engordando demais que já nem cabe na minha balança... :mrgreen:

PROBLEMA: Eu criei já uma nova Gui principal e aí coloquei várias coisas, entre as quais um botão de acesso a esta base de dados que falamos.
Mas eu devo ter me confundido / equivocado na renomeação das Gui´s, dado que aparecem botões sobrepostos pertencentes à Gui principal na Gui da base de dados…
Eu tentei resolver fazendo "Gui, destroy" à Gui principal e funciona mas na verdade essa Gui principal deveria ser aquela que está sempre ativa, pois é a base.
Tem como fazer chamada novamente a ela (Gui principal) ou tenho de pesquisar o erro vasculhando todo o código novamente?
(Já vai em1000 linhas)
Na rotina abaixo, eu fiz algumas escolhas pessoais de como fazer essas coisas. Como estamos alterando um arquivo que pode ter informações importantes, todo cuidado é pouco, então ao invés de deletar o arquivo e escrever um novo em seguida, eu prefiro criar um novo, verificar seu conteúdo e depois movê-lo sobreescrevendo para o antigo (usando FileMove). Mas lembre-se que mais seguro ainda é fazer uma rotina de backup automático, caso você venha a trabalhar com muita informação nesse programa!
Legal. Excelente explicação! Gostei da sua escolha pessoal e sem dúvida é a mais pro, segura e acertada!
Podemos não voltar, mas vamos e...se fosse fácil, também não era mesmo para nós…! :superhappy:
User avatar
Ria
Posts: 23
Joined: 03 Sep 2018, 17:54

Re: LYSTVIEW: Botão "Alterar" gravando novos dados.

01 Nov 2018, 17:48

Erro.
Last edited by Ria on 01 Nov 2018, 17:51, edited 1 time in total.
Podemos não voltar, mas vamos e...se fosse fácil, também não era mesmo para nós…! :superhappy:
User avatar
Ria
Posts: 23
Joined: 03 Sep 2018, 17:54

Re: LYSTVIEW: Botão "Alterar" gravando novos dados.

01 Nov 2018, 17:49

Descobri…! :beer: :beer: :beer:
Por lapso tinha mantido a minha linha, correspondente à sublinhada, a qual omitia a vVARIAVEL_DAS_INFORMACOES_COMPLEMENTARES…
Agora sim, a funcionar correta e totalmente..!!!
Editarx:
Gui,1:submit, nohide ; Mantém a janela 1
Gui,3: Color, +A9A9A9 ; Cor do backround Alterar
Gui,3:Font, s8 cBlack, Tahoma
Gui,3:Add,Text , x210 y8 w20, ID:
Gui,3:Add,Edit , x210 y23 w50 h18
Gui,3:Add,Text , x10 y8 w90, Matrícula:
Gui,3:Add,Edit, x10 y23 w60 h18 vA32, %C2%
Gui,3:Add,Text , x10 y45 w80, Proprietário:
Gui,3:Add,Edit , x10 y60 w250 h18 vA31, %C3%
Gui, 3:Add, text, x10 y85 w195, Informações complementares:
Gui, 3:Add, Edit, x10 y100 w250 h45 vVARIAVEL_DAS_INFORMACOES_COMPLEMENTARES, %C4%
Gui,3:Add, Button, x35 y155 w90 h21 gCancelar, &Cancelar
Gui,3:Add, Button, x140 y155 w90 h21 gALTERAR_A_LISTVIEW, Alterar
Gui, 3:Add, StatusBar,, Created by %creator% %versão% ; Dia.Rev.Ano.Mês
Gui, 3: Show, x590 y85 w270 h200, ALTERAR:
GuiControl,3:Focus,A31
send,^{end}
returne]
[/quote]
Podemos não voltar, mas vamos e...se fosse fácil, também não era mesmo para nós…! :superhappy:
garry
Posts: 3736
Joined: 22 Dec 2013, 12:50

Re: LYSTVIEW: Botão "Alterar" gravando novos dados.

02 Nov 2018, 17:30

veja o primeiro exemplo
https://autohotkey.com/boards/viewtopic.php?f=28&t=3384
tente isso não dependendo de quantas colunas
tente 'rightclick' em 'listbox'
e 'row' > MODIFY / DELETE
User avatar
Ria
Posts: 23
Joined: 03 Sep 2018, 17:54

Re: LYSTVIEW: Botão "Alterar" gravando novos dados.

12 Nov 2018, 15:45

Obrigado garry,
Eu já tinha observado e aproveitado essa sua dica.
Abraço
Podemos não voltar, mas vamos e...se fosse fácil, também não era mesmo para nós…! :superhappy:

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 22 guests