Odwołanie się do klas w innym pliku

0

Witam wszystkich,
Chciałbym prosić o pomoc z użyciem formy głównej w pliku z klasą.
Mam plik "ShapeMain.h", jest tam klasa o takiej nazwie jak plik. Mam ten plik includowany w "Form1.h".
W "ShapeMain.h" mam buttona, chciałbym(przepraszam za wyrażenie, nie wiem jak, to nazwać) dodać go do Form1, przy użyciu metody

Form1::Controls::Add()

Jednak co jasne, w pliku "ShapeMain.h" nie jest widoczna Form1. Próbowałem deklaracaji ref class Form1;

 
ale i tak nie widzi Form1 i kompiler mówi, że to nie klasa.
Czuję, że robię jakiś kardynalny błąd, więc jeśli dla kogoś "nie taktem" jest odpowiadać, a chciałby pomóc, to proszę o nakierowanie, poradzę sobie, tylko muszę wiedzieć co wpisać w google. One dużo wiedzą, tylko nie zawsze mnie rozumieją:-)

P.S. Poradziłem sobie, że w klasie "ShapeMain" mam stworzoną metodę "AddToForm", która ma 1 argument typu Form^ i potem w Form1.h po stworzeniu instancji "ShapeMain" przywołuję tę metodę.
Wolałbym jednak mieć dostęp do From1 z "ShapeMain.h", kiedyś przy większym projekcie mogę nie pamiętać, że muszę wykonać jakąś tam metodę, albo pracując w grupie, będę musiał zbyt rozwlekłe instrukcje pisać. Mam nadzieję, że możliwe jest, to o co proszę:-)

Dziękuję serdecznie za każdą pomoc i próbę pomocy.

P.S. Jeśli temat wątku jest "pokraczny", to prosiłbym o zmianę na normalny, nie znam zwrotów formalnych i nie wiem gdzie się tego uczyć:-(
1

Co to za język? C++/CLI?

Nie jestem pewien, ale to chyba kolejna wariacja problemu widzenia okna w innej klasie.

Form1 to klasa a ty chcesz się odwołać co obiektu - czyli potrzebujesz jej instancji.

Spróbuj do konstruktora klasy ShapeMain (albo w jakikolwiek inny sposób do tej klasy) wysyłać obiekt typu Form1, a później się do niego odwoływać.

Żeby uprościć (w C#, bo nie chcę zrobić jakiegoś głupiego błędu a tobie powinno być łatwo przetłumaczyć)

Fragment ShapeMain

Form1 parent;
public ShapeMain(Form1 parent)
{
    this.parent = parent;
}

Tworzenie obiektu w Form1

ShapeMain m = new ShapeMain(this);

i używanie "rodzica" w shapeMain

parent.Controls.Add(...);

Ale to tylko teoria, bo jeśli musisz się odwołać w jakiejś klasie do kontrolek okna to znaczy tylko że masz źle zaprojektowany program

0

Dziękuję. To jest o wiele lepsze od używania dodatkowej metody.

MSM napisał(a)

Co to za język? C++/CLI?
Ale to tylko teoria, bo jeśli musisz się odwołać w jakiejś klasie do kontrolek okna to znaczy tylko że masz źle zaprojektowany program


Forma potrzebna mi tylko aby dodać do niej dynamicznie wygenerowany przycisk.
A gdybym chciał się odwołać do kontrolek Form1 w tej klasie, to jak miałbym, to zrobić? To może się przydać.
Czy poprawnie byłoby zrobić "Form1" jako rodzica "ShapeMain"? O, to chodzi?

A język, to C++/CLI, ale rzadko mam problem z konwersją z C# na C++/CLI, na początku miałem(zapominałem nagminnie o ^, co  C# jest domyślne). Nie piszę tego w jakim języku tworzę, ponieważ zauważyłem, że zazwyczaj nikt tego nie pisze jeśli chodzi o net, ale mam nadzieję, że nie jest, to błędne założenie. Nie jestem prof w .NET i staram się uczyć od innych.
1

Temat założyłeś oczywiście w dobrym dziale, co do języka to chciałem się tylko upewnić.

Przykład wolałem napisać w C# bo bałem się że zrobię jakąś literówkę ;)

A gdybym chciał się odwołać do kontrolek Form1 w tej klasie, to jak miałbym, to zrobić? To może się przydać.?

Nie wiem w sumie jak to przedstawić - chodzi o to (formalnie mówiąc) że widok powinien być jak najbardziej niezależny od logiki. Rozwiązanie typu "ujdzie" to dodanie w Form1 metody powiedzmy

void AddButton(Point position, Point size, string text)
{ /* dodanie do kontrolek przycisku z podanymi parametrami */ }

i zamiast bezpośredniego odwołanie się do Controls.Add() wywołanie tej metody. (Pozwoli to np. mniej boleśnie zmienić kod gdyby się okazało że zamiast buttona potrzebujesz tam czegoś innego)
Niestety nie jestem ekspertem w Inżynierii oprogramowanie więc nie umiem podać lepszych przykładów...

PS. Na przyszłość możesz spróbować poczytać o wzorcach projektowych MVC, MVP, MVVM albo podobnych - są to wzorce służące do właściwej budowy interfejsu. Ostrzegam tylko że niedawno wzięło mnie na napisanie wreszcie porządnej aplikacji przeładowanej wzorcami projektowymi (docelowo ma to być IDE). Zaimplementowanie funkcjonalności mniej-więcej systemowego notatnika zajęło mi prawie 10 godzin (czytania o MVVM, aplikacjach typu Enterprise, data bindingu, pisania połowy kodu od nowa po dojściu do wniosku że nie zgadza się z jakąś zasadą projektowania itd). Aczkolwiek nie należy się zniechęcać ;)

0

Dziękuję za rady i nakierowanie. Poczytam o tych wzorcach, to kolejny program zrobię może na nich, a kod ma być prosty(model Isinga, jakieś do 150 linijek pewnie), więc zrobię to do przesady na klasach i z wykorzystaniem GUI, to może uda mi się zastosować jakiś jakiś wzorzec.
Jeszcze raz dzięki.

P.S. Przydałby się jakiś tutek z inżynierii oprogramowania do GUI w .net, co krok mam dylemat, czy aby nie ośmieszam się pisząc kod:-)

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