Несоответствие количества параметров с делегатом Windows Form ShowDialog - PullRequest
0 голосов
/ 13 декабря 2011

Так что я просто пытаюсь показать форму из другого потока из потока GUI. На всю жизнь я не вижу, чтобы правильно настроить свои аргументы для вызова, который выдает мне сообщение об ошибке из catch:

«рассогласование параметров»

Есть идеи, как правильно настроить аргументы для передачи?

#pragma once
#include "ErrorSystemStop.h"
using namespace System;
using namespace System::Windows::Forms;

delegate DialogResult ShowErrorWindow(System::Windows::Forms::IWin32Window ^ parentForm );

void ThrowErrorWindow(System::String^ strErrorMessage, int iNumberOfSegments, System::Windows::Forms::IWin32Window ^ parentForm)
{
//Only throw if we need too.
if(!bErrorPause)
{
    MainDisplay::ErrorSystemStop ^ stopMe = gcnew MainDisplay::ErrorSystemStop(strErrorMessage, iNumberOfSegments);
    ShowErrorWindow ^ disp = gcnew ShowErrorWindow(( System::Windows::Forms::Form ^)stopMe, &MainDisplay::ErrorSystemStop::ShowDialog);
    stopMe->TopMost = true;
    try
    {
        cli::array<System::Windows::Forms::IWin32Window ^> ^ Args = gcnew cli::array<System::Windows::Forms::IWin32Window ^>(1);
        Args[0] = parentForm;
        stopMe->Invoke(disp,( System::Windows::Forms::Form ^)stopMe, gcnew array<System::Object ^>{Args});
    }
    catch(Exception ^e)
    {
        e->Message;
    }
}
} //end ThrowErrorWindow

Я также пробовал:

array<Object^> ^ Args = {parentForm};
stopMe->Invoke(disp,(System::Windows::Forms::Form ^)stopMe, Args);

Спасибо,

Alikar

1 Ответ

0 голосов
/ 14 декабря 2011

Получается, что я передал три параметра, я так устал вчера вечером, что не заметил.

Я сжал код до этого:

delegate void ShowErrorWindow(ErrorThrowClass ^ form, System::String^ strErrorMessage, int iNumberOfSegments );

void ThrowErrorWindow(System::String^ strErrorMessage, int iNumberOfSegments, System::Windows::Forms::Form ^ parentForm)
{
//Only throw if we need too.
if(!bErrorPause)
{
    ShowErrorWindow ^ disp = gcnew ShowErrorWindow(&ErrorThrowClass::LaunchErrorWindow);
    MthrControl(DataProtect,M_UNLOCK,M_DEFAULT);
    try
    {
        array<Object^> ^ Args = {parentForm, strErrorMessage, iNumberOfSegments};
        parentForm->Invoke(disp, Args);
    }
    catch(Exception ^e)
    {
        e->Message;
    }
    MthrControl(DataProtect,M_LOCK,M_DEFAULT);
}
} //end Throw ErrorWindow

Код для запуска другого окна ошибки теперь является статической функцией в родительском объекте GUI. Это позволяет запускать все в одном потоке.

...