Использование расширений с помощью системы Static Class.Windows.Forms

Здесь много правильных ответов, но я хотел добавить это (для полноты):

Если вы в нижней части файла cpp реализации выполняете явное инстанцирование всех типов, которые будут использоваться шаблоном с, компоновщик сможет найти их как обычно.

Изменить: добавление примера явного создания экземпляра шаблона. Используется после того, как шаблон определен, и определены все функции-члены.

template class vector<int>;

Это создаст экземпляр (и, следовательно, сделает доступным для компоновщика) класс и все его функции-члены (только). Подобный синтаксис работает для функций шаблона, поэтому, если у вас есть перегрузки операторов, не являющихся членами, вам может понадобиться сделать то же самое для них.

Вышеприведенный пример бесполезен, поскольку вектор полностью определен в заголовках, за исключением случаев, когда common include file (precompiled header?) использует extern template class vector<int>, чтобы не создавать его из всех других (1000?) файлов, которые используют вектор.

-1
задан Eric A. 13 July 2018 в 17:21
поделиться

1 ответ

Как отметил @CEvenhuis в вопросительном комментарии, вам нужен экземпляр основной формы.

(И вам вообще не нужны методы расширения. Никогда не делайте - они просто позволяют вызвать код, чтобы выглядеть и чувствовать себя иначе. Но в этом случае в коде, который вы показали, вы просто давая именам животных известным, существующим методам.)

В любом случае, в «дочерней» форме вы можете иметь поле для ссылки на экземпляр основной формы.

Form _parent;

И используйте его как

private void bnTrBack_Click(objects sender, EventArgs e)
{
    _parent.Show();
    Close();
}

Или, если ребенок является только дочерним по отношению к основной форме,

Main _main;

private void bnTrBack_Click(objects sender, EventArgs e)
{
    _main.Show();
    Close();
}

Вопрос заключается в том, как установить поле.

Его можно установить в конструкторе:

ReadOnly Main _main;

И смените созданный конструктором код:

    public Child()
    {
        InitializeComponent();
    }

на

    public Child(Main main)
    {
        InitializeComponent();
        _main = main;
    }

Немного отступив, вместо того, чтобы скрывать основную форму, вы можете вместо этого - , если это необходимо - показать дочернюю форму в качестве модального диалога и получить обратно простой результат после его закрытия:

var result = new Child().ShowDialog(); 

В общем, есть две вещи, которые можно оценить по поводу вариантов:

  1. Пользовательский интерфейс: отображаются ли элементы управления пользователей в способ, которым они могут понять и таким образом, который позволяет им следовать за желаемыми рабочими процессами?
  2. Связь между классами: какие классы зависят от того, какие классы и каким образом? Есть ли хороший план для передачи данных и управления?
1
ответ дан Tom Blodget 17 August 2018 в 12:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: