Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2008, 20:15   #1
NeiL
Пользователь
 
Регистрация: 28.11.2007
Сообщений: 49
По умолчанию Undo-Redo

Народ, просьба поделитесь ссылками или подскажите как сделать межанизм undo - redo при работе с Bitmap'ом.
NeiL вне форума Ответить с цитированием
Старый 13.03.2008, 08:50   #2
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Всё же мне кажется, придётся сохранять Ваш BMP во временный файл, лимит, - ну хотя бы 5, лучше 10.

Для отмены действий просто загружаешь предидуший временный файл, но т.к. это тоже является изменением, перед загрузкой нужно сохрагить в последующий файл, - для повтора действий. Если достигнуто (к примеру) TMPBMP10.bmp, то TMPBMP1.bmp удалить, а на его место записать как бы TMPBMP11.bmp.
В цикле "счётчике" организовать предел от 1 - 10.
Примерно так.
Код:
...
Var BMP: TBitmap; //это всё глобальные переменные
     ind:integer;
...
// для сохранения при любых изменениях (выполняется в первую очередь)
procedure SaveTMP(Index:integer);
begin
 index:=ind+1;
 if index = 11 then 
  begin
   ind:=1;
   DeleteFile('TMPBMP'+inttostr(ind)+'.bmp'); // можно не удалять, всёравно затрется.
  end;
 BMP.SaveToFile('TMPBMP'+inttostr(ind)+'.bmp');
end;
...
// для загрузки
procedure LoadTMP(Index:integer);
begin
 index:=ind-1;
 if index = 0 then ind:=10;
 BMP.LoadToFile('TMPBMP'+inttostr(ind)+'.bmp');
end;
...
(Код написан от руки, так что не ругайлесь, если гдето ошибся)
Всё гениальное - просто!

Последний раз редактировалось Air; 13.03.2008 в 08:52.
Air вне форума Ответить с цитированием
Старый 14.03.2008, 14:11   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от NeiL Посмотреть сообщение
Народ, просьба поделитесь ссылками или подскажите как сделать межанизм undo - redo при работе с Bitmap'ом.
Я думаю тут нужно делать по принципу стека (от англ. стопка), то есть первым вошел, последним вышел. Наглядный пример - магазин от автомата с патронами, чтобы достать первый патрон, нужно вытащить все остальные.
Вместо магазина - динамический массив битмапов (отличие массива - если надо, можно вытащить первый не вытаскивая все). Глубину как душе угодно, можно ограничить тремя а можно и всю историю изменений хранить, лишь бы памяти хватило.
Памяти на битмап 24bit(true color) нужно: кол-во пикселей * 3 байта. Например битмап 800х600 займет (800*600)*3/1024/1024 = 1.37 МБ. Соответственно массив из десяти таких битмапов займет 13.7 МБ, и так далее.

Сохранение нужно делать при отпускании кнопки мыши (если мышью какой нибудь инструмент применяешь) ну или по нажатию на кнопке/меню это у кого как, перед изменением.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 14.03.2008 в 14:17.
mutabor вне форума Ответить с цитированием
Старый 14.03.2008, 14:36   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

По идее-то, сохранять желательно только сами изменения, а при ундо применять их вторично по ХОR.
Тогда значительно меньше памяти понадобится.
mihali4 вне форума Ответить с цитированием
Старый 14.03.2008, 18:24   #5
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

А чтобы отловить изменения, надо каждый цвет сравнивать?
Типа две матрицы, одна boolean, другая color, если цвет[i,j] одной матрицы не равнен цвету[i,j] другой матрицы, то boolean[i,j]= true и в color[i,j] = измененный цвет (пиксель)
andrey4623 вне форума Ответить с цитированием
Старый 14.03.2008, 18:33   #6
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
По идее-то, сохранять желательно только сами изменения, а при ундо применять их вторично по ХОR.
Тогда значительно меньше памяти понадобится.
Оно то понятно, что так лучше, вот только как это сделать? Например я нарисовал от руки линию, как ее отменить не сохраняя битмап?

Цитата:
А чтобы отловить изменения, надо каждый цвет сравнивать?
Типа две матрицы, одна boolean, другая color, если цвет[i,j] одной матрицы не равнен цвету[i,j] другой матрицы, то boolean[i,j]= true и в color[i,j] = измененный цвет (пиксель)
Не думаю, по затратам памяти это равнозначно простому сохранению битмапов, только намного дольше из-за проверки. Матрица ведь все равно есть для измененных цветов, если в нее записывать лишь некоторые пиксели это ничего не меняет, память она все равно займет.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 14.03.2008 в 18:43.
mutabor вне форума Ответить с цитированием
Старый 14.03.2008, 18:50   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
Оно то понятно, что так лучше, вот только как это сделать? Например я нарисовал от руки линию, как ее отменить не сохраняя битмап?
Только что провел натурный эксперимент - взял Image1, вставил в него картинку. Сверху положил еще один Image2 - пустой и прозрачный, а на нем нарисовал линию.
Ундо - сделал Visible:=False для Image2, Редо - вернул видимость.
Нечто вроде слоев... И сравнивать ничего не надо.
mihali4 вне форума Ответить с цитированием
Старый 14.03.2008, 18:58   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

А Image2 канвы не имеет и память не занимает?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 14.03.2008, 19:04   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
А Image2 канвы не имеет и память не занимает?
Дык на прозрачной (Transparent:=True) канве и рисовал.
Занимает, только он же почти пустой и занимает немного.

Последний раз редактировалось mihali4; 14.03.2008 в 19:07.
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Undo, Redo Xardas Общие вопросы Delphi 1 24.01.2008 19:35