Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Bulky
-184 / 4 / 0
Регистрация: 17.03.2018
Сообщений: 469
1

Переменная изменилась в одном классе, куда "воткнуть" код в другом классе

18.05.2018, 12:39. Просмотров 925. Ответов 17
Метки нет (Все метки)

Привет всем,
Достало это событийное программирование. Я не делаю событийные "калькуляторы" и "конвертеры", которые примелькались в книжках. Все еще не могу "вкупиться", если нет у меня события, а код должен быть исполнен, что мне делать.
Ни одна книжка не объясняет такие моменты.

Переменная изменилась в одном классе (Class1), куда "воткнуть" код в другом классе (Class2), что бы он исполнялся с соответствии с переменной из Class1.

Мне нужно просто изменить цвет компонента (Сlass1) по событию из другого класса (Class2).
Сделал доступ к переменной заявленной в Class2.
Куда бы не "пихал" этот код в Сlass2, все равно не работает, хотя ошибок нет.

Добавлено через 7 минут
Такое ощущение, что если у тебя нет событий, то нужно "напихать" в код сотню таймеров. Что бы "мониторили" изменения переменных.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2018, 12:39
Ответы с готовыми решениями:

В одном классе нужно создать массив, а в классе program его вывести. "Не все ветви кода возвращают значение"
В одном классе нужно создать массив, а в классе program его вывести, помогите, как разобраться ...

Переменная в другом классе
У меня есть два класса: AuthorizationForm и SendMailForm. как мне сделать, чтобы textBox.Text из...

Изменения в одном классе должны отражаться в другом
Всем привет, нужна помощь) Опишу как смогу, надеюсь сможете понять. Сейчас программа работает...

Как использовать объект класса, созданого в определеном классе, в другом классе
У меня такой вопрос,как использовать объект класса,созданого в определеном классе,в другом классе.У...

Как использовать информацию парсированую в 1 классе в другом классе
имеются 2 класса , объясните плз в чём ошибка using System; using System.Collections.Generic;...

17
kingzfate
Unnamed
160 / 158 / 81
Регистрация: 09.06.2011
Сообщений: 829
Завершенные тесты: 1
18.05.2018, 12:41 2
Bulky, покажите ваш код, и вам ответят что не правильно и как исправить
1
fufel
14 / 14 / 6
Регистрация: 28.02.2011
Сообщений: 419
18.05.2018, 13:09 3
Bulky, Разобрался что да как?
1
Bulky
-184 / 4 / 0
Регистрация: 17.03.2018
Сообщений: 469
18.05.2018, 13:30  [ТС] 4
Цитата Сообщение от fufel Посмотреть сообщение
Bulky, Разобрался что да как?
"Стряпаю куски" кода чтобы было "понимаемо", чего я хочу. Айн момент биттэ!

Добавлено через 18 минут
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
namespace Custom_control
{
    class Wheel_feedback : Control
    {
        public Color EllipseColor { get; set; }
        public int Border { get; set; }
 
        public bool Wheel_stopped;
 
        public bool Wheel_started;
 
        public bool Wheel_failed;
 
 
        public Wheel_feedback()
 
        {
            this.initializeComponent();
            //DoubleBuffered = true;
        }
 
        private void initializeComponent()
        {
            this.Size = new Size(90, 90);
            this.EllipseColor = Color.WhiteSmoke;
            this.Border = 1;
 
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
 
            Graphics g = e.Graphics;
 
            Rectangle bounds = new Rectangle(Border, Border, this.Width - 2 * Border, this.Height -2 * Border);
 
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 
            g.FillEllipse(new SolidBrush(this.EllipseColor), bounds);
 
            g.DrawEllipse(new Pen(this.ForeColor), bounds);
 
 
           
 
        }
Собственно графика устраивает. Просто не знаю что делать далее. Как управлять цветом, хотя бы по событию (второй код).
C#
1
2
3
4
5
 private void button1_Click(object sender, EventArgs e)
        {
 
            Wheel_feedback1.EllipseColor = Color.LawnGreen;
        }
0
fufel
14 / 14 / 6
Регистрация: 28.02.2011
Сообщений: 419
18.05.2018, 15:07 5
Лучший ответ Сообщение было отмечено Bulky как решение

Решение

Так смотри. Чтобы поменял цвет надо в класс (Первый код) добавить код
C#
1
2
3
4
5
public void Change_Color(Color _Color)
{
    EllipseColor = _Color;
    Invalidate();
}
а из главной формы вызвать: wheel_feedback1.Change_Color(Color.Red);

Что происходит:
Просто цвет ты не можешь поменять, в твоём подходе надо с начало переменной EllipseColor присвоить другой цвет и вызвать "Invalidate();". Этот метод вызывает "OnPaint" который перерисовывает заново твой круг с другим цветом. Цвет сам по себе не сменится если ты наглядно не вызовиш перерисовку.

Второе, опиши в крации что ты хочешь добиться, у меня есть смуглая мысля что ты выбрал совсем не тот подход который надо выбирать.

Добавлено через 6 минут
Немного по фразе в начале топика "Все еще не могу "вкупиться", если нет у меня события, а код должен быть исполнен, что мне делать.".
Тут ответ прост, если у тебя нету события то ты можешь или сам вызвать данное событие (В примере выше я событие OnPaint вызвал на прямую через метод Invalidate()) или на прямую вызвать тот код который должен исполнится (без вызова события).

Добавлено через 8 минут
Как я и говорил, вот пример второго варианта. Вызывать событие не надо, можно на прямую вызвать метод для перерисовки цвета. В том же первом коде добавь метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void Change_Color2(Color _Color)
{
    EllipseColor = _Color;
 
    Graphics g = this.CreateGraphics();
 
    Rectangle bounds = new Rectangle(Border, Border, this.Width - 2 * Border, this.Height - 2 * Border);
 
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 
    g.FillEllipse(new SolidBrush(this.EllipseColor), bounds);
 
    g.DrawEllipse(new Pen(this.ForeColor), bounds);
}
1
kesean
276 / 275 / 108
Регистрация: 04.09.2010
Сообщений: 638
Завершенные тесты: 1
18.05.2018, 15:11 6
Цитата Сообщение от Bulky Посмотреть сообщение
если нет у меня события, а код должен быть исполнен, что мне делать.
Можно его создать. И связать классы между собой.
Цитата Сообщение от Bulky Посмотреть сообщение
Переменная изменилась в одном классе (Class1), куда "воткнуть" код в другом классе (Class2), что бы он исполнялся с соответствии с переменной из Class1.
Простой пример (при изменении значения SomeVariable класса А, в классе В генерируется событие):
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
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            B b = new B(a);
 
            for (int i = 1; i <= 10; i++)
                a.SomeVariable = i;
 
            Console.ReadLine();
        }
 
        
    }
 
    class A
    {
        public delegate void SomeEventHandler(int value);
        public event SomeEventHandler SomeEvent;
        public int SomeVariable { set { SomeEvent?.Invoke(value); } }
    }
 
    class B
    {
        public B(A a)
        {
            a.SomeEvent += A_SomeEvent;
        }
        private void A_SomeEvent(int value)
        {
            Console.WriteLine($"SomeVariable changed! New value {value}");
        }
    }
1
Bulky
-184 / 4 / 0
Регистрация: 17.03.2018
Сообщений: 469
18.05.2018, 15:56  [ТС] 7
Сейчас братцы "переварю" код...

Добавлено через 3 минуты
Цитата Сообщение от fufel Посмотреть сообщение
Второе, опиши в крации что ты хочешь добиться, у меня есть смуглая мысля что ты выбрал совсем не тот подход который надо выбирать.
Как видно из выше кода приведенного, я делаю простенький компонент. Хотелось бы, что бы он работал по принципу стандартных.


Срабатывает триггер события. Цвет меняется. Также, например работает стандартная label

C#
1
2
3
4
5
6
7
 private void button1_Click(object sender, EventArgs e)
        {
 
            Wheel_feedback1.EllipseColor = Color.LawnGreen;
            
            label1.ForeColor = Color.OrangeRed;
        }
0
SeIZVeIZ
738 / 668 / 283
Регистрация: 08.02.2014
Сообщений: 2,046
Завершенные тесты: 3
18.05.2018, 16:09 8
без событий в классе нужно сделать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class Wheel_feedback : Control
    {
private Color  _elipseColor;
        public Color EllipseColor 
{ 
         get{ return _elipseColor;} 
         set
         {
             _elipseColor = value; 
             this.Invalidate();
          } 
}
}
с событием Вам показали как
1
Bulky
-184 / 4 / 0
Регистрация: 17.03.2018
Сообщений: 469
18.05.2018, 16:48  [ТС] 9
Начал с тестирования кода, что в #5

C#
1
2
3
4
5
public void Change_Color(Color _Color)
{
    EllipseColor = _Color;
    Invalidate();
}

и вызвал из события, которое в MainForm.
C#
1
wheel_feedback1.Change_Color(Color.Red);
и в MainForm получил ошибку.
an object reference is required for the nonstatic method, or property 'wheel_feedback1.Change_Color(Color.Red)'
Собственно такая бяка не первый раз случается... Как-то выходил из положения. Но сути до сих пор не понимаю.
0
fufel
14 / 14 / 6
Регистрация: 28.02.2011
Сообщений: 419
18.05.2018, 17:02 10
Цитата Сообщение от Bulky Посмотреть сообщение
и в MainForm получил ошибку.
an object reference is required for the nonstatic method, or property 'wheel_feedback1.Change_Color(Color.Red)'
Собственно такая бяка не первый раз случается... Как-то выходил из положения. Но сути до сих пор не понимаю.
Тут могу сказать что где то в коде ты используеш слово "static". Думаю на данном этапе ты можешь обойтись и без слово "static".

Цитата Сообщение от Bulky Посмотреть сообщение
Срабатывает триггер события. Цвет меняется. Также, например работает стандартная label
C#
Выделить код
C#
1
2
3
4
5
private void button1_Click(object sender, EventArgs e)
 {
Wheel_feedback1.EllipseColor = Color.LawnGreen;
label1.ForeColor = Color.OrangeRed;
 }
теперь ответ по этому моменту.
Программно реализовать "label1.ForeColor = Color.OrangeRed;" можно двумя методами.
1) Это просто значению label1.ForeColor присвоить новое значение и всё.
2) Это на значение label1.ForeColor вешается триггер, и при попытке изменить или прочитать значение срабатывает триггер. И через этот триггер идет смена цвета (Перерисовывание круга). В посте #8 тебе показали пример триггера.
0
Bulky
-184 / 4 / 0
Регистрация: 17.03.2018
Сообщений: 469
18.05.2018, 17:10  [ТС] 11
Цитата Сообщение от fufel Посмотреть сообщение
Тут могу сказать что где то в коде ты используеш слово "static". Думаю на данном этапе ты можешь обойтись и без слово "static".
Я от static шарахаюсь как черт от ладана, так что его у меня точно его нет в коде. Но "головняк" еще тот, -часто досаждает.

Цитата Сообщение от fufel Посмотреть сообщение
теперь ответ по этому моменту.
Программно реализовать "label1.ForeColor = Color.OrangeRed;" можно двумя методами.
1) Это просто значению label1.ForeColor присвоить новое значение и всё.
2) Это на значение label1.ForeColor вешается триггер, и при попытке изменить или прочитать значение срабатывает триггер. И через этот триггер идет смена цвета (Перерисовывание круга). В посте #8 тебе показали пример триггера.
Смену цвета в Label я привел как пример.
Мне нужно чтобы мой "компонент" менял цвет. Хочу протестировать оба способа. Но спотыкаюсь обо всякие "non-static"...
0
fufel
14 / 14 / 6
Регистрация: 28.02.2011
Сообщений: 419
18.05.2018, 17:14 12
Скидывай проетк (именно с ошибкой), погляжу что да как с ним и попробую помочь.
0
Bulky
-184 / 4 / 0
Регистрация: 17.03.2018
Сообщений: 469
18.05.2018, 17:25  [ТС] 13
Цитата Сообщение от fufel Посмотреть сообщение
Скидывай проетк (именно с ошибкой), погляжу что да как с ним и попробую помочь.
каким образом тут скидывают?

Добавлено через 5 минут
Почта?
0
fufel
14 / 14 / 6
Регистрация: 28.02.2011
Сообщений: 419
18.05.2018, 17:52 14
Зазепуй одним файлом и приложи к сообщению
0
Миниатюры
Переменная изменилась в одном классе, куда "воткнуть" код в другом классе  
Bulky
-184 / 4 / 0
Регистрация: 17.03.2018
Сообщений: 469
18.05.2018, 18:28  [ТС] 15
Цитата Сообщение от fufel Посмотреть сообщение
Зазепуй одним файлом и приложи к сообщению
Вытащил куски в пустой проект, чтобы остальное не по теме не мешало.
Вставил то, что ты мне предлагал в #5. Компильнул, триггернул событие. Блин чуть со стула не упал. Цвет компонента поменялся.
Что за глюки!?
В любом случае скину сейчас, глянешь опытным глазом на "смуглую концепцию"
0
Bulky
-184 / 4 / 0
Регистрация: 17.03.2018
Сообщений: 469
18.05.2018, 18:42  [ТС] 16
Выложил
0
Вложения
Тип файла: 7z WindowsFormsApplication3.7z (31.5 Кб, 2 просмотров)
fufel
14 / 14 / 6
Регистрация: 28.02.2011
Сообщений: 419
18.05.2018, 18:58 17
Bulky, Поглядел. Делать ты делаешь правильно но вопрос в том что ты именно хочешь добиться? твой способ рисование круга действенный, но не зная задачи я не могу сказать тебе как можно сделать проще.
Может тебе и не надо делать свой отдельный класс, может тебе просто надо поместить на форму контролер (Panel) и рисовать в нём?
Без задачи ответить сложно.
То что ты просил (как поменять цвет я ответил и это работает).
На остальные проблемы присылай код где ошибка и будем смотреть.

П.С. всё конец рабочего дня, пора домой топать, до понедельника.
1
Bulky
-184 / 4 / 0
Регистрация: 17.03.2018
Сообщений: 469
18.05.2018, 18:59  [ТС] 18
В основном проекте удалил event-handler связанный с этим компонентом, удалил сам компонент. Воткнул все назад. И о чудо.
Тоже заработало. Заметил, что с handlers бывают глюки. Нужно их удалить и по новой.
0
18.05.2018, 18:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2018, 18:59

Необходимо реализовать событие в одном классе, а обработчик в другом
Помогите реализовать событие, чтобы в одном классе оно создавалось, а в другом обрабатывалось:...

Создать класс "Человек" и переназначить его методы в классе "Студент"
Ребят нужно доделать вывод на консоль и всё (вот условие), буду крайне благодарен за помощь ...

Как через Stream "разобрать" файл в одном месте и "собрать" в другом?
Пожалуйста, покажите как стримить файлы, например, у меня есть большой файл. Как через Stream...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru