Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 93
1
.NET 4.x

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

22.07.2016, 13:49. Показов 2306. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть статический объект Vars.MainConfig и в нем есть 2 bool Vars.MainConfig.Hello и Vars.MainConfig.Goodbye.
Так же у меня есть keyboard hook, которым вызывается функцию Work() при любом нажатие на клавиатуру.
Я хочу сделать динамическую систему биндов, что бы когда я нажимал допустим F1, менялось значения для Vars.MainConfig.Hello. А когда я нажимал на F2 менялось значение для Vars.MainConfig.Goodbye. Хочу получить класс который сможет работать с любыми bool и переключать их. Кол-во bool заранее не известно.

Вот мой класс
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
public class Binds
{
    public static Dictionary<int, BindAction> List;
    public static Dictionary<string, BindAction> Commands;
 
    public Binds()
    {
        Commands = new Dictionary<string, BindAction>
        {
            { @"On\Off Hello", new BindAction(Vars.MainConfig.Hello) },
            { @"On\Off Goodbye", new BindAction(Vars.MainConfig.Goodbye) }
        };
 
        List = new Dictionary<int, BindAction>
        {
            { (int)Keys.F1, Commands[@"On\Off Hello"] },
            { (int)Keys.F2, Commands[@"On\Off Goodbye"] }
        };
    }
 
    public static void Work()
    {
        try
        {
            List[InterceptKeys.vkCode].Action = !List[InterceptKeys.vkCode].Action;
 
            Console.WriteLine("Hello: " + Vars.MainConfig.Hello);
            Console.WriteLine("Goodbye: " + Vars.MainConfig.Goodbye);
        }
        catch (KeyNotFoundException)
        {
            Console.WriteLine("Not binded");
        }
    }
 
    public class BindAction
    {
        public BindAction(bool action)
        {
            Action = action;
        }
        public bool Action;
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2016, 13:49
Ответы с готовыми решениями:

Написание оператора if, который присваивает значение х переменной y, только если х находится между 1 и 20
Всем привет. Изучаю С по книге &quot;С за 21 день&quot; Брэдли Джонса и Питера Эйткена. Есть задача:...

Как вызвать метод класса, если его имя находится в переменной?
Имеется такая конструкция class Content { function adminka() { $func =...

Как передать значение локальной переменной в другой класс? (схема внутри)
Помогите пожалуйста, по-человечески прошу (КОДОМ) я понимаю всё, но я не знаю как это реализовать...

как передать значение переменной которую я вводил в одном классе в другой класс (ввожу я в консоле)
class Registracia { public void Sakas() { Console.Write(&quot;Вес...

22
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.07.2016, 13:56 2
SLIpros, Если Vars статический он и так доступен из любого места в программе по имени класса, в котором объявлен.
0
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 93
22.07.2016, 14:06  [ТС] 3
Это все и так понятно, я привел пример, что таких статичных объектом может быть N. И мне нужно работать с каждым. Я хочу сделать конструктор, в котором я бы мог совмещать изменения значений bool с нажатием на клавишу. Хочу универсальный класс, который заранее не знает о всех bool, но смог бы их переключать, если я бы в него их(bool) передал.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.07.2016, 14:08 4
Цитата Сообщение от SLIpros Посмотреть сообщение
Это все и так понятно, я привел пример, что таких статичных объектом может быть N. И мне нужно работать с каждым.
Не делайте их статичными. Создавайте экземпляры классов и передавайте в нужные методы/классы. Экземпляры классов передаются по ссылке, соответственно и изменении значения переменной в одном месте изменение отразиться во всех остальных местах.
0
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 93
22.07.2016, 14:31  [ТС] 5
А можно пример? Я че то видно не то делаю.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public Binds(Vars vars)
{
    Commands = new Dictionary<string, BindAction>
    {
        { @"On\Off Hello", new BindAction(vars.MainConfigTest.Hello) },
        { @"On\Off Goodbye", new BindAction(vars.MainConfigTest.Goodbye) }
    };
 
    List = new Dictionary<int, BindAction>
    {
        { (int)Keys.F1, Commands[@"On\Off Hello"] },
        { (int)Keys.F2, Commands[@"On\Off Goodbye"] }
    };
}
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.07.2016, 14:50 6
SLIpros, Если честно, я не знаю что такое BindAction. По-этому мне тяжело понять что конкретно вы хотите добиться именно этим куском кода.
Я говорил о том, что если у вас есть класс, например
C#
1
2
3
4
    public class Foo
    {
        public bool Bar { get; set; }
    }
Мы создаём экземпляр класса
C#
1
Foo foo = new Foo();
Передаём куда надо, например в другой класс. И всё, мы в одном месте поменяем значение foo.Bar = !foo.Bar; это изменение мы сможем увидеть во всех местах, где к этому экземпляру есть доступ.
0
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 93
22.07.2016, 15:10  [ТС] 7
BindAction можно найти в моём первом сообщение, а я выложил кусок кода, который я поменял. И вроде я все сделал так как вы сказали.

Добавлено через 6 минут
Это так же ничего не изменило, значение внутри BindAction меняется, а вот внутри экземпляра класса нет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public Binds(Vars vars)
{
    Commands = new Dictionary<string, BindAction>
    {
        { @"On\Off Hello", new BindAction { Action = vars.MainConfigTest.Hello } },
        { @"On\Off Goodbye", new BindAction { Action = vars.MainConfigTest.Goodbye } }
    };
 
    List = new Dictionary<int, BindAction>
    {
        { (int)Keys.F1, Commands[@"On\Off Hello"] },
        { (int)Keys.F2, Commands[@"On\Off Goodbye"] }
    };
}
 
public class BindAction
{
    public int Key { get; set; }
    public bool Action { get; set; }
}
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.07.2016, 15:20 8
Цитата Сообщение от SLIpros Посмотреть сообщение
Это так же ничего не изменило, значение внутри BindAction меняется, а вот внутри экземпляра класса нет.
В коде я не вижу, чтобы хоть один экземпляр BindAction менялся.
0
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 93
22.07.2016, 15:31  [ТС] 9
Я выкладываю код который я меняю, если посмотреть на мой первый пост, то вы увидите где он меняется.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.07.2016, 15:33 10
Цитата Сообщение от SLIpros Посмотреть сообщение
если посмотреть на мой первый пост, то вы увидите где он меняется
может я ослеп, но я не вижу изменений существующего. Я вижу создание нового экземпляра, а это совсем другая песня.
0
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 93
22.07.2016, 15:37  [ТС] 11
Функция Work(); Если непонятно когда она вызывается, почитайте описание.
А как мне быть? Мне нужно сделать то, что я описал в первом посте.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.07.2016, 16:10 12
SLIpros, так. Я проверил - всё нормально меняется. Давайте разбираться что у вас не получается и в каком месте?
Я делал так - объявил класс с публичной булевой переменной.
Создал массив этих классов.
Передал один из них в другой класс.
Изменил в другом классе значение переменной.
Проверил состояние переменных массива - изменения произошли.

Что вы делаете по другому?
0
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 93
22.07.2016, 16:26  [ТС] 13
Накидал тестовый код, который полностью отражает то что делаю я.
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
using System;
using System.Collections.Generic;
using System.Threading;
 
namespace Binds
{
    class Program
    {
        public static int Key = 0;
        static void Main(string[] args)
        {
            var test = new Test
            {
                SomeVariable = false,
                OtherVariable = true
            };
 
            var bind = new Binds(test);
 
            while (true)
            {
                Console.Clear();
                Key++;
 
                Binds.Work();
 
                Console.WriteLine("Original SomeVariable: " + test.SomeVariable);
                Console.WriteLine("Original OtherVariable: " + test.OtherVariable);
 
                if (Key == 2)
                    Key = 0;
                Thread.Sleep(500);
            }
        }
    }
 
    class Test
    {
        public bool SomeVariable { get; set; }
        public bool OtherVariable { get; set; }
    }
 
    class Binds
    {
        public static Dictionary<int, BindAction> List;
        public static Dictionary<string, BindAction> Commands;
        public Binds(Test test)
        {
            Commands = new Dictionary<string, BindAction>
            {
                { @"Вкл\Выкл SomeVariable", new BindAction { Action = test.SomeVariable } },
                { @"Вкл\Выкл OtherVariable", new BindAction{ Action = test.OtherVariable } }
            };
 
            List = new Dictionary<int, BindAction>
            {
                { 1, Commands[@"Вкл\Выкл SomeVariable"] },
                { 2, Commands[@"Вкл\Выкл OtherVariable"] }
            };
        }
 
        public static void Work()
        {
            try
            {
                Console.WriteLine("Action: " + List[Program.Key].Action);
                List[Program.Key].Action = !List[Program.Key].Action;
                Console.WriteLine("Changed Action: " + List[Program.Key].Action);
            }
            catch (KeyNotFoundException)
            {
                Console.WriteLine("Not binded");
            }
        }
 
        public class BindAction
        {
            public int Key { get; set; }
            public bool Action { get; set; }
        }
    }
}
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.07.2016, 16:42 14
SLIpros, из кода я вижу, что вы создали объект Test, передали его в класс Binds, создали там словарь со значениями типа BindAction, и свойству Action присвоили значение из Test. Потом в коде инвертируете значения этих свойств. Так, а что не получается то?
0
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 93
22.07.2016, 16:43  [ТС] 15
Когда я инвертируете их в функции Work(), мне нужно что бы и оригинальные значения, в данном случае в объекте test - менялись.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.07.2016, 16:45 16
Цитата Сообщение от SLIpros Посмотреть сообщение
Мне нужно менять оригинальные значения, в данном случае в объекте test.
А объект Test у вас уничтожается, поскольку после передачи из него значений переменных больше нигде не используется.
0
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 93
22.07.2016, 16:55  [ТС] 17
Можно мне пример как бы вы вышли из данной ситуации?
Просто менять объект Test внутри класса Binds я не могу, так как по моему условию объект может быть вовсе и не Test.
Мне нужно передавать ссылку на переменную и менять значение этой переменной в функции Work.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.07.2016, 17:08 18
SLIpros, самое сложное - чётко сформулировать задачу. Не как "передать что-то куда-то", а что нужно получить в итоге, какую проблему пользователя должна решить программа.
То что вы спрашиваете для мена равносильно как сделать шаг. Грубо говоря на этот вопрос я ответил. Но чтобы действительно помочь мне надо увидеть задачу в целом как дойти до библиотеки.
0
0 / 0 / 0
Регистрация: 06.02.2011
Сообщений: 93
22.07.2016, 17:21  [ТС] 19
Смысл такой: у меня есть несколько классов с разными настройками, я хочу сделать систему биндов(функция и клавиша), что бы пользователь моей программы мог выбрать функцию и клавишу, по которой он будет вкл\выкл данную функцию. Типа конструктор.

Пример:
Пользователь открывает конструктор, нажимает клавишу "создать", ему открывается меню где он может выбрать несколько предложенных значений "Вкл\выкл свет на кухне" и "Вкл\выкл подсветку на квадрокоптере", дальше выбирает клавишу.
Допустим он выбрал клавишу F1 и значение "Вкл\выкл свет на кухне", дальше он жмет сохранить. И теперь когда он нажимает на клавишу F1 свет на кухне Вкл\Выкл. Только таких значений может быть не 2, как я предложил. А 1000, и какие-то пользователь захочет использовать, а какие-то нет.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.07.2016, 17:55 20
SLIpros,
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
 public class Foo
    {
        public Dictionary<int, ActionBind> RegActs = new Dictionary<int, ActionBind>();
 
        void addNewAct(int key, Action<bool> act, string Descr)
        {
            ActionBind NewBind = new ActionBind() { IsOn = false, Description = Descr };
            NewBind.SetAct(act);
            RegActs.Add(key, NewBind);
        }
 
        void TurnLightOnKitchen(bool b)
        {
            if (!b)
            {
                // включить свет на кухне
            }
            else
            {
                // выключить свет на кухне
            }
        }
 
        void TurnLightOnCopter(bool b)
        {
            if (!b)
            {
                // включить свет на квадрокоптере
            }
            else
            {
                // выключить свет на квадрокоптере
            }
        }
 
        void AddTurnLightKitchenMethod() // это для примера добавления
        {
            addNewAct(0, TurnLightOnKitchen, "Включение света на кухне");
        }
 
        void DoTurn(int key) // для наглядности выполнения
        {
            RegActs[key].DoAction();
        }
 
        public class ActionBind
        {
            Action<bool> Act { get; set; }
            public bool IsOn { get; set; }
            public string Description { get; set; }
            public void SetAct(Action<bool> newAct)
            {
                Act = newAct;
            }
            public void DoAction()
            {
                Act(IsOn);
                IsOn = !IsOn;
            }
 
        }
    }
Добавлено через 5 минут
SLIpros, пояснения нужны?

Добавлено через 7 минут
Цитата Сообщение от SLIpros Посмотреть сообщение
какие-то пользователь захочет использовать, а какие-то нет.
) не дочитал до этого момента.
Дописывать код уже не буду. Влом. Можно добавить ещё один булевый флаг, который можно выставить в false, если пользователь не хочет выполнения действия и соответственно проверять его в DoAction().
0
22.07.2016, 17:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2016, 17:55
Помогаю со студенческими работами здесь

Как присвоить переменной файл если, допустим, путь к файлу находится в переменной s?
Ну, допустим, у меня в переменной s хранится путь к файлу. Как переменной, допустим, f присвоить...

Значение переменной bool выводится как 13, чей глюк?
Скриншот окошка watch. Сталкивались с таким? Не понимаю, чем вызван глюк. Выскакивает только в...

Перекинуть значение переменной в другой класс
Вот код: void Form1_SizeChanged(object sender, EventArgs e) { ...

Можно ли узнать если объект находится на объекте?
Даны два объекта, один это Столб, а второй это мяч. Мячик летает по карте, как сделать когда мячик...


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

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