Używanie funkcji z formy głównej

0

Witam,
Mam pytanie odnośnie korzystania z zadeklarowanych funkcji publicznych. Otóż w formie głównej o nazwie Form1 mam zadeklarowaną funkcję publiczną, z której chciałbym skorzystać w formie drugiej o nazwie "dod". W jaki sposób mogę ją wywołać? Dokładnie chodzi mi o to ,aby po kliknięciu w button formy podrzędnej, została uruchomiona funkcja z formy głównej. Proszę o jakiekolwiek sugestie.

0

A co ta funkcja robi? Może jednak powinna być w innej klasie? A jeśli chcesz, żeby wciąż była w Form1, to przekaż do dod instancję Form1 i na niej wywołaj metodę.

0

Funkcja dodaje nowy rekord w bazie danych poprzez text boxy i button. Chodzi o to, że mam dwie utworzone Formy. Jedna wygenerowana automatycznie podczas tworzenia nowego projektu, a drugą dodałem poprzez Project->Add new item ->Nowa forma. Funkcja ta jest zadeklarowana w formie głównej, a potrzebuje z niej skorzystać w drugiej również.

Jak w praktyce zrobić to co powiedziałeś?

0
  1. W klasie drugiej formatki powinno być pole typu pierwszej formatki.
  2. Konstruktor drugiej formatki powinien przyjmować obiekt typu pierwszej formatki i ustawiać to pole.
  3. Wówczas, w dowolnej metodzie drugiej formatki będziesz miał przez pole dostęp do obiektu pierwszej formatki i jego metod.
0

Konstruktor formy Dod zmień aby przyjmował referencję do Form1 (nadrzędnej), czyli w kodzie Dod:

private Form1 formaNadrzedna;
public Dod(Form1 form)
{
     formaNadrzedna = form;
}

public void button1_Click(object sender, EventArgs e)
{
      formaNadrzedna.TwojaMetodaZFormyNadrzednej();
}
 

I wtedy we formie nadrzednej tworzysz formę Dod następująco:

 
Dod dod = new Dod(this);
dod.Show();

Pozdrawiam
Łukasz Gawron

Edit:
somekind podał chyba wystarczająco jasno co trzeba zrobić, ale już się naprodukowałem, więc zostawiam swoje wypociny :p

0

Przepraszam, że odgrzewam starszy temat. Wróciłem do tego i niestety nie działa. Wywala trochę błędów tj.


1>------ Build started: Project: Inw, Configuration: Debug Win32 ------
1>Compiling...
1>Inw.cpp
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(194) : error C2039: 'dodaj' : is not a member of 'System::Windows::Forms::Form'
1>        c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : see declaration of 'System::Windows::Forms::Form'
1>dod.cpp
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(194) : error C2039: 'dodaj' : is not a member of 'System::Windows::Forms::Form'
1>        c:\windows\microsoft.net\framework\v2.0.50727\system.windows.forms.dll : see declaration of 'System::Windows::Forms::Form'
1>Generating Code...
1>Build log was saved at "file://c:\Users\Administrator\Desktop\Projekty C++\Inw\Inw\Debug\BuildLog.htm"
1>Inw - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


 

sugestie?

0

Próbujesz wywołać metodę dodaj na obiekcie klasy Form, a nie na obiekcie Twojej klasy, która ją rzeczywiście posiada. W momencie wywołania jakisobiekt.dodaj(), jakisobiekt powinien być zadeklarowany jako obiekt typu formatki głównej, a nie po prostu Form.

1

Pytanie na marginesie. Czemu umieściłeś tag C#, skoro piszesz w C++?

0

Rzeczywiście źle się odniosłem z nazwą, ale używając prawidłowej wywala:


1>------ Build started: Project: Inw, Configuration: Debug Win32 ------
1>Compiling...
1>Inw.cpp
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(25) : error C2143: syntax error : missing ';' before '^'
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(25) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(25) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(27) : error C2061: syntax error : identifier 'Form1'
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(31) : error C2065: 'formaNadrzedna' : undeclared identifier
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(31) : error C2065: 'forma' : undeclared identifier
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(194) : error C2065: 'formaNadrzedna' : undeclared identifier
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(194) : error C2227: left of '->dodaj' must point to class/struct/union/generic type
1>        type is ''unknown-type''
1>c:\users\administrator\desktop\projekty c++\inw\inw\Form1.h(493) : error C3673: 'Inw::dod' : class does not have a copy-constructor
1>dod.cpp
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(25) : error C2143: syntax error : missing ';' before '^'
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(25) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(25) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(27) : error C2061: syntax error : identifier 'Form1'
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(31) : error C2065: 'formaNadrzedna' : undeclared identifier
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(31) : error C2065: 'forma' : undeclared identifier
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(194) : error C2065: 'formaNadrzedna' : undeclared identifier
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(194) : error C2227: left of '->dodaj' must point to class/struct/union/generic type
1>        type is ''unknown-type''
1>c:\users\administrator\desktop\projekty c++\inw\inw\Form1.h(493) : error C3673: 'Inw::dod' : class does not have a copy-constructor
1>Generating Code...
1>Build log was saved at "file://c:\Users\Administrator\Desktop\Projekty C++\Inw\Inw\Debug\BuildLog.htm"
1>Inw - 18 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


 
0

Dostałeś listę błędów, więc je sobie popraw. Chyba nie sądzisz, że my to zrobimy nie mając nawet kodu, Bystrzaku. ;]

0

Wiem, ale już mi się skończyły pomysły. Wywala błędy w kodzie, który moim zdaniem jest w porządku.

0

Kompilator się nie myli. Tam są Twoje błędy. Być może wszystko przez głupi brak jednego średnika, o czym mówi pierwszy błąd.

0

Zdecydowałem, że spróbuję z singletonem.

Tak, więc klasa Form1 wygląda teraz tak:

public ref class Form1 : public System::Windows::Forms::Form
        {
        private: static Form1^ _instance = gcnew Form1();
        private: Form1(void)
                {
                        InitializeComponent();
                        //
                        //TODO: Add the constructor code here
                        //
                }
        public: static property Form1^ Instance
                        {
                                Form1^ get()
                                {
                                        return _instance;
                                }
                        }
...

W drugiej podrzędnej formatce próbuję się odwołać do metody z Form1 w następujący sposób:

 
Form1::Instance->dodaj();

Niestety nie daje to rezultatu i wyskakuje następujący błąd:

1>------ Build started: Project: Inw, Configuration: Debug Win32 ------
1>Compiling...
1>stdafx.cpp
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(192) : error C2653: 'Form1' : is not a class or namespace name
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(192) : error C2065: 'Instance' : undeclared identifier
1>c:\users\administrator\desktop\projekty c++\inw\inw\dod.h(192) : error C2227: left of '->dodaj' must point to class/struct/union/generic type
1>        type is ''unknown-type''
1>Build log was saved at "file://c:\Users\Administrator\Desktop\Projekty C++\Inw\Inw\Debug\BuildLog.htm"
1>Inw - 3 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Czego mi jeszcze brakuje, aby poprawnie to zadziałało? Widzę, że dalej nie traktuje Form1 jako klasy, która byłaby w formatce potomnej.

0

Kiedy się nauczysz, żeby wrzucać kod, który powoduje błędy, a nie tylko ich listę?

0

Jest zawarty.

Dokładnie to powoduje błąd:

Form1::Instance->dodaj();

Metoda ta pochodzi z formy głównej "Form1", a próbuje ją wywołać w formie potomnej "dod".

1 użytkowników online, w tym zalogowanych: 0, gości: 1