На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Как правильно передать несколько разнородных данных из одной формы в другую?
    На форме MainForm много элементов управления (установка цвета, комбобоксы, numUpDown и другие), значения которых я хочу передать в форму Test. Можно, конечно, написать свойство для каждого из значений элементов управления. Но хотелось бы сделать так: в основной форме я делаю структуру из значений параметров и передаю ее за один get структуре в форме Test, а потом использую поля структуры формы тест для дальнейших операций. В форме Main в класс Main Forм создал код:
    ExpandedWrap disabled
      public struct LineParam
      {
        public Int32 numLineSizeUdf;
        public Color clrLineColor;
        public Int32 numLineSpace;
        public Color clrLineFon;
      }
       
      public LineParam lp;
       
      private void MainForm_Deactivate(object sender, EventArgs e)
      {
        lp.numLineSizeUdf = (Int32)numLineSize.Value;
        lp.numLineSpace = (Int32)numSpace.Value;
        lp.clrLineColor = lblColor.ForeColor;
        lp.clrLineFon = lblFon.ForeColor;
      } // void MainForm_Deactivate
       
      public LineParam getParamLine()
      {
        return lp;
      }
    В форме Test:
    ExpandedWrap disabled
      public MainForm.LineParam lptst  = new MainForm.LineParam();
       
      private void TestScreen_Load(object sender, EventArgs e)
      {
        lptst = ((MainForm)this.Owner).getParamLine(); // Вот здесь ошибка "В экземпляре объекта не задана ссылка на объект".
      }
    Подскажите, пожалуйста, как исправить ошибку. Прикрепляю проект с небольшим количеством контролов (в реальном проекте их в 3 раза больше)

    Прикреплённый файлПрикреплённый файлMyQCSharp.zip (14,68 Кбайт, скачиваний: 83)
      MainForm_Deactivate было вызвано перед TestScreen_Load?

      Добавлено
      tumanovalex
      а не лучше ли сделать так, что getParamLine() возвращал не заранее созданную структуру, а заполнял ее при вызове?
        Спасибо, попробую
          Попробовал, ошибка та же.
            Цитата tumanovalex @
            Попробовал, ошибка та же.

            код покажи
              Так это...

              ExpandedWrap disabled
                private void butOK_Click(object sender, EventArgs e)
                {
                 System.Windows.Forms.Cursor.Hide();
                 Test fm = new Test();
                 fm.Show();
                }


              и в этой форме(Test):
              ExpandedWrap disabled
                private void TestScreen_Load(object sender, EventArgs e)
                {
                  lptst = ((MainForm)this.Owner).getParamLine();
                }


              Очевидно, что Owner == null :) не? может уж так:
              ExpandedWrap disabled
                private void butOK_Click(object sender, EventArgs e)
                {
                 System.Windows.Forms.Cursor.Hide();
                 Test fm = new Test();
                 fm.Owner = this;
                 fm.Show();
                }
                Одна строка
                ExpandedWrap disabled
                  fm.Owner = this;
                и все получилось. Спасибо большое, maxim86!
                  Скрытый текст
                  Цитата
                  Спасибо большое, maxim86!

                  О как :D
                    Прошу прощения, maxim84, ошибся с именем. Что-то теперь не получается передать в подчиненную форму цвет линии и цвет фона.
                    ExpandedWrap disabled
                      private void TestScreen_Load(object sender, EventArgs e)
                      {
                        lptst = new MainForm.LineParam();
                        lptst = ((MainForm)this.Owner).getParamLine();
                        this.ForeColor = lptst.clrLineFon;
                      }
                       
                      private void TestScreen_Paint(object sender, PaintEventArgs e)
                      {
                        Graphics g = e.Graphics;
                        Pen pen = new Pen(lptst.clrLineColor, lptst.numLineSize);
                        for (Int32 i = 0; i < iXmax; i += lptst.numLineSpace + lptst.numLineSize)
                        {
                       
                          p1.X = i; p1.Y = 0;
                          p2.X = i; p1.Y = iYmax;
                          g.DrawLine(pen, p1, p2);
                        }
                      }
                    Размеры линии и промежутка изменяются, а вот цвет фона и линий - нет.
                      ForeColor - цвет текста...
                      Где-то криво параметры передаются, не иначе...
                        Спасибо большое, нашел ошибки, все работает
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0377 ]   [ 18 queries used ]   [ Generated: 3.05.24, 07:44 GMT ]