Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Как хранить и передавать настройки между формами?


Автор: graham 10.8.2009, 15:41
1. код на C++\CLI
2. структура программы:
 а) две формы, предположим Form1 и Form2, каждая имеет свой заголовочник и собрана в дизайнере;
 б) заголовочники подключил к исполняемому .cpp
3. суть программы: Form1 - главная форма, отображает какие-то данные и содержит кнопку - обработчик в зависимости от выбранных настроек на Form2 должен сделать вычисления.
     Form2 вызывается из меню Form1 через ShowDialog(). 
     На Form2 находятся последние настройки программы.
     Настройки установленные в Form2 надо сохранять в .ini и считывають оттуда, чтобы их не вводить заново при каждом запуске программы. 

Не могу реализовать что-то вроде общего контейнера для Form1 и Form2, в который бы кидал все данные из полей Form2, а в Form1 мог их считать и использовать в процедурах для сохранения\чтения настроек и в зависимости от настроек обработка данных по нажатию кнопки.

Пробовал реализовать через глобальный static ref class, в итоге получилось добраться до него из Form1, но он почему-то оказался недоступен из Form2. Пробовал сделать поля public, тоже не получилось, но таким способом реализовать не хочу, поэтому не стал разбираться в нем. Со static ref class разбирался, но самостоятельно так и не получилось :(

Может есть какое-то стандартное решение для этой задачи?


Автор: Heinzz 10.8.2009, 16:03
Можно так 
Код


//В форме 1 запускаем форму 2, а затем пользуемся результатом работы формы 2
private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.ShowDialog();
            textBox1.Text = f2.result;
        }


а это форма 2
Код

public string result;
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            result = textBox1.Text;
        }

Поле result -- любое по вкусу, можно записать свою структуру с настройками (удобнее будет сериализовать в файл)

Автор: graham 11.8.2009, 11:44
Спасибо, но это всетаки не то.
Настроек планируется сделать много. Получается у меня сейчас есть класс Form1, Form2 и класс Globals. Где и как создать экземпляр Globals чтобы к нему можно было обращаться из Form1 и Form2, а в будущем и из других форм? Аналогичный метод понадобится для локализации меню, если конечно нет другого...

Автор: jonie 11.8.2009, 11:54
делайте структуру или класс и передавайте ссылку на него в форму2, где и работайте с ней. А для компонентов используйте binding свойств на экземпляр этой структуры\класса

Автор: math64 11.8.2009, 16:09
Код

public class Settings {
public void Load() { ... }
public void Save() { ... }
public string S { get { ... }  set { ... } }
public int N { get { ... } set { ... } }
public void edit()
{ 
  Form2 f2 = new Form2(this);
  f2.ShowDialog();
}

Автор: graham 11.8.2009, 17:14
jonie, а есть способ без передачи форме класса\структуры опций? Хочу сделать чтобы была область памяти в оперативке типа глобальных переменных для всего проекта. Думал сделать через файл, но постоянно читать-писать на винт не разумно.

Добавлено @ 17:17
math64, тут самое сложное(на что не могу найти ответа), где этот класс объявить и как сделать чтобы он был виден и в Form1 и в Form2?

Автор: Heinzz 11.8.2009, 17:26
Цитата(graham @  11.8.2009,  17:14 Найти цитируемый пост)
math64, тут самое сложное(на что не могу найти ответа), где этот класс объявить и как сделать чтобы он был виден и в Form1 и в Form2?

Как предложил math64 сделайте Ваш класс членом формы 1 и передавайте в конструктор формы 2, таким образом доступ будут иметь все.
 Ну а глобальные переменные нехорошо, бросьте. smile 

Автор: graham 11.8.2009, 21:30
Цитата(Heinzz @ 11.8.2009,  17:26)
Ну а глобальные переменные нехорошо, бросьте. smile



Хорошо, если так, то сделаю через передачу в формы. Но можно какой-нибудь материал в подтверждение, что это нехорошо? smile 

Автор: math64 12.8.2009, 09:16
Цитата(graham @  11.8.2009,  21:30 Найти цитируемый пост)
Хорошо, если так, то сделаю через передачу в формы. Но можно какой-нибудь материал в подтверждение, что это нехорошо?

Например, появляется Form3, которой тоже нужны аналогичные настройки, но их значения не будут совпадать с настройками Form1 и будут сохраняться в другом .ini или в другой секции. В таком случае не нужно будет создавать Form4, почти идентичную Form2, а использовать Form2 непосредственно.

Класс Settings лучше разместить в отдельном файле,
Код

Settings settings = new Settings("myapp.ini", "mysection");

но можно внутри Form2.
Код

Form2.Settings settings = new Form2.Settings("myapp.ini", "mysection");

Автор: IGV 12.8.2009, 09:36
graham, 
я бы в данном случае использовал Settings.settings.
вот http://www.rsdn.ru/article/dotnet/dnetappcfg.xml

Автор: graham 13.8.2009, 13:21
Спасибо, похоже, все что мне нужно это паттерн Singletone. Пока не могу в нем разобраться т.к. "плаваю" в ООП. Но уже есть стимул и направление.

Автор: graham 31.8.2009, 21:15
объявил класс Settings в первой форме и передал ее при вызове второй форме в конструктор и все заработало, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)