Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как хранить и передавать настройки между формами? c++\CLI 
V
    Опции темы
graham
Дата 10.8.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



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 разбирался, но самостоятельно так и не получилось :(

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


PM MAIL   Вверх
Heinzz
Дата 10.8.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 1
Всего: 9



Можно так 
Код


//В форме 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 -- любое по вкусу, можно записать свою структуру с настройками (удобнее будет сериализовать в файл)


--------------------
user posted image
PM MAIL   Вверх
graham
Дата 11.8.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



Спасибо, но это всетаки не то.
Настроек планируется сделать много. Получается у меня сейчас есть класс Form1, Form2 и класс Globals. Где и как создать экземпляр Globals чтобы к нему можно было обращаться из Form1 и Form2, а в будущем и из других форм? Аналогичный метод понадобится для локализации меню, если конечно нет другого...
PM MAIL   Вверх
jonie
Дата 11.8.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
math64
Дата 11.8.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: нет
Всего: 72



Код

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();
}

PM   Вверх
graham
Дата 11.8.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) graham - 11.8.2009, 17:19
PM MAIL   Вверх
Heinzz
Дата 11.8.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 1
Всего: 9



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

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


--------------------
user posted image
PM MAIL   Вверх
graham
Дата 11.8.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



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



Хорошо, если так, то сделаю через передачу в формы. Но можно какой-нибудь материал в подтверждение, что это нехорошо? smile 
PM MAIL   Вверх
math64
Дата 12.8.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: нет
Всего: 72



Цитата(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");

PM   Вверх
IGV
Дата 12.8.2009, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 1.4.2008

Репутация: нет
Всего: 2



graham, 
я бы в данном случае использовал Settings.settings.
вот статья о конфигурировании приложений
PM MAIL ICQ   Вверх
graham
Дата 13.8.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



Спасибо, похоже, все что мне нужно это паттерн Singletone. Пока не могу в нем разобраться т.к. "плаваю" в ООП. Но уже есть стимул и направление.
PM MAIL   Вверх
graham
Дата 31.8.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



объявил класс Settings в первой форме и передал ее при вызове второй форме в конструктор и все заработало, спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.