Salut,
Pour ce qui est du calcul de la modification entre 2 actions (ce que tu
appelles delta), cela me parait être une très bonne solution bien qu'assez
groumande en CPU en VB je pense.
Et le stockage ne serait pas si évident, il faudrait détecter toutes les
regions modifiées et les mettre dans un tableau de structures définie
comme suit (enfin c'est ce que je ferai, il y a peut être une meilleure
approche) :
Public Type Region
tCoord As Point 'structure contenant X, Y, la position del a région
tRegion As Region 'qui pourrait être un StdPicture ou tt autre objet
pour stocker une image
End Type
Il suffirait ensuite de recoller les morceau sur l'image pour revenir en
arrière.
--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Patrick Philippot wrote:Armando R. wrote:je voudrais pouvoir annuler plusieurs opérations l'une après l'autre
Bonjour,
La mise en place d'un mécanisme d'undo/redo nécessite de répondre à 2
questions: comment et quoi?
Comment?
-------------
En général, un tel mécanisme va être mis en oeuvre par le biais d'une
double pile. Au fur et à mesure de leur exécution, les actions de
l'utilisateur sont empilées sur la pile Undo. Si une commande Undo est
déclenchée, la dernière action exécutée est dépilée, son effet est
annulé (voir plus bas) et l'action est réempilée sur la pile Redo afin
de satisfaire une éventuelle commande Redo.
Les piles en questions peuvent être soit limitées en taille (nombre
limité de undo/redo), soit être ajustées dynamiquement. En VB, il me
paraît assez simple d'implémenter une classe Pile à partir d'un objet
Collection.
Une alternative à la méthode des piles est la méthode de la sauvegarde
incrémentale utilisée par exemple par Word en connexion avec les
storages (voir interface COM IStorage pour les explication sur les
storages - fichiers composites ou compound documents). Tous les
documents Office sont en fait des storages (système de fichier à
l'intérieur d'un fichier). Word utilise pour son système d'Undo/Redo
la possibilité que donne le storage de travailler en mode incrémental
(on ne stocke que ce qui change dans des répertoires séparés)
associée à la capacité des storages de travailler en mode
transactionnel (commit / rollback). Cette approche est très
intéressante mais beaucoup plus complexe et nécessite une bonne
connaissance du COM et de la manipulation des storages.
Quoi?
-------
La question qui vient immédiatement derrière est "que va-t-on mettre
sur ces piles?". Il est évident que stocker l'état complet du
document pour chaque action, surtout dans le cas des images, amène
rapidement soit à une saturation de la mémoire, soit à une forte
limitation du nombre d'actions undo autorisées. Cela peut cependant
faire l'affaire dans certains cas.
L'approche la plus efficace est cependant de stocker un ensemble de
données décrivant la commande qui vient d'être réalisée. A chaque
commande mise à la disposition de l'utilisateur doit correspondre un
objet "commande inverse" qui décrit l'action à entreprendre pour
annuler éventuellement l'effet de la commande qui va être exécutée.
C'est cette description que l'on stocke sur la pile Undo. A
contrario, on stockera sur la pile Redo l'inverse de la "commande
inverse" que l'on vient de dépiler de la pile Undo.
Il est clair que la mise en oeuvre de cette approche nécessite une
réflexion préalable sur la manière dont les commandes utilisateurs
sont traitées et décrites dans le programme. Ce qui veut dire que
chaque commande (et commande inverse) doit être décrite par un objet
qui contient toutes les informations nécessaires à l'exécution de
l'action ou à la création d'une commande inverse annulant l'effet de
cette action. Ce n'est pas un travail très simple en VB dont les
capacités objet sont très limitées.
Pour les images, une autre approche consisterait à ne stocker que le
"delta" entre les images (avant et après l'action utilisateur). ce
delta peut se calculer en comparant les 2 images par quelques
opérations binaires simples. L'inconvénient, c'est que le résultat
peut être de taille très petite ou de la même taille que l'image
complète selon l'action qui aura été exécutée. en cela, cette
approche est intermédiaire entre la méthode décrite ci-dessus
(commandes inverses) et l'approche "stockage de chaque version du
document".
Salut,
Pour ce qui est du calcul de la modification entre 2 actions (ce que tu
appelles delta), cela me parait être une très bonne solution bien qu'assez
groumande en CPU en VB je pense.
Et le stockage ne serait pas si évident, il faudrait détecter toutes les
regions modifiées et les mettre dans un tableau de structures définie
comme suit (enfin c'est ce que je ferai, il y a peut être une meilleure
approche) :
Public Type Region
tCoord As Point 'structure contenant X, Y, la position del a région
tRegion As Region 'qui pourrait être un StdPicture ou tt autre objet
pour stocker une image
End Type
Il suffirait ensuite de recoller les morceau sur l'image pour revenir en
arrière.
--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Patrick Philippot wrote:
Armando R. wrote:
je voudrais pouvoir annuler plusieurs opérations l'une après l'autre
Bonjour,
La mise en place d'un mécanisme d'undo/redo nécessite de répondre à 2
questions: comment et quoi?
Comment?
-------------
En général, un tel mécanisme va être mis en oeuvre par le biais d'une
double pile. Au fur et à mesure de leur exécution, les actions de
l'utilisateur sont empilées sur la pile Undo. Si une commande Undo est
déclenchée, la dernière action exécutée est dépilée, son effet est
annulé (voir plus bas) et l'action est réempilée sur la pile Redo afin
de satisfaire une éventuelle commande Redo.
Les piles en questions peuvent être soit limitées en taille (nombre
limité de undo/redo), soit être ajustées dynamiquement. En VB, il me
paraît assez simple d'implémenter une classe Pile à partir d'un objet
Collection.
Une alternative à la méthode des piles est la méthode de la sauvegarde
incrémentale utilisée par exemple par Word en connexion avec les
storages (voir interface COM IStorage pour les explication sur les
storages - fichiers composites ou compound documents). Tous les
documents Office sont en fait des storages (système de fichier à
l'intérieur d'un fichier). Word utilise pour son système d'Undo/Redo
la possibilité que donne le storage de travailler en mode incrémental
(on ne stocke que ce qui change dans des répertoires séparés)
associée à la capacité des storages de travailler en mode
transactionnel (commit / rollback). Cette approche est très
intéressante mais beaucoup plus complexe et nécessite une bonne
connaissance du COM et de la manipulation des storages.
Quoi?
-------
La question qui vient immédiatement derrière est "que va-t-on mettre
sur ces piles?". Il est évident que stocker l'état complet du
document pour chaque action, surtout dans le cas des images, amène
rapidement soit à une saturation de la mémoire, soit à une forte
limitation du nombre d'actions undo autorisées. Cela peut cependant
faire l'affaire dans certains cas.
L'approche la plus efficace est cependant de stocker un ensemble de
données décrivant la commande qui vient d'être réalisée. A chaque
commande mise à la disposition de l'utilisateur doit correspondre un
objet "commande inverse" qui décrit l'action à entreprendre pour
annuler éventuellement l'effet de la commande qui va être exécutée.
C'est cette description que l'on stocke sur la pile Undo. A
contrario, on stockera sur la pile Redo l'inverse de la "commande
inverse" que l'on vient de dépiler de la pile Undo.
Il est clair que la mise en oeuvre de cette approche nécessite une
réflexion préalable sur la manière dont les commandes utilisateurs
sont traitées et décrites dans le programme. Ce qui veut dire que
chaque commande (et commande inverse) doit être décrite par un objet
qui contient toutes les informations nécessaires à l'exécution de
l'action ou à la création d'une commande inverse annulant l'effet de
cette action. Ce n'est pas un travail très simple en VB dont les
capacités objet sont très limitées.
Pour les images, une autre approche consisterait à ne stocker que le
"delta" entre les images (avant et après l'action utilisateur). ce
delta peut se calculer en comparant les 2 images par quelques
opérations binaires simples. L'inconvénient, c'est que le résultat
peut être de taille très petite ou de la même taille que l'image
complète selon l'action qui aura été exécutée. en cela, cette
approche est intermédiaire entre la méthode décrite ci-dessus
(commandes inverses) et l'approche "stockage de chaque version du
document".
Salut,
Pour ce qui est du calcul de la modification entre 2 actions (ce que tu
appelles delta), cela me parait être une très bonne solution bien qu'assez
groumande en CPU en VB je pense.
Et le stockage ne serait pas si évident, il faudrait détecter toutes les
regions modifiées et les mettre dans un tableau de structures définie
comme suit (enfin c'est ce que je ferai, il y a peut être une meilleure
approche) :
Public Type Region
tCoord As Point 'structure contenant X, Y, la position del a région
tRegion As Region 'qui pourrait être un StdPicture ou tt autre objet
pour stocker une image
End Type
Il suffirait ensuite de recoller les morceau sur l'image pour revenir en
arrière.
--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Patrick Philippot wrote:Armando R. wrote:je voudrais pouvoir annuler plusieurs opérations l'une après l'autre
Bonjour,
La mise en place d'un mécanisme d'undo/redo nécessite de répondre à 2
questions: comment et quoi?
Comment?
-------------
En général, un tel mécanisme va être mis en oeuvre par le biais d'une
double pile. Au fur et à mesure de leur exécution, les actions de
l'utilisateur sont empilées sur la pile Undo. Si une commande Undo est
déclenchée, la dernière action exécutée est dépilée, son effet est
annulé (voir plus bas) et l'action est réempilée sur la pile Redo afin
de satisfaire une éventuelle commande Redo.
Les piles en questions peuvent être soit limitées en taille (nombre
limité de undo/redo), soit être ajustées dynamiquement. En VB, il me
paraît assez simple d'implémenter une classe Pile à partir d'un objet
Collection.
Une alternative à la méthode des piles est la méthode de la sauvegarde
incrémentale utilisée par exemple par Word en connexion avec les
storages (voir interface COM IStorage pour les explication sur les
storages - fichiers composites ou compound documents). Tous les
documents Office sont en fait des storages (système de fichier à
l'intérieur d'un fichier). Word utilise pour son système d'Undo/Redo
la possibilité que donne le storage de travailler en mode incrémental
(on ne stocke que ce qui change dans des répertoires séparés)
associée à la capacité des storages de travailler en mode
transactionnel (commit / rollback). Cette approche est très
intéressante mais beaucoup plus complexe et nécessite une bonne
connaissance du COM et de la manipulation des storages.
Quoi?
-------
La question qui vient immédiatement derrière est "que va-t-on mettre
sur ces piles?". Il est évident que stocker l'état complet du
document pour chaque action, surtout dans le cas des images, amène
rapidement soit à une saturation de la mémoire, soit à une forte
limitation du nombre d'actions undo autorisées. Cela peut cependant
faire l'affaire dans certains cas.
L'approche la plus efficace est cependant de stocker un ensemble de
données décrivant la commande qui vient d'être réalisée. A chaque
commande mise à la disposition de l'utilisateur doit correspondre un
objet "commande inverse" qui décrit l'action à entreprendre pour
annuler éventuellement l'effet de la commande qui va être exécutée.
C'est cette description que l'on stocke sur la pile Undo. A
contrario, on stockera sur la pile Redo l'inverse de la "commande
inverse" que l'on vient de dépiler de la pile Undo.
Il est clair que la mise en oeuvre de cette approche nécessite une
réflexion préalable sur la manière dont les commandes utilisateurs
sont traitées et décrites dans le programme. Ce qui veut dire que
chaque commande (et commande inverse) doit être décrite par un objet
qui contient toutes les informations nécessaires à l'exécution de
l'action ou à la création d'une commande inverse annulant l'effet de
cette action. Ce n'est pas un travail très simple en VB dont les
capacités objet sont très limitées.
Pour les images, une autre approche consisterait à ne stocker que le
"delta" entre les images (avant et après l'action utilisateur). ce
delta peut se calculer en comparant les 2 images par quelques
opérations binaires simples. L'inconvénient, c'est que le résultat
peut être de taille très petite ou de la même taille que l'image
complète selon l'action qui aura été exécutée. en cela, cette
approche est intermédiaire entre la méthode décrite ci-dessus
(commandes inverses) et l'approche "stockage de chaque version du
document".
bon... je crois que c'est pas gagné pour moi !... :((
bon... je crois que c'est pas gagné pour moi !... :((
bon... je crois que c'est pas gagné pour moi !... :((
Quoi?
Quoi?
Quoi?
Maintenant, la solution de repli, c'est de remplacer votre PictureBox
par un contrôle image plus élaboré autorisant l'édition et
l'undo/redo. Mais ce n'est pas gratuit. Voir www.componentsource.com
, section Imaging.
Maintenant, la solution de repli, c'est de remplacer votre PictureBox
par un contrôle image plus élaboré autorisant l'édition et
l'undo/redo. Mais ce n'est pas gratuit. Voir www.componentsource.com
, section Imaging.
Maintenant, la solution de repli, c'est de remplacer votre PictureBox
par un contrôle image plus élaboré autorisant l'édition et
l'undo/redo. Mais ce n'est pas gratuit. Voir www.componentsource.com
, section Imaging.
Il y a un exemple d'interfaçage avec l'API des MMF en VB sur cette page:
http://vb.mvps.org/samples/project.asp?id=mapfile
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Il y a un exemple d'interfaçage avec l'API des MMF en VB sur cette page:
http://vb.mvps.org/samples/project.asp?id=mapfile
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Il y a un exemple d'interfaçage avec l'API des MMF en VB sur cette page:
http://vb.mvps.org/samples/project.asp?id=mapfile
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr