[Ex] Annuler/Refaire : petite méthode polyvalente

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

[Ex] Annuler/Refaire : petite méthode polyvalente

#1

Message par mikell »

Bonjour

Un petit rappel rapide pour cibler le sujet
Le principe du "Undo / Redo" est de sauvegarder régulièrement certains paramètres au cours de l'utilisation d'un script. Ces sauvegardes successives permettent de créer un historique des opérations effectuées, et de 'circuler' dans cet historique avec des commandes "Annuler / Refaire"
Les sauvegardes peuvent être exécutées de manière silencieuse au moment où une action est effectuée, ou régulièrement avec un Timer (ou les deux)

Dans l'exemple qui suit, volontairement très simple pour juste montrer le principe de fonctionnement, c'est l'écriture d'un 'espace' dans le texte d'une editbox qui va déclencher automatiquement les sauvegardes (le choix dans ce cas est donc de sauvegarder à chaque mot de la phrase écrite)

L'intérêt :
L'idée est d'utiliser une array comme historique (donc pas de fichier temp) et d'employer la fonction ArrayPush()
Dans cette array on stocke les paramètres de ce qu'on veut sauvegarder
C'est donc un mécanisme très facile qui peut être adapté pour n'importe quelle action dans n'importe quel type de script, le déclenchement automatique (ou manuel) des sauvegardes étant complètement paramétrable par l'utilisateur Image
De plus le fait d'annuler (Undo) une action ne la supprime pas, elle reste enregistrée et on peut la refaire (Redo)
On peut aussi (ou pas...) fixer une limite au nombre de 'undo/redo' possibles en limitant la taille de l'array
etc

Code : Tout sélectionner

#include <GuiConstantsEx.au3>
#include <Array.au3>

Dim $Memo[1]        ; <= array de base 0 où seront stockés les paramètres Undo/Redo
$Memo[0] = ""

GUICreate("Test", 320, 120) 
$edit = GUICtrlCreateEdit("", 10, 10, 200, 100, 4)   ; ($ES_MULTILINE = 4)
$undo = GUICtrlCreateButton("Undo", 220, 20, 40, 25)
$redo = GUICtrlCreateButton("Redo", 270, 20, 40, 25)
GUISetState()

While 1

if _IsPressed ("20") Then    ; <= à chaque fois qu'on écrit un 'espace' dans l'edit
; on agrandit l'array 
    ReDim $Memo[UBound($Memo)+1]     
; on définit ce qui doit être sauvegardé
    $temp = GuiCtrlRead($edit)
; la sauvegarde est enregistrée dans $Memo[0], les autres éléments de l'array sont "montés" d'un cran
    _ArrayPush($Memo, $temp, 1)            
    While _IsPressed ("20")
        Sleep (10)
    WEnd
EndIf

$msg = GUIGetMsg()
Switch $msg
    Case $GUI_EVENT_CLOSE 
        ExitLoop

    Case $undo
; Undo : $Memo[0] est transféré en fin de l'array et les autres éléments sont "descendus" d'un cran
        _ArrayPush($Memo, $Memo[0], 0)    
 ; et on lit le nouveau $Memo[0] (qui est l'ancien $Memo[1])
        GUICtrlSetData($edit, $Memo[0])   

    Case $redo
 ; Redo : le dernier élément $Memo[UBound($Memo)-1] est transféré au début de l'array et devient $Memo[0], les autres éléments sont "montés" d'un cran
        _ArrayPush($Memo, $Memo[UBound($Memo)-1], 1)  
; et on lit le nouveau $Memo[0] (qui est l'ancien $Memo[UBound($Memo)-1])
        GUICtrlSetData($edit, $Memo[0])    
EndSwitch
WEnd

;=========================================================
Func _IsPressed($sHexKey, $vDLL = 'user32.dll')
    ; $hexKey must be the value of one of the keys.
    ; _Is_Key_Pressed will return 0 if the key is not pressed, 1 if it is.
    Local $a_R = DllCall($vDLL, "short", "GetAsyncKeyState", "int", '0x' & $sHexKey)
    If @error Then Return SetError(@error, @extended, False)
    Return BitAND($a_R[0], 0x8000) <> 0
EndFunc   ;==>_IsPressed
 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre