Сделать только сфокусированный блок сообщений [duplicate]

Стандарт C ++ требует определения для вашего статического члена константы, если определение каким-то образом необходимо.

Требуется определение, например, если используется его адрес. push_back принимает свой параметр с помощью ссылки const, и поэтому строгому компилятору нужен адрес вашего члена, и вам нужно определить его в пространстве имен.

Когда вы явно используете константу, вы создаете временное, и это временное, которое связано с ссылкой (по специальным правилам в стандарте).

Это действительно интересный случай, и я на самом деле думаю, что стоит подняться вопрос, чтобы std был изменен на имеют одинаковое поведение для вашего постоянного члена!

Хотя, в каком-то странном виде это можно рассматривать как законное использование унарного оператора «+». В основном результат unary + является rvalue, поэтому применяются правила привязки rvalues ​​к ссылкам const, и мы не используем адрес нашего статического члена const:

v.push_back( +Foo::MEMBER );
17
задан gabr 18 March 2011 в 09:57
поделиться

5 ответов

this.Invoke(new Action(() => { MessageBox.Show(this, "text"); }));

Это переключится на основной поток и покажет MessageBox с родителем form1.

29
ответ дан Otiel 18 August 2018 в 04:32
поделиться
  • 1
    Это дает мне много ошибок компиляции (т. Е. Ошибка 1 Ключевое слово «this» недопустимо в статическом свойстве, статическом методе или инициализаторе статического поля) – daftu 18 March 2011 в 09:29
  • 2
    Вместо этого this используйте экземпляр вашей формы1 – Stecya 18 March 2011 в 09:32
  • 3
    Как вы здесь получаете DialogResult? Invoke возвращает объект, и он равен null. – Stealth Rabbi 16 December 2013 в 18:04
  • 4
    @StealthRabbi: см. Мой ответ для этого конкретного сценария. – Derek W 14 April 2014 в 22:01
  if ( Form1.InvokeRequired ) {
            Form1.Invoke((Action)delegate{MessageBox.Show(Form1,"Hello");});
        }
3
ответ дан Arsen Mkrtchyan 18 August 2018 в 04:32
поделиться

Попробуйте использовать backgroundworker .

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
   //Helper thread: Long during task
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //We're in the main thread: Show your messagebox
}
1
ответ дан Carra 18 August 2018 в 04:32
поделиться

Хотя выбранный ответ обеспечивает хороший способ отображения MessageBox из асинхронного потока, он не обрабатывает случай, когда вы хотите извлечь DialogResult из показанного MessageBox.

Если вы хотите вернуть DialogResult из вызываемого MessageBox, отображаемого поверх Form. Затем вам нужно использовать делегат Func вместо делегата Action.

Action делегаты всегда возвращают void, тогда как Func имеет возвращаемое значение.

Вот небольшой метод, который я разработал для обработки этого конкретного сценария:

private DialogResult BackgroundThreadMessageBox(IWin32Window owner, string text)
{
   if (this.InvokeRequired)
   {
      return (DialogResult) this.Invoke(new Func<DialogResult>(
                             () => { return MessageBox.Show(owner, text); }));
   }
   else
   {
      return MessageBox.Show(owner, text);
   }
}

Хотя это обычно не считается лучшей практикой или дизайном, он будет работать в крайнем случае.

10
ответ дан Derek W 18 August 2018 в 04:32
поделиться
  • 1
    Просто из любопытства, какова будет лучшая практика / дизайн? – Eric Pohl 7 March 2017 в 16:11

В моем случае я был в другом классе и имел ссылку для текстового поля, поэтому я использовал следующий код:

_txtResultado.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate ()
{
    MessageBox.Show("My message!");
}));
0
ответ дан Ricardo França 18 August 2018 в 04:32
поделиться
Другие вопросы по тегам:

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