Есть 2 формы, на вторую хочу передать значения массива с первой формы. Как это сделать? Помню что на делфи было сочетание клавиш чтобы объединить юниты форм. Как в C# это делается?
Примечание:
У меня массив картинок т.е. на Form1 я объявил public Image[] img = new Image[20]; , на form переменная img[1] красным цветом! Т.е. она не стала глобальной! Как это исправить? Чтобы одну и ту же переменную я мог использовать на абсолютно любой форме будь она №5 или №10 .
Примечание:
на Form2, Form3 она красным цветом
Примечание:
Блин еле как разобрался, спасибо cyberforum. В общем на первой форме прописал
Form2 frm = new Form2();
frm.s = 10; //Присваиваем переменной s значение 10 (—>)
frm.Show();
int n = frm.s;
а на второй форме в паблик добавил эту переменную s
RPI.su — самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected] . Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.
Обновл. 30 Июн 2019 |
Мы уже знаем, что переменные, объявленные внутри блока, называются локальными. Они имеют локальную область видимости (используются только внутри блока, в котором объявлены) и автоматическую продолжительность (создаются в точке определения и уничтожаются в конце блока).
Глобальными называются переменные, которые объявлены вне блока. Они имеют статическую продолжительность, т.е. создаются при запуске программы и уничтожаются при её завершении. Глобальные переменные имеют глобальную область видимости (или ещё «файловую область видимости»), то есть их можно использовать в любом месте файла, в котором они объявлены.
Определение глобальных переменных
Обычно глобальные переменные объявляют в верхней части кода, ниже директив #include, но выше любого другого кода. Например:
Подобно тому, как переменные во внутреннем блоке скрывают переменные с теми же именами во внешнем блоке, локальные переменные скрывают глобальные переменные с одинаковыми именами внутри блока, в котором они определены. Однако, с помощью оператора разрешения области видимости (::), компилятору можно сообщить, какую версию переменной вы хотите использовать: глобальную или локальную. Например:
Результат выполнения программы выше:
Global value: 3
Local value: 9
Использовать одинаковые имена для локальных и глобальных переменных — это прямой путь к проблемам и ошибкам, поэтому подобное делать не рекомендуется. Многие разработчики добавляют к глобальным переменным префикс g_ (“g” от англ. “global”). Таким образом можно убить сразу двух зайцев: определить глобальные переменные и избежать конфликтов имён с локальными переменными.
Ключевые слова static и extern
В дополнение к области видимости и продолжительности, переменные имеют ещё одно свойство: связь. Связь переменной определяет, относятся ли несколько упоминаний одного идентификатора к одной и той же переменной или нет.
Переменная без связей — эта переменная с локальной областью видимости, которая относится только к блоку, в котором она определена. Это обычные локальные переменные. Две переменные с одинаковыми именами, но определённые в разных функциях, не имеют никакой связи — каждая из них считается независимой боевой единицей.
Переменная, имеющая внутренние связи, называется внутренней переменной (или ещё «статической переменной»). Она может использоваться в любом месте файла, в котором определена, но не относится к чему-либо вне этого файла.
Переменная, имеющая внешние связи, называется внешней переменной. Она может использоваться как в файле, в котором определена, так и в других файлах.
Если вы хотите сделать глобальную переменную внутренней (которую можно использовать только внутри одного файла) — используйте ключевое слово static:
В моем проекте 3 формы. Есть переменные (несколько экземпляром классов и векторов), которые должны изменяться во всех файлах, если я меняю что-то в одном месте.
Вопрос в том, как лучше это реализовать?
У меня они были объявлены в отдельном .h файле все как static и это работало до поры до времени.
Еще знаю вариант, что можно их объявить отдельно в каждой форме и передавать в конструкторе.
Еще, можно объявить отдельный namespace или статический класс и записать переменные туда.
Так вот, как лучше и, самое главное, правильнее сделать это?
1 ответ 1
Значит так. Сначала, по поводу static . Модификатор static означает «локальный в данной единице компиляции». То есть, в одном .cpp -файле и включенных в него header’ах. Поэтому два .cpp-файла видят разные экземпляры static -переменной. Это в принципе не может использоваться для глобальных переменных, никак. Непонятно, почему по вашим словам это «работало».
Глобальные переменные в C и C++, а также глобальные нативные переменные в C++/CLI объявляются так:
В .h-файле декларация того, что переменная есть где-то:
В .cpp-файле реальное объявление:
Глобальные управляемые переменные в C++/CLI не существуют, но легко эмулируются статическими полями статического класса, как указано в этом ответе.
По поводу того, как избавиться от глобальных переменных — длинная история. По идее, вы должны переписать классы так, чтобы они получали нужные данные в конструкторе. Или имели ссылки на другие классы, где можно запросить нужную информацию. Или ещё одним из тысячи возможных способов, вам как архитектору программы самому решать, как именно распределять ответственности между вашими классами. Универсальной рекомендации не существует.