Отмена предыдущего действия (Undo, redo)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Отмена предыдущего действия (Undo, redo)

Сообщение Matew » 11.11.2004 (Чт) 9:15

У меня есть массив(arr1) в котором хранится все, что есть на экране. Я сделал так: при выделении какого-нить объекта arr1 копируется в arr2 и если потом с этим объектом ченить делают (перетаскивают или вертят), то arr2 копирую в arr3. И при нажатии на кнопку «отмена» (Undo, как в ворде со стрелочкой назад) все из массива arr3 копируется в arr1 и все заново прорисовывается. Все это работает, но: это как-то коряво :) и мне надо запоминать как минимум 3 предыдущих действия, а заводить еще пару массивов типа arr3 мне не хочется (они большие очень). Есть алгоритм попроще? Подскажите, плизз.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 11.11.2004 (Чт) 10:15

Навскидку: Создай один массив элементами которого будут твои типы записей. Полями записи будут состояния твоих контролов.
При изменении состояния контрола, добавляй в массив новую запись с новым состояние контролов через Redim Preserve arrControls (1 to Ubound(arrControls)+1).
При отмене - восстанавливай состояние контролов из предыдущего элемента массива.
А при Redo - из следующего.
Минусы - отъедается память за счет постоянного увеличения размера массива. Возможные варианты решения - контролировать размер массива при изменении. Или при отмене - удалять последний элемент массива.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.11.2004 (Чт) 10:36

Ruslan Demidow, я так понял, что ты предлагаешь мне создать массив массиов arr3?:-)
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 11.11.2004 (Чт) 10:42

Сделай двумерный массив. Одно измерение - параметры, другое измерение - варианты состояний.

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.11.2004 (Чт) 10:50

К сожалению этот массив итак уже 3-х мерный(( и очень большой, я хотел это как то обойти.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 11.11.2004 (Чт) 13:10

Matew писал(а):К сожалению этот массив итак уже 3-х мерный(( и очень большой, я хотел это как то обойти.
В твоём первом варианте, с каждым новым изменением, на каждую отмену придётся заводить новый массив.
Тебе же нужн завести только один массив и в одном элементе этого массива хранить одно изменённое состоение всех контролов на форме.
Вот что я предлагаю.
А уж что будет у тебя храниться в одном элементе массива - решать тебе (будут ли это записи пользовательского типа или коллекции или классы).
Это Ж-ж-ж-ж неспроста (с) Винни-Пух


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 3

    TopList