Comment puis-je créer “annuler” en C++?
J'ai besoin de créer une fonction qui annule la tâche précédente/ajout/modification. Comment dois-je faire en Borland C++?
(Le programme stocke des chaînes de texte dans un fichier texte à l'aide de "liste". Il est stocké, puis effacé à moins que j'ai utiliser la fonction enregistrement-fonction que j'ai créé.)
Je voulais dire la création d'une fonction d'annulation en une simple application console par la voie.
Vous devez vous connecter pour publier un commentaire.
Je vais vous donner encore une autre réponse, mais je pense que la couverture a été insuffisants à ce jour.
Le sujet est loin d'être négligeable, et googler elle renvoie un bon nombre de résultats. De nombreuses applications en œuvre un "undo" de l'opération, et il existe de nombreuses variantes.
Il y a 2 modèles de conception qui peut nous aider ici:
Command
: c'est une réification d'une actionMemento
: qui consiste à stocker de l'état (implique généralement une certaine forme de sérialisation)La
Command
modèle est très utilisé dans des environnements graphiques, car généralement il y a différentes façons d'accomplir une action. Pensez à enregistrer dans Microsoft Word, par exemple:Et bien sûr enregistrer est probablement mis en œuvre en terme de enregistrer sous.
L'avantage de la
Command
modèle ici est double:undo
opérationMaintenant, il y a diverses questions propres à
undo
:rm
sur Linux ou vider la corbeille bin action sur Windows)Car il y a divers problèmes, il y a diverses stratégies:
Memento
coup de pied dans)Memento
s qui consomme de l'espace, vous pouvez alors utiliser une approche qui consiste à ne mémoriser un Instantané toutes les 10 ou 20 commandes, puis refaire les commandes à partir du dernier instantané jusqu'à la commande annuléeEn fait, vous pouvez probablement mélange
Command
etMemento
à loisir, selon les spécificités de votre système et donc la complexité de soit.Je ne considérant que l'annulation de la dernière action exécutée pour commencer (à l'aide d'une pile d'action de l'époque). La fonctionnalité de défaire n'importe quelle action de l'utilisateur souhaite est beaucoup plus compliqué.
À mettre en œuvre Annuler, vous devez créer une "action de la pile" dans votre application. Il existe deux approches de base, si:
Savoir votre point de départ (la dernière fois que le fichier a été enregistré, ou depuis le fichier a été créé), n'oubliez pas chaque seul changement qui a fait en sorte que, lorsque quelque chose doit être annulée vous venez de jeter le "plus haut" et régénérer l'affichage en cours de la ligne de base ainsi que toutes les modifications. En cliquant sur "Refaire", puis met juste que le point de retour sur la pile. Cela a un autre avantage est de pouvoir trivialement supprimer des éléments n'importe où dans la pile sans perturber le fonctionnement d'autres options annuler/refaire, mais il y aura des soins spéciaux nécessaires pour s'assurer que l'application de la "montée" des états, est que l'utilisateur prévu.
Pour chaque action, boutique à l'extérieur de la modification qui a été faite à l'état précédent ainsi que les changements qui seraient nécessaires pour rétablir l'état précédent si vous deviez annuler. Maintenant, lorsque l'utilisateur clique sur "Annuler" fais le "undo" étapes. Lorsque vous cliquez sur "Rétablir" réappliquer les modifications qui ont été apportées. Dans certains cas, le "Défaire" des mesures seront "voici ce que la chose semblait comme avant", mais qui peuvent causer des ravages si vous souhaitez autoriser les utilisateurs à supprimer des éléments qui ne sont pas sur le haut de la pile et que vous devez la supprimer quelque chose au-dessus d'elle.
Le bon choix dépend de beaucoup de facteurs, y compris la quantité de données que vous pouvez/allez transporter. Option #1 est en un certain sens, plus facile, mais il peut devenir très lent pour annuler quoi que ce soit si l'action de la pile est grande.
Vous devriez vérifier Modèle De Commande.
Une autre référence: En utilisant le modèle de Commande pour annuler la fonctionnalité
Voir aussi le souvenir de modèle. Parfois, l'intelligence qui doit aller dans une commande pour annuler une opération est assez compliqué. Les objets de dessin dans un programme de peinture par exemple. Il peut être plus facile de la garder un souvenir et de le restaurer depuis que memento pour mettre en œuvre l'annuler.
Vous pouvez stocker des instantanés de l'état. L'état est l'ensemble des données qu'une action peut modifier. Lorsque vous cliquez sur annuler, l'état actuel est remplacé par les précédents. En fait ce n'est pas une tâche facile, surtout si l'état est complexe.
J'ai fait l'expérience dernièrement sur le sujet. Dans le cas où vous n'avez pas besoin de compatibilité binaire, découvrez https://github.com/d-led/undoredo-cpp