Форум: "Компоненты";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];
ВнизРеализация UNDO (редактор формы) Найти похожие ветки
← →
StriderMan © (2006-06-01 15:53) [0]Делаю визуальный редактор форм, встала необходимость реализовать функцию отмены действий пользователя (в т.ч. на несколько шагов назад).
Пока рабочий вариант - сохранять всю форму при каждом изменении. Есть массив предыдуших состояний формы.
Вобщем подход кое-как работает, но все это громоздко и медленно.
Есть ли какие-то другие подходы?
← →
Юрий Зотов © (2006-06-01 20:50) [1]Редактируем на саму рабочую форму, а ее копию. При нажатии OK переносим изменения в рабочую форму (или заменяем всю рабочую форму целиком), при нажатии Cancel ничего не делаем.
← →
StriderMan © (2006-06-02 12:14) [2]не, ну это не интересно. Это просто сохранить или не сохранять, так оно и работало изначально.
меня интересует отмена каждого дейсвтия пользователя. Например сдвинули контрол, нажали UnDo(Ctrl+Z) и он обратно вернулся.
← →
jack128 © (2006-06-02 13:55) [3]собственно варианта два:
1) логировать действия юзера, и при нажатии undo - выподнять обратное действие.
2) после каждого действия юзера сохранять форму в отдельный файл(или область памяти, не суть). получишь массив файлов и при нажатии undo - загружаешь состояние формы из сответствующего файла. способ более рескурсоемкий, но проще реализуемый..
← →
StriderMan © (2006-06-02 14:36) [4]
> 1) логировать действия юзера, и при нажатии undo - выподнять
> обратное действие.
довльно сложно описать что будет обратным действием, все скорее всего сведется к тому же хранению предыдущих значений.
> 2) после каждого действия юзера сохранять форму в отдельный
> файл(или область памяти, не суть). получишь массив файлов
> и при нажатии undo - загружаешь состояние формы из сответствующего
> файла. способ более рескурсоемкий, но проще реализуемый.
> .
Вобщем-то так и сделано сейчас, кое-как работает, но действительно очень ресурсоемко и по процессору и по памяти (особенно если картинки на форме)
← →
Black Krok © (2006-06-02 15:27) [5]А нельзя сравнивать предыдущий вариант и получившийся? И сохранять только изменения.
Типа узел такой-то исчез, такой-то появился, такой-то изменил значение с такого-то на такое (если хранение в HTML, XML...)
← →
Black Krok © (2006-06-02 15:28) [6]Если DFM - можно и построчно сравнивать
← →
StriderMan © (2006-06-02 15:55) [7]
> А нельзя сравнивать предыдущий вариант и получившийся?
Че-то в голову не приходит как сравнить компонент и несколько десятков его дочерних компонентов, с другим таким же, чтоб это было быстро и просто.
А можно ли пробежаться по всем published свойствам компонента? есть такие инструменты в Делфи?
А может есть какие-то алгоритмы сравнения больших бинарных кусков данных с целью создания некоего преобразования, которое приведет от одного к другому. это уже на высшую математику тянет вроде как.
← →
Black Krok © (2006-06-02 16:20) [8]>Че-то в голову не приходит как сравнить компонент и несколько десятков его дочерних компонентов, с другим таким же, чтоб это было быстро и просто.
Вы ведь в каком-то виде сохраняете данные. В DFM? В бинарном? Сохраняйте в строковом. Только не в файл, а в поток(строку) и сравнивайте строки. Можно и бинарные последовательности сравнивать, но "чревато боком" и отлаживать неудобно.... Но даже если Вы сравните побайтно до первого расхождения и сохраните все после него - это все равно может существенно сократить ресурсы(~в два раза :))
>А можно ли пробежаться по всем published свойствам компонента? есть такие инструменты в Делфи?
В модуле typinfo.pas есть механизмы и для этого. Но для этого ни разу не использовал, только для записи значения свойства по его имени.
Только Вам ведь не только свойства надо сравнивать(компоненты могут и удаляться/создаваться)
← →
jack128 © (2006-06-02 16:29) [9]StriderMan © (02.06.06 14:36) [4]
все скорее всего сведется к тому же хранению предыдущих значений.
Но только ОДНОГО объекта, а не всей формы. То есть если изменили Image, то сохраняй только имадж. если Edit, то только Edit.
← →
StriderMan © (2006-06-02 17:04) [10]
> Вы ведь в каком-то виде сохраняете данные. В DFM? В бинарном?
Я сохраняю в бинарном виде в блоб-поле таблицы.
> и сравнивайте строки.
в принципе можно, но опять же ситуация, если удалили/добавили компонент, то в одном фрагменте исчезнет часть строк, а в другом останется. И если сравнивать дальше линейно, то с этого момента все будет отличаться до самого конца.
Кстати всякие text-comparerЫ легко разруливают такую ситуацию... надо подумать как там алгоритм реализован.
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c