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


Автор: 40grad 3.5.2007, 00:49
Доброй ночи. 

Имеется Windows Forms Application.  На форме стоит textBox. В классе Form1 я дописал public-функцию somefunc() , которая должна выводить какой-либо текст на textBox.

И необходимо вызвать функцию somefunc() за переделами класса, т.е., например, из функции main. 

Если написать так:
Form1->testfunc(); - то компилятор ругается на синтаксические ошибки.

Собственно, а как тогда правильно надо вызывать функцию testfunc? 

Автор: archeg 3.5.2007, 01:37
Уже очень часто спрашивали, лучший вариант - поиск или купить книгу по шарпу )

Тут все есть: http://forum.vingrad.ru/topic-52713.html

Автор: adLucem 3.5.2007, 10:12
  • В C# нет оператор ->
  • Для того чтобы осуществлять вызов функции от имени класса необходимо объявить ее как статическую функцию (что в данном случае врядли возможно).
  • Перед тем как вызывать функцию - член класса, необходимо создать объект класса, от имени которого осуществляется вызов.
Пример:
Код

Form1 form = new Form1 ( );
form.testfunc ( );


Автор: 40grad 3.5.2007, 11:17
Но я пишу на C++, а примеры мне попадались, в основном, на шарпе. 

Тут я где-то видел, как на C++ обратиться к форме из другого класса. А мне нужно не из класса, а из другой функции.


Если не трудно, напишите, пожалуйста, как из функции main вызвать testfunc() на C++

Кусок кода из Form1.h
Код

public: System::Void testfunc(void) {
                textBox1->Text = "testfunc works!";
                timer1->Start();
            }



Код

int main(array<System::String ^> ^args)
{
    // Enabling Windows XP visual effects before any controls are created
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 

    // Create the main window and run it
    Application::Run(gcnew Form1());
    




    return 0;
}

Автор: adLucem 3.5.2007, 12:03
Код

#include "stdafx.h"
#include "Form1.h"

using namespace Test;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
    // Enabling Windows XP visual effects before any controls are created
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 

    // Создаем объект формы
    Form1 ^ form = gcnew Form1();

    // Делаем вызов интересующих функций
    form->testfunc ();

    //Запускаем приложение с созданной формой
    Application::Run( form );
    return 0;
}

Автор: 40grad 3.5.2007, 13:21
Cпасибо!

А если не из функции main, а из другой, то как?


Эта функция вызывается в процессе работы приложения, причем нельзя ей передавать других аргументов, кроме этих двух и также нельзя менять тип возвращаемого значения
Код

void stereocallback(IplImage * img1, IplImage * img2) 
        {
            
            System::Drawing::Bitmap^ bmp2 = IplToBitmap(img1);
            //отсюда надо вызвать pictureBoxSetPic(bmp2), которая определена в классе Form1    
            
        }



Автор: adLucem 3.5.2007, 13:30
  • Вариант 1 (предпочтительный): В классе, в котором реализована используется функция stereocallback объявить атрибут Form1 form, инициализировать его при создании экземпляра класса и тогда функция ссможет свободно обращаться к этому атрибуту.

    Код

    void stereocallback ( IplImage *img1, IplImage *img2) {
                
        System::Drawing::Bitmap^ bmp2 = IplToBitmap(img1);
        //form->...    
        }

    private:
        Form1 form;

  • Вариант 2 (сложный): Использовать Singleton [Гамма Э. Шаблоны проектирования] (а лучше Registry [Фаулер М. Шаблоны проектирования корпоративных систем] с областью видимости на уровне потоков)

Автор: 40grad 11.5.2007, 20:52
Дело в том, что функция stereocallback вызывается не из моего кода и не является членом какого-либо класса

cvcamSetProperty(1, CVCAM_STEREO_CALLBACK, stereocallback); - вот в этой строчке я указываю, что функция stereocallback будет вызываться при определенном событии. 

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

Может быть есть еще какое-нибудь решение?

Автор: Exception 12.5.2007, 13:11
Цитата(40grad @  11.5.2007,  21:52 Найти цитируемый пост)
Дело в том, что функция stereocallback вызывается не из моего кода и не является членом какого-либо класса


Простите, как это не является членом класса?

Автор: 40grad 12.5.2007, 20:43
Ну она описана в отдельном файле 

void stereocallback( .... )
{ ..... }

может я и чего перепутал, но по-моему при таком описании она не принадлежит никакому классу


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