Modifier

Pour cette huitième journée, je vous propose une petite astuce pour rendre une zone de saisie éditable dans n'importe quel éditeur de texte y compris ceux qui ne permettent pas d'ouvrir en mode bloquant (style Notepad ++ ou Sublime Text).

L'astuce consiste à ouvrir le texte dans un fichier temporaire et à surveiller les modifications qui surviennent sur ce fichier.

Voici les étapes qui permettent d'arriver à ce résultat :

Vous devez d'abord créer une variable qui contiendra le chemin du fichier d'édition : FichierEdition.

Ensuite, vous devez créer les fonctions suivantes :

Celle qui permet d'arrêter la surveillance d'un fichier. Elle est utilisée dans le code suivant, mais elle doit être aussi utilisée lorsqu'on arrête de surveiller le fichier, par exemple, dans le cas de la fermeture de la fenêtre :

SI PAS FichierEdition ~= "" ALORS
    fSurveilleStop(FichierEdition)
    SI fFichierExiste(FichierEdition) ALORS fSupprime(FichierEdition)
    FichierEdition = ""
FIN

Et celle qui contient le reste :

PROCEDURE EditeurTexteOuvrir(LOCAL pChamp est un Champ)
Texte est une chaîne = pChamp

FichierTemporaire est une chaîne = fFichierTemp("EDT") + ".txt"
fSauveTexte(FichierTemporaire, Texte)

HashFichierTemporaire est une chaîne = HashFichier(HA_HMAC_MD5_128, FichierTemporaire)
iEditeurTexteDémarrerSurveillance(FichierTemporaire, iSurModificationFichier)

LanceAppliAssociée(FichierTemporaire)

    PROCEDURE INTERNE iSurModificationFichier()
        Contenu est une chaîne = fChargeTexte(FichierTemporaire, foAnsi)
        NouveauHash est une chaîne = HashFichier(HA_HMAC_MD5_128, FichierTemporaire)

        // Notepad ++ et Sublime Text semblent sauvegarder le fichier 2 fois. La première fois à vide et la seconde fois avec les données
        // On ne considère pas comme une modification le fait que le fichier soit vide
        FichierModifié est un booléen = PAS Contenu ~= "" _ET_ NouveauHash <> HashFichiertemporaire

        SI FichierModifié ALORS
            HashFichiertemporaire = NouveauHash
            ExécuteThreadPrincipal(iPrévenirUtilisateur)
        FIN

        PROCEDURE INTERNE iPrévenirUtilisateur()
            TexteModifié est une chaîne = fChargeTexte(FichierTemporaire)

            ModificationDétectée est un booléen = (PAS TexteModifié ~= pchamp)

            SI ModificationDétectée ALORS
                SELON Dialogue("Le texte a été modifié dans l'éditeur de texte. Souhaitez-vous récupérer les modifications ?", ["Récupérer le texte", "Annuler"],1, 2)
                    CAS 1 :
                        pChamp = TexteModifié
                        ExécuteTraitement(pChamp, trtModification)

                    CAS 2 : // On ne fait rien
                FIN
            FIN
        FIN
    FIN

    PROCEDURE INTERNE iEditeurTexteDémarrerSurveillance(pFichierSurveillé est une chaîne, pProcédureSurModification est Procédure)
        EditeurTexteStopperSurveillance()
        FichierEdition = pFichierSurveillé

        fSurveilleFichier(pFichierSurveillé, pProcédureSurModification, fsTout)
    FIN

Vous n'avez plus qu'à appeler la fonction EditeurTexteOuvrir et à lui passer le champ de saisie que vous souhaitez éditer.

J'espère que cette astuce vous plaira.

Bonne journée à tous !

Article suivant Article précédent

Blog Comments powered by Disqus.