Главная страница
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.04 c
3-1165411941
ergoist
2006-12-06 16:32
2007.03.04
Обновление записи


1-1168850523
DelphiLexx
2007-01-15 11:42
2007.03.04
Быстро определить скорость CPU


1-1168428811
Extar
2007-01-10 14:33
2007.03.04
Помогите некотрректно работает DelimitedText в StringGrid


15-1170969146
illuha
2007-02-09 00:12
2007.03.04
ждущий режим


1-1168441791
novice007
2007-01-10 18:09
2007.03.04
использование Lame_enc.dll