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.
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ę.
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ś?
- W klasie drugiej formatki powinno być pole typu pierwszej formatki.
- Konstruktor drugiej formatki powinien przyjmować obiekt typu pierwszej formatki i ustawiać to pole.
- Wówczas, w dowolnej metodzie drugiej formatki będziesz miał przez pole dostęp do obiektu pierwszej formatki i jego metod.
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
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?
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
.
Pytanie na marginesie. Czemu umieściłeś tag C#, skoro piszesz w C++?
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 ==========
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. ;]
Wiem, ale już mi się skończyły pomysły. Wywala błędy w kodzie, który moim zdaniem jest w porządku.
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.
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.
Kiedy się nauczysz, żeby wrzucać kod, który powoduje błędy, a nie tylko ich listę?
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".