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