none
Доступ к элементу из другой формы. RRS feed

  • Вопрос

  • Здравствуйте! Заранее прошу прощения за скудные познания, но учиться есть время только после работы, никак не связанной с программированием. Спасибо за понимание!

    И так вопрос. Есть класс Character (Character.cs) и две формы(Form1, Form2).

    Character.cs содержит такой код:

    public class Character
        {
            public int Level;
            public int Experience;
            public int Strenght;
            public int Dexterity;
            public int Stamina;
            public int DamageLow;
            public int DamageTop;
            public int Dodge;
            public int HealthPoint;
    
            public Character(int lvl, int exp, int str, int dex, int stam, int dmgL, int dmgT, int dodge, int hp)
            {
                Level = lvl;
                Experience = exp;
                Strenght = str;
                Dexterity = dex;
                Stamina = stam;
                DamageLow = dmgL = (0 + Level) * Strenght;
                DamageTop = dmgT = (1 + Level) * Strenght;
                Dodge = dodge = (Dexterity * 3) + ((Level * 5) / 2);
                HealthPoint = hp = (Stamina * 5) + (Level * 5);
            }
        }

    В первой форме должен создавать объект player и enemy, кнопка для открытия формы.

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            Character player = new Character(1, 0, 5, 5, 5, 0, 0, 0, 0);
            Character enemy = new Character(1, 0, 5, 5, 5, 0, 0, 0, 0);
    
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2(this);
                this.Hide();
                f2.Show();
            }
        }

    Форма 2 содержит такой код:

    private Form1 _f1;
    
            public Form2(Form1 f1)
    
            {
                InitializeComponent();
    
                _f1 = f1;
            }

    Во воторой форме я хочу чтобы создавались или переносились player и enemy из первой формы, которыми уже можно было манипулировать во второй форме. Предполагаю, что это достаточно просто, но не могу нащупать...

    15 сентября 2015 г. 18:18

Все ответы

  • public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            Character player = new Character(1, 0, 5, 5, 5, 0, 0, 0, 0);
            Character enemy = new Character(1, 0, 5, 5, 5, 0, 0, 0, 0);
    
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2(this);
                this.Hide();
                f2.Show();
            }
    
            public Character Player { get { return player;}}
    
            public Character Enemy { get { return enemy;}}
        }
    Попробуй те так. А потом во второй форме обращаться так _f1.Player или _f1.Enemy

    Mak Arti

    16 сентября 2015 г. 9:25

  • Спасибо! А как можно посредством второй формы внести изменения в первую? К примеру при условной победе игрока нужно развернуть форму 1 и прибавить 10 к значению Experience (exp) у player.
    16 сентября 2015 г. 19:05
  • Формы это просто объекты, ничего мистического в них нет. Вызов методов и свойств любого объекта производится по ссылкам. Хотите развернуть форму - вызовите метод Show() по ссылке. Хотите что то прибавить, то же самое - берете данные по ссылке, прибавляйте, записывайте их обратно.

    Ссылки можно хранить разными способами. Например можно использовать централизованный менеджер форм или же просто передавать их из формы в форму.

    Кстати, современные методики (MVVM, MVC  и т.п.) не предусматривают хранения данных в формах так как это порождает очень плохой код.

    Вместо этого используется модель (Model) которая через посредника (Controller или View Model) подключена к фактическому отображению данных (View).

    Таким образом все данные вроде параметров персонажа находятся именно в модели, а в формах нет вообще ничего и нет никакой необходимости иметь на них ссылки. 


    This posting is provided "AS IS" with no warranties, and confers no rights.

    17 сентября 2015 г. 6:12
    Модератор
  • Если нужно прибавить, то добавьте метод в форме 1.

    public void AddExperience(int exp) { player.Experience += exp; }

    Спрятать форму есть метод Hide(), показать - Show().  А так в перспективе для Вас лучше прислушаться к совету предыдущего ответа.


    Mak Arti


    17 сентября 2015 г. 6:31
  • Спасибо!
    17 сентября 2015 г. 16:50
  • Спасибо!
    17 сентября 2015 г. 16:50
  • Не могли бы Вы подсказать мне еще одну вещь?

    Как я понял, представленный Вами метод прибавляет указанное число exp в переменную Experience. А если такой же метод сделать по отношению к переменной Level:

    public void AddLevel(int lvl)
    {
         player.Level+= lvl;
    }

    Во второй форме вызываю метод так:

    _f1.AddLevel(1);
    Как я понял, данный метод меняет сам объект player на такой вид? Или я неправильно понимаю?
    Character player = new Character(2, 0, 5, 5, 5, 0, 0, 0, 0);
    И будет ли это изменение влиять на данную формулу?
    HealthPoint = hp = (Stamina * 5) + (Level * 5);


    • Изменено IMykytiv 19 сентября 2015 г. 16:48
    19 сентября 2015 г. 16:07
  • Да, это один и тот же объект экземпляра, что в первой и что во второй форме.

    Ну добавьте еще метод, который будет считать по формуле.

    public SetHealth(int value)
    {
    	player.HealthPoint = (player.Stamina + player.Level) * value;
    }



    Mak Arti

    21 сентября 2015 г. 6:25