Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.041 c
2-1171016494
НиколайКо
2007-02-09 13:21
2007.03.04
Как получить клик мышкой


15-1170732655
brother
2007-02-06 06:30
2007.03.04
Бесплатный хостинг с поддержкой php


2-1171266984
sergeyst
2007-02-12 10:56
2007.03.04
Масштабирование


15-1170781538
Kolan
2007-02-06 20:05
2007.03.04
Кому там про сравнение строки надо было?


1-1168788788
Kolan
2007-01-14 18:33
2007.03.04
Если Rich едит нарисован на StatusBar е, как сделать его выше?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский