18 / 16 / 8
Регистрация: 27.05.2017
Сообщений: 118
1

Как правильно передать метод делегата из одного класса в другой?

04.06.2018, 17:00. Показов 2787. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Я написал класс который рисует спираль Архимеда в pictureBox. За основу для для прорисовки был использован делегат для получения точки спирали в зависимости от угла поворота.
За основу брал исходник из этой темы > Вывод спирали
Сама логика создания спирали правильная. Но спираль не рисуется, так как не получается передать метод делегата в класс спирали, я пробовал сделать это через конструктор класса, но вылетает ошибка. А это сделать крайне необходимо, поскольку один из методов класса спирали использует метод делегата для создания изображения!
Код:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
namespace Lab_1_4_spiral_animation
{
    internal delegate PointF SpiralDelegate(float alpha);
 
    public partial class Form1 : Form
    {
        private SpiralDelegate spiral;
        Spiral instFigure = new Spiral(spiral);// конструктор вызывает ошибку: инициализатор не может обращаться к 
        // нестатическому методу Form1.spiral
        private float scale = 10.0f;
        private byte k = 0;
        
        public Form1()
        {
            InitializeComponent();
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Paint += PictureBox_Paint;
            comboBox1.Items.AddRange(new object[] { "2", "3", "4", "5" });
            button1.Visible = false;
            trackBar1.Enabled = false;
            comboBox1.Enabled = false;
            
        }
 
        private void PictureBox_Paint( object senter, PaintEventArgs e )
        {
            if (k == 1)
            {
                instFigure.Draw(pictureBox1, e);
            }
            if (k == 2)
            {
               //заготовка для рисования другой фигуры...
            }
        }
 
        private void timer1_Tick( object sender, EventArgs e )
        {
            instFigure.Draw(timer1);
            pictureBox1.Invalidate();
        }
 
        private void button1_Click( object sender, EventArgs e )
        {
            spiral = instFigure.ArchimedeanSpiral;
            instFigure.turnover = 5;
            instFigure.Reset();
            Invalidate();
        }
 
        private void radioButton1_CheckedChanged( object sender, EventArgs e )
        {
            if (radioButton1.Checked)
            {
                label2.ForeColor = Color.Black;
                comboBox1.Enabled = true;
                k = 1;
            }
            
        }
 
        private void comboBox1_SelectedIndexChanged( object sender, EventArgs e )
        {
            string s = comboBox1.Items[comboBox1.SelectedIndex].ToString();
            button1.Visible = true;
        }
 
    }
 
    // класс спирали
    class Spiral
    {
        // блок создания экземпляров
        Timer timer1 = new Timer();
        // блок объявления открытых полей
        public int turnover;
        public SpiralDelegate spiral;
        // блок объявления закрытых полей
        private List<PointF> points = new List<PointF>();
        private float angle;
        private float radius = 2.5f;
 
        public Spiral(SpiralDelegate spiral)
        {
            this.spiral = spiral;
        }
        
        public PointF ArchimedeanSpiral(float alpha)
        {
            return new PointF((float)(radius * angle * Math.Cos(angle)), (float)(radius * angle * Math.Sin(angle)));
        }
        
 
        public void Draw(PictureBox elemSpace, PaintEventArgs painting)
        {
            if (points == null || points.Count < turnover)
                return;
            painting.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            painting.Graphics.TranslateTransform(elemSpace.ClientSize.Width / 2f, elemSpace.ClientSize.Height / 2f);
            painting.Graphics.DrawCurve(Pens.Blue, points.ToArray());
        }
 
        public void Draw(Timer drawTime)
        {
            points.Add(spiral(angle));// вот здесь идет работа с методом делегата...
            angle += 0.2f;
            timer1.Interval = 50;
            timer1.Enabled = angle - Math.PI * 2 * turnover <= 0;
            if (!timer1.Enabled)
            {
                angle = 0.0f;
            }
        }
 
        public void Reset()
        {
            points.Clear();
            angle = 0.0f;
            timer1.Enabled = true;
        }
    }
}
Подскажите пожалуйста, каким образом можно передать метод делегата из класса главной формы в класс спирали??
Может вообще есть какой-то альтернативный вариант...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2018, 17:00
Ответы с готовыми решениями:

Как передать входящее значение одного метода класса на возврат в другой метод того же класса?
Я самый новейший новичок. Помогите.Как передать входящее значение (количество еды) метода feed...

С помощью делегата из одного класса вызвать private метод с другого класса
доброго времени суток. такой вопрос. С применением делегатов и пониманием проблем нет когда...

Как передать параметры из одного класса в другой?
Есть класс Phase, в нем метод: public static double phase(double pdate, RefDouble pphaseR,...

Как передать переменные из одного класса в другой?
Привет всем! Не могу разобраться с вопросом: я создал программу в WinForms, суть ее в том, что есть...

2
18 / 16 / 8
Регистрация: 27.05.2017
Сообщений: 118
04.06.2018, 18:49  [ТС] 2
Убрал конструктор класса спирали и сделал поле spiral открытым. Программа запускается, но при нажатии на кнопку ничего не происходит, хотя метод вроде как работает.
C#
1
2
3
4
5
6
7
private void button1_Click( object sender, EventArgs e )
        {
            instFigure.spiral = instFigure.ArchimedeanSpiral;
            instFigure.turnover = 5;
            instFigure.Reset();
            Invalidate();
        }
Что не так с делегатом? Сделал все то же самое что и при реализации без отдельного класса(все в классе главной формы) - все работает, при построении класса, уже не пашет! Может какой-то метод класса не работает?
Миниатюры
Как правильно передать метод делегата из одного класса в другой?  
0
18 / 16 / 8
Регистрация: 27.05.2017
Сообщений: 118
05.06.2018, 00:13  [ТС] 3
Чтобы не создавать новую тему, я хочу решить еще одну проблему, связанную с обработчиком события передвигания ползунка(trackBar). Такая проблема: нужно чтобы trackBar при перетаскивании ползунка вправо(значение на шкале увеличивается) увеличивал спираль, а при перетаскивании ползунка влево(значение на шкале уменьшается) спираль уменьшалась
Вот код который есть:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void trackBar1_Scroll( object sender, EventArgs e )
        {
            if (trackBar1.Focused == true)
            {
                scale = trackBar1.Value;
                for (var i = 0; i <= trackBar1.Maximum; i++)
                {
                    if (scale == i) 
                   { 
                     radius += 0.5f; 
                     button1_Click(this, null); // перерисовываем спираль с новым радиусом
                     break; 
                   }
                }
            }
        }
Я пока что реализовал только увеличение спирали. Не получается никак сделать чтобы она уменьшалась в зависимости от движения ползунка.
Помогите хоть кто-нибудь...не игнорьте новичка!!
0
05.06.2018, 00:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2018, 00:13
Помогаю со студенческими работами здесь

Как передать переменную из одного класса в другой
Есть окружность, а по ней в свою очередь движется точка. Часть кода: import javax.swing.*; ...

Как передать переменную из одного класса в другой?
Доброго времени суток. Говорю сразу, я новичек. Только начинаю свой тернистый путь. У меня...

Как передать переменную из одного класса в другой
Мне необходимо передать текст, введенный пользователем в первой форме, во вторую. Сейчас использую...

Как передать имя файла из одного класса в другой
Как передать имя файла из одного класса в другой тут я передаю сохранения в базу ...


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

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

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