Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.04;
Скачать: CL | DM;

Вниз

Реализация 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.099 c
15-1170650293
Ssilent
2007-02-05 07:38
2007.03.04
Может кто знает?


4-1161311947
Antoxa2005
2006-10-20 06:39
2007.03.04
Подскажите, как отловить подключение по локальной сети и если...


15-1170750323
Vlad Oshin
2007-02-06 11:25
2007.03.04
Вдруг понял: Песенка Гребенщикова она про сисадминов :)


2-1171274033
koha
2007-02-12 12:53
2007.03.04
Как получить информацию об аплете панели управления


1-1168526234
Apachi
2007-01-11 17:37
2007.03.04
Как программно узнать зарегистрирован ли COM объект по имени