Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Проблема с BeginInvoke (C++)


Автор: beyond11 17.5.2009, 18:18
Код

private: __delegate void VivodOnlineHandler();
private: void VivodOnline()
        {
            if (this->InvokeRequired)
            {
                this->BeginInvoke(new VivodOnlineHandler, ?????????????????????????);
            }

            System::Windows::Forms::TreeNode* nod[] = new System::Windows::Forms::TreeNode*[3];
            nod[0] = new System::Windows::Forms::TreeNode(S"name1");
            nod[1] = new System::Windows::Forms::TreeNode(S"name2");
            nod[2] = new System::Windows::Forms::TreeNode(S"name3");
            treeView1->Nodes->AddRange(nod);
        }


Язык - С++ (Visual Studio 2003)
Помогите пожалуйста - что написать вместо вопросительных знаков, чтобы заработало??? 
Написано, типа System::Object__gc* __gc[]

Нубский вопрос наверно, но всё же, вообще не пойму, как туда что-то правильно вписать ((

Автор: beyond11 17.5.2009, 18:43
Код

    private: __delegate void VivodOnlineHandler();
    private: void VivodOnline()
        {
             Object __gc* temp1 __gc[];
            if (this->InvokeRequired)
            {
                this->BeginInvoke(new VivodOnlineHandler, new temp1 {} );
            }
            System::Windows::Forms::TreeNode* nod[] = new System::Windows::Forms::TreeNode*[3];
            nod[0] = new System::Windows::Forms::TreeNode(S"name1");
            nod[1] = new System::Windows::Forms::TreeNode(S"name2");
            nod[2] = new System::Windows::Forms::TreeNode(S"name3");
            treeView1->Nodes->AddRange(nod);
        }


Если пишу так, вылазит какая-то странная ошибка:

 error C2958: the left parenthesis '(' found at 'c:\documents and settings\

Помогите ((((

Автор: beyond11 17.5.2009, 21:22
ну блин народ (( неужели никто не знает ((

Автор: Partizan 17.5.2009, 22:45
beyond11, конструктор делегата принимает метод

Автор: beyond11 18.5.2009, 00:27
Спасибо за помощь. Извиняюсь. Не могли бы вы привести пример (или, может, исправить этот код), как именно правильно мне туда написать? Я в этих понятиях (конструкторы-деструкторы-методы-делегаты-и-много-других-страшных-слов) очень сильно путаюсь. Иными словами, я ничё не понял  smile 
В теории не силён (

Автор: Partizan 18.5.2009, 12:33
beyond11, вот пример из MSDN:


Код

private:
   delegate void MyDelegate(
   Label^ myControl, String^ myArg2 );
   void Button_Click( Object^ /*sender*/, EventArgs^ /*e*/ )
   {
      array<Object^>^myArray = gcnew array<Object^>(2);
      myArray[ 0 ] = gcnew Label;
      myArray[ 1 ] = "Enter a Value";
      myTextBox->BeginInvoke( gcnew MyDelegate( this, &MyForm::DelegateMethod ), myArray );
   }

   void DelegateMethod( Label^ myControl, String^ myCaption )
   {
      myControl->Location = Point(16,16);
      myControl->Size = System::Drawing::Size( 80, 25 );
      myControl->Text = myCaption;
      this->Controls->Add( myControl );
   }

   delegate void InvokeDelegate();

Автор: beyond11 19.5.2009, 20:48
Помогите! Изменил немного текст, скомпилировать получилось!
Код

String* text11;
    private: __delegate void VivodOnlineHandler();
    private: void VivodOnline()
        {
            Object* temp0 [] = {text11};
            if (this->InvokeRequired)
                this->Invoke(new VivodOnlineHandler(this,&Form1::Vivod1),temp0);
            else Vivod1();
        }

    private: void Vivod1()
             {
                System::Windows::Forms::TreeNode* nod[] = new System::Windows::Forms::TreeNode*[1];
                nod[0] = new System::Windows::Forms::TreeNode(S"name1");
                nod[1] = new System::Windows::Forms::TreeNode(S"name2");
                nod[2] = new System::Windows::Forms::TreeNode(S"name3");
                treeView1->Nodes->AddRange(nod);
             }


Но при выполнении этого текста вылазит ошибка:

An unhandled exception of type 'System.Reflection.TargetParameterCountException' occurred in system.windows.forms.dll

Additional information: Parameter count mismatch.


После ошибки программа работает нормально, но в treeView1 ничего не меняется(((
Что делать??? Где неправильно я написал??
Ничерта в этих Invoke не пойму, хотя кучу примеров пересмотрел...

Автор: Partizan 19.5.2009, 20:51
beyond11, у вас делегат описывает метод, который не принимает параметров....в то же время при Invoke, Вы передаёте параметр temp0...

Автор: beyond11 19.5.2009, 20:56
Спасибо!!! Спасибо Спасибо Спасибо Спасибо Спасибо Спасибо Спасибо!!!!!!!
Моей благодарности нет предела!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)