14 / 14 / 9
Регистрация: 30.10.2014
Сообщений: 96
1

Работа со стеком

14.11.2014, 10:04. Показов 1454. Ответов 8
Метки нет (Все метки)

Хочу сделать в приложении(редакторе изображений) кнопку отменить последнее изменение. Я порешил после редактирования изображения забрасывать Битмапы в стек. а по надобности попом его вытаскивать(и заодно удалять) из стека. кнопка вперед не нужна. имеется локальная переменная Bmp, которая хранит битмап текущего изображения. вот, забрасываю я значит в Push Bmp, а в итоге видимо в стеке хранятся все одинаковые значения, Bmp последнего изображения.
как мне забрасывать в стек значение а не ссылку?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
namespace MKOI
{
    public partial class Form1 : Form
    { 
        Bitmap Bmp;
        Stack<Bitmap> bmstack = new Stack<Bitmap>();
        //...
        //далее загружаем изображение и присваиваем его битмап переменной Bmp
        //...
        //кнопка ундо
        private void отменитьПоследнееИзменениеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            bmstack.Pop();
            pictureBox1.Image = bmstack.Pop();
        }
        //вызывает один из методов преобразования
        private void негативToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (Bmp == null) mesBoxDownloadError();
            else
            {
                negative();
                pictureBox1.Image = (Bitmap)Bmp;
                bmstack.Push(Bmp);
            }
        }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2014, 10:04
Ответы с готовыми решениями:

Работа со стеком + графика
Имеется проблема. Программа повторяющая пасьянс солитёр Нужно реализовать отмену последнего хода...

работа со стеком
Вечер добрый всем. Нужна ваша помощь с заданием: Вывод на экран меню с возможностью выбора...

работа со стеком
требуется удалить из стэка допустим 5-ый элемент из 10. Как это сделать? И как задать стэк...

Работа со стеком
Добрый день! Помогите, пожалуйста, с заданием: &quot;Просмотреть элемент в вершине стека без удаления....

8
8 / 19 / 9
Регистрация: 16.09.2014
Сообщений: 102
14.11.2014, 10:32 2
Предлагаю сделать упаковку ссылочного типа в тип значений перед добавления в стек и распаковку после извлечения. Только это не быстрая операция, она замедлит работу программы.
0
647 / 582 / 170
Регистрация: 17.07.2012
Сообщений: 1,649
Записей в блоге: 1
14.11.2014, 10:45 3
wadzimka_ddr, есть такой прекрасный паттерн "Команда", по моему вам он подойдёт.
cer, это как вы собрались паковать ссылочный тип в тип значений?
0
cer
14.11.2014, 10:50
  #4

Не по теме:

Cupko,

C#
1
2
 Bitmap Bmp=null;
    object obj = Bmp;// присваивание сопровождается упаковкой

0
647 / 582 / 170
Регистрация: 17.07.2012
Сообщений: 1,649
Записей в блоге: 1
14.11.2014, 10:58 5
wadzimka_ddr, Хранить в памяти изображения полностью на каждом шаге - мне кажется не совсем правильной идеей. Следует хранить команду обратного преобразования, и использовать уже её.

cer,

Не по теме:

что-то вы совсем ерунду написали...
Упаковка/распаковка производится при перемещении значимых типов из стека в кучу и обратно. Но ссылочный тип вы в стек переместить не сможете.

0
14 / 14 / 9
Регистрация: 30.10.2014
Сообщений: 96
14.11.2014, 11:26  [ТС] 6
Сupko, при открытии нового изображения я очищаю стек. думаю в моем случае хранение каждого изображения в стеке допустимо
0
647 / 582 / 170
Регистрация: 17.07.2012
Сообщений: 1,649
Записей в блоге: 1
14.11.2014, 11:31 7
wadzimka_ddr, Насколько я понял, у вас есть изображение, и вы его как-то преобразовываете, но сам экземпляр Bitmap не меняется, и поэтому у вас в стек попадает одна и та же ссылка. Так ведь?

По вашему алгоритму, вам нужно перед каждым преобразованием создавать новый объект Bitmap, и тогда уже вы сможете оперировать самими Bitmap'ами.

Но опять же, это не совсем правильный вариант. Правильно создавать команду обратного преобразования, и оперировать уже этими объектами...
0
cer
14.11.2014, 11:32
  #8

Не по теме:

Cupko, это ваше мнение или есть доказательство? Ссылочный тип в тип значений упаковать можно.

0
647 / 582 / 170
Регистрация: 17.07.2012
Сообщений: 1,649
Записей в блоге: 1
14.11.2014, 11:43 9
C#
1
var copy = Bmp.Clone(new Rectangle(0, 0, Bmp.Width, Bmp.Height), Bmp.PixelFormat)
Соответственно, Bmp вы кладете в свой стек, а над копией уже делаете преобразование.

cer,

Не по теме:

Объект в куче можно только распаковать в тип значений, если он собственно и является типом значений. Bitmap в ValueType ну никак вы не упакуете, это бессмысленно.
Я бы с удовольствием вам всё расписал, если бы было достаточно сил и времени. Эта тема изъезженна вдоль и поперек. Описание есть в спецификации языка, любой книге по шарпу, и в сотнях тем на форуме.

1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2014, 11:43
Помогаю со студенческими работами здесь

Работа со СТЕКОМ!!!!!!:)
Создать класс для работы со стеком. Элемент стека – символ. --- Сформировать два стека,содержащие...

Работа со стеком
Доброго времени суток. Мне нужно создать стек и вывести его на экран. Или что-то с вводом или...

работа со стеком
uses crt; type str=string; uk_stack=^stack; stack=record inf:str; nevt:uk_stack; end; var...

Работа со стеком
Помогите исправить ошибки! Пусть символ # определен в текстовом редакторе как стирающий символ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru