Abilitare la funzione redo dopo un replace all

di il
8 risposte

Abilitare la funzione redo dopo un replace all

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

  • Re: Abilitare la funzione redo dopo un replace all

    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.

  • Re: Abilitare la funzione redo dopo un replace all

    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.

  • Re: Abilitare la funzione redo dopo un replace all

    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

  • Re: Abilitare la funzione redo dopo un replace all

    Grazie a tutti per l'intervento.

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

  • Re: Abilitare la funzione redo dopo un replace all

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

  • Re: Abilitare la funzione redo dopo un replace all

    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

  • Re: Abilitare la funzione redo dopo un replace all

    • 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

  • Re: Abilitare la funzione redo dopo un replace all

    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