Вызов из-за пределов класса .NET

Я использую Visual Studio C++ 2010.

Я хочу внести потокобезопасные изменения в графический интерфейс, отличный от основного потока, из функции, объявленной вне основного класса формы. Вот какой код у меня есть:

Вне основного класса:

public delegate void DEBUGDelegate(String^ text);

(...)

int lua_debug(lua_State *L){
    // boolean debug(message)
    Globals^ Global = gcnew Globals;
    String^ debugMsg = gcnew String(lua_tostring(L, 1));

    DEBUGDelegate^ myDelegate = gcnew DEBUGDelegate(Global->FORM, &Form1::DEBUGDelegateMethod);
    Global->FORM->Invoke(myDelegate, gcnew array<Object^> { "HEYO! \r\n" });

    lua_pushboolean(L, true);
    return 1;
}

Внутри основного класса:

public ref class Form1 : public System::Windows::Forms::Form
{

(...)

    public: void DEBUGDelegateMethod(String^ text)
    {
            this->DEBUGBOX->Text += text;
    }

(...)

    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e)
    {
        Globals^ Global = gcnew Globals;
        Global->FORM = this;
    }

    private: System::Void button1_Click_1(System::Object^  sender, System::EventArgs^  e)
    {
        Globals^ Global = gcnew Globals;
        DEBUGDelegate^ myDelegate = gcnew DEBUGDelegate(this, &Form1::DEBUGDelegateMethod);
        this->Invoke(myDelegate, gcnew array<Object^> { "HEYO! \r\n" });
    }
}

Итак, проблема в том, что если я прокомментирую функцию "lua_debug", а остальное останется нетронутым, она будет работать нормально, и при нажатии кнопки 1 текст появится в текстовом поле отладки. Когда я раскомментирую часть с помощью lua_debug, появляется ошибка:

d:\prog\c++\x\x\Form1.h(146): error C2653: 'Form1' : is not a class or namespace name
1>d:\prog\c++\x\x\Form1.h(146): error C2065: 'DEBUGDelegateMethod' : undeclared identifier
1>d:\prog\c++\x\x\Form1.h(146): error C3350: 'X::DEBUGDelegate' : a delegate constructor expects 2 argument(s)

146 строка:

DEBUGDelegate^ myDelegate = gcnew DEBUGDelegate(Global->FORM, &Form1::DEBUGDelegateMethod);

============================================== ==== @EDIT

После перемещения lua_debug после объявления Form1 я получаю эту ошибку:

d:\prog\c++\x\x\Form1.h(1829): error C2440: 'initializing' : cannot convert from    'System::Windows::Forms::Form ^' to 'X::Form1 ^'
1>          No user-defined-conversion operator available, or
1>          Cast from base to derived requires safe_cast or static_cast
1>d:\prog\c++\x\x\Form1.h(1829): error C3754: delegate constructor: member function    'X::Form1::DEBUGDelegateMethod' cannot be called on an instance of type 'System::Windows::Forms::Form ^'

в соответствии:

DEBUGDelegate^ myDelegate = gcnew DEBUGDelegate(Global->FORM, &Form1::DEBUGDelegateMethod);

Global->FORM объявляется как:

static Form^ FORM;

в классе глобалов.


person user1558211    schedule 07.08.2012    source источник
comment
Похоже, функция lua_debug не видит тип Form1 (на это указывает первая ошибка, две другие являются следствием первой). Я думаю, что какой-то информации не хватает. Определена ли форма Form1 внутри пространства имен? Находятся ли lua_debug и Form1 в одном файле? Какой идет первым? #включает? #прагмы?   -  person dario_ramos    schedule 07.08.2012
comment
Form1 определяется внутри пространства имен, lua_debug и Form1 находятся в файле Form1.h, lua_debug объявляется первым, затем идет Form1 — lua_debug вызывается в новом потоке, созданном нажатием кнопки на Form1.   -  person user1558211    schedule 07.08.2012


Ответы (1)


Попробуйте переместить определение lua_debug ниже определения Form1 или объявить Form1 вперед, как вы сделали для DEBUGDelegateMethod. Я предполагаю, что они оба находятся в одном пространстве имен (lua_debug и Form1). Если нет, в строке 146 вы должны указать пространство имен, например: &YourNamespace::Form1::DEBUGDelegateMethod.

Редактировать: (согласно редактированию OP)

Просто подавлен:

DEBUGDelegate^ myDelegate = gcnew DEBUGDelegate( dynamic_cast<X::Form1^>(Global->FORM ), &Form1::DEBUGDelegateMethod);
person dario_ramos    schedule 07.08.2012
comment
появилась новая ошибка: ошибка C2440: «инициализация»: невозможно преобразовать из «System::Windows::Forms::Form ^» в «X::Form1 ^» - person user1558211; 08.08.2012