none
Как получить доступ к элементам формы из другого модуля? C++ RRS feed

  • Вопрос

  • Нашёл только попахивающее извращениями решение через
    Application.OpenForms["formName"].Controls["myTextBox"]
    

    Но даже его не получилось применить, потому что не видится Application. А откуда оно берётся в главном .cpp программы, непонятно, то есть непонятно, что надо подключить к модулю, чтобы он увидел Application.

    И, кстати, ещё вопрос: если форма имеет класс Form1, то её имя будет form1? Просто я нигде не смог найти присвоения имени, все операции с классом. Или и поиск формы надо по классу осуществлять?

    Кроме того, кто-то предложил сделать в форме public методы для модификации (или считывания) состояний элементов, но тогда тем более непонятно, как к этим методам обращаться извне - даже нельзя по аналогии с Controls что-то сделать.

    11 февраля 2011 г. 22:40

Ответы

  • 1. Класс Application статический, это не экземпляр класса. Соответственно, все его методы тоже статические.

    2. Создание экземпляра класса Form1 происходит в методе main() (по умолчанию). Если Вам нужен доступ к этой форме вне класса Form1, нужно каким-либо образом передать ссылку на эту форму (предпочтительный вариант) или создать глобальную переменную.

    3. Если Вам нужно получить доступ к элементу формы извне, Вы можете изменить его свойство "Modifiers" на public, но в этом случае нарушается инкапсуляция. Правильнее будет создать отдельный метод с модификатором public в классе формы и обращаться к этому элементу в данном методе.

    Мэйнстримовыми языками в .NET Framework являются C# и Visual Basic.NET, поэтому Вам так сложно найти информацию о программировании на языке C++/CLI в .NET Framework.

    • Помечено в качестве ответа PashaPashModerator 12 февраля 2011 г. 18:19
    12 февраля 2011 г. 7:07
  • #pragma once означает, что этот файл будет подключен во время компиляции не более одного раза, но использовать его можно. Посмотрите cpp-файл, содержащий метод main(), в нем должна быть строка

    #include "Form1.h"
    
    Windows Forms является частью платформы .NET Framework, поэтому без нее приложение на Windows Forms попросту не запустится.

    • Помечено в качестве ответа PashaPashModerator 12 февраля 2011 г. 18:19
    12 февраля 2011 г. 9:00

Все ответы

  • 1. Класс Application статический, это не экземпляр класса. Соответственно, все его методы тоже статические.

    2. Создание экземпляра класса Form1 происходит в методе main() (по умолчанию). Если Вам нужен доступ к этой форме вне класса Form1, нужно каким-либо образом передать ссылку на эту форму (предпочтительный вариант) или создать глобальную переменную.

    3. Если Вам нужно получить доступ к элементу формы извне, Вы можете изменить его свойство "Modifiers" на public, но в этом случае нарушается инкапсуляция. Правильнее будет создать отдельный метод с модификатором public в классе формы и обращаться к этому элементу в данном методе.

    Мэйнстримовыми языками в .NET Framework являются C# и Visual Basic.NET, поэтому Вам так сложно найти информацию о программировании на языке C++/CLI в .NET Framework.

    • Помечено в качестве ответа PashaPashModerator 12 февраля 2011 г. 18:19
    12 февраля 2011 г. 7:07
  • 1. Ага, спасибо, и ещё он находится в пространстве имён System::Windows::Forms.

    2-3. Точно, можно же просто this передать при вызове из методов формы! Только вот такая проблема: как обращаться к public методам, если класс Form1 определён только в его собственном модуле и, судя по #pragma once (хотя я не знаю, а только догадываюсь), никуда больше его вставить нельзя, то есть мы можем обращаться с этим указателем на форму только как с System::Windows::Forms::Form?

    А кстати, можно ли на Windows Forms писать без .NET? Или для этого надо какой-то другой тип проекта?

    12 февраля 2011 г. 8:51
  • #pragma once означает, что этот файл будет подключен во время компиляции не более одного раза, но использовать его можно. Посмотрите cpp-файл, содержащий метод main(), в нем должна быть строка

    #include "Form1.h"
    
    Windows Forms является частью платформы .NET Framework, поэтому без нее приложение на Windows Forms попросту не запустится.

    • Помечено в качестве ответа PashaPashModerator 12 февраля 2011 г. 18:19
    12 февраля 2011 г. 9:00
  • Ура! У меня получилось... Пришлось сделать так:
    #pragma once
    namespace ProjectName {
    	ref class MainForm;
    }
    
    void MyFunc(..., ProjectName::MainForm^ mainForm);
    
    #include "MainForm.h"
    

    Получилось взаимовключение, потому что в MainForm.h требуется включить этот вот заголовочный файл, чтобы иметь прототип MyFunc, поэтому здесь от греха подальше тоже добавил #pragma once, хотя и без него работало (видимо, объявления MainForm и MyFunc копировались 2 раза подряд, но это не страшно).

    Ну что ж, спасибо! А всё-таки есть ещё какие-то типы проектов с WYSIWYG-дизайнером форм, или везде надо на чистом WinAPI писать?

    12 февраля 2011 г. 14:09
  • Ну, проектом с WYSIWYG-дизайнером можно назвать еще и MFC-проекты, если Вы рассматриваете только Visual Studio и только C++. Если же рассматривать другие языки в Visual Studio, то для C# и VB.NET есть возможность создавать проекты на Windows Presentation Foundation. Это более функциональная платформа для построения пользовательских интерфейсов, по сравнению Windows Forms.
    12 февраля 2011 г. 14:22
  • Да, в MFC видел редактор для диалоговых окон, но как-то странно делать всё приложение (хоть и небольшое) на основе диалоговых окон... Повсюду эти ID, а они, насколько я знаю, используются для возвращения "модального результата" работы диалога. И я сначала даже не нашёл, как сделать чтоб появились кнопки Свернуть/Развернуть/Закрыть (а сейчас нашёл, но не вижу, где отключить кнопку Развернуть). И компонентов мало, например, никаких диалогов нет (в какой-то степени логично - чего в диалог диалоги пихать?). Хотя здесь, как ни странно, оформление кода мне больше понравилось: обработчики событий не в .h, а в .cpp (в Windows Forms вообще нет .cpp для форм), и без всяких стрёмных отступов из 4 tab'ов и пробела...

    Так что же, как же реально пишутся приложения на Visual C++? Вряд ли на .NET. На MFC (которого даже нет в Express-редакции Visual Studio)? Даже если не предполагается работа с какими-то документами, вокруг которых крутится большинство типов интерфейса, предлагаемых в мастере создания проекта?

    А про Windows Presentation Foundation в Wiki написано, что она и с C++ .NET работает, так что, может, и её посмотрю когда-нибудь.

    12 февраля 2011 г. 15:24
  • Ну, Ваш вопрос был про WYSIWYG-дизайнер, а не про приложение в целом. На C++ пишут, в основном, Win32-native приложения, которые должны работать на всех ОС Windows, в том числе и на тех, на которых .NET Framework не установлена или не поддерживается. Зачастую на C++ разрабатывают игры, работая напрямую с неуправляемым DirectX и OpenGL. Также разумно будет писать приложения, широко использующие те возможности Windows, которые пока что отсутствуют в .NET Framework (например, как это было до .NET 4.0 с multi-touch).

    WPF теоретически поддерживается всеми .NET-совместимыми языками, но на текущий момент в Visual Studio есть шаблоны для создания WPF-проектов только для C# и VB.NET.

    12 февраля 2011 г. 15:47
  • Примерно ясно. То есть всё-таки пишут на .NET, но в основном на C#, а не на C++. Спасибо
    12 февраля 2011 г. 17:53
  • 1. Пожалуйста.

    2. Задавайте новые вопросы в новых темах.

    3. Отмечайте сообщения, отвечающие на оригинальный вопрос топика, кнопкой "пометить как ответ".

    4. Иначет топик превратится из вопроса в обсуждение "все что я хочу узнать о C++"

    5. И его станет трудно читать, почти как это сообщение.

    6. Спасибо.


    My blog
    12 февраля 2011 г. 18:19
    Модератор