Abilitare la funzione redo dopo un replace all

di giorgiogio48 il
8 risposte

Ciao a tutti,
dopo un replace all la normale funzione undo e redo non funzionano.
Allora ne codice ho trovato una funzione che risolve il problema dell'undo.
Ho fatto così:
a livello di modulo ho inserito lr istruzioni:
[CODE]Private Undos As List(Of String) = New List(Of String)()
Private AddUndo As Boolean = True [/CODE]
Poi nella voce di menu 'undo' ho inserito il seguente codice:
[CODE]If Undos.Count <> 0 Then
    AddUndo = False

    If Undos.Count > 1 Then
        Document.Text = Undos(Undos.Count - 2)
        Undos.RemoveAt(Undos.Count - 1)
    Else

        Undos.RemoveAt(0)
    End If

    AddUndo = True
End If[/CODE]
Poi nell'evento richtexbox_TextChanged ho inserito_
[CODE]If AddUndo = True Then
    Undos.Add(Document.Text)

End If

[/CODE]
E così ho risolto il problema dell'undo
Ora non riesco a fare la stessa cosa per in redo.
Non dovrebbe essere difficile perchè ho il codice per l'undo, mo non riesco a farlo.
Qualcuno potrebbe aiutami a risolvere il problema?
Grazie a tutti in anticipo
Saluti

8 Risposte

  • Ma scusa, se con il comando Undo cancelli l'ultima modifica registrata nell'elenco, come fai a fare il Redo, prendendo la versione successiva che ormai è persa?

    Devi salvare le varie modifiche nella List, e poi l'Undo/Redo scorrono la lista in base all'indice che scegli. L'indice andrà dichiarato a livello di modulo anche lui ed impostato all'occorrenza. L'Undo modificherà andando a prendere la versione n-1, il Redo la versione n+1.

    Se n = 0, il comando Undo sarà disabilitato. Se n = Undos.Count -1 il Redo sarà disabilitato.

  • Scusate l'intromissione, ma se si facesse uso di uno Stack<T> il problema non sarebbe risolto automaticamente? :)

    Oltre a questo, il codice sarebbe molto più semplice e leggibile, che poi è la struttura adatta a gestire una operatività di questo tipo.

  • La Stack non la conoscevo. Grazie del suggerimento.

    Mi manca comunque la logica per il Redo: se invoco Pop con l'Undo, dovrei avere una seconda Stack per i Redo? 

    Il Pop mi cancella comunque l'ultimo dato dalla Stack… mi sono perso. XD

  • Grazie a tutti per l'intervento.

    Anch'io ho provato a seguire i vostri consigli, ma non ho risolto

  • E hai provato come? Se non mostri il codice viene difficile aggiungere più di quanto già detto.

  • 28/10/2023 - Sgrubak ha scritto:


    E hai provato come? Se non mostri il codice viene difficile aggiungere più di quanto già detto.

    scusa ma non ricordo bene. Ricordo solo che quello che ho fatto non risolve il problema

    • Dunque ho risolto il problema così: ho dichirato due variabili pubbliche a livello di codice

    Module Module1
       Public str_rep As String = Form3.TextBox1.Text
       Public str_rep1 As String = Form3.TextBox2.Text
    End Module

    • Poi  doppio click sul pulsante del form per la sostituzione e inserisco questo codice e nascondo il form per la sostituzione

            Dim curPos, curSel As Integer
           curPos = Me.Document.SelectionStart
           curSel = Document.SelectionLength
           str_rep1 = Form3.TextBox1.Text
           str_rep = Form3.TextBox2.Text
           Document.Text =
       Replace(Document.Text, str_rep1.Trim,
    str_rep.Trim, , , CompareMethod.Text)
           Dim numbers As Stack(Of String) = New Stack(Of String)()
           numbers.Push(str_rep.Trim)
           numbers.Push(str_rep1.Trim)

           Document.SelectionStart = curPos
           Document.SelectionLength = curSel
           Document.Modified = True
    me.Hide

    Dunque il gioco è fatto.

    Arrivederci

  • 28/10/2023 - Sgrubak ha scritto:


    Mi manca comunque la logica per il Redo: se invoco Pop con l'Undo, dovrei avere una seconda Stack per i Redo? 

    Dipende da cosa si intende per Redo: se vuol dire ripetere nuovamente l'ultima operazione eseguita, va da sé qual è l'informazione da mantenere, ossia l'ultima operazione eseguita. Non ti serve tenere le precedenti, basta una.

    Se invece intendiamo riprodurre tutto quello che è stato inserito storicamente nello Stack ed è stato tirato fuori, allora sì, occorre un altro Stack probabilmente.

    Il suggerimento di usare gli stack era volto a semplificare: non che una lista sia sbagliata, ma fondamentalmente parliamo di strutture dove inseriamo elementi sequenziali e li rimuoviamo in modo altrettanto sequenziale, quindi la posizione effettiva (tranne l'ultimo) non ci interessa, ergo la lista è solo una complicazione (perché devi determinare sempre l'indice dell'ultimo elemento in base al numero di elementi).

Devi accedere o registrarti per scrivere nel forum
8 risposte