Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Реализация 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 ничего не делаем.


Наверх

Титульная страница Поиск, карта сайта Написать письмо