Witam,
Mam pytanie - czy można w aplikacji MDI użyć więcej niż jednego rodzaju formularzy MDIChild? Jeśli tak, to jak?
Pozdrowienia,
Ray
Witam,
Mam pytanie - czy można w aplikacji MDI użyć więcej niż jednego rodzaju formularzy MDIChild? Jeśli tak, to jak?
Pozdrowienia,
Ray
Co rozumiesz przez "rodzaj formularza MDIChild" ?
Jak zapewne kolega wie, kiedy tworzy sie aplikacje MDI tworzy sie jeden formularz, ktory bedzie typu mdiChild - czyli ten, ktory bedzie wielokrotnie powielany. Ja natomiast chcialbym zrobic dwa rozne od siebie formularze, obydwa typu mdiChild - moga istniec dwa w jednej aplikacji MDI, ale pojawia sie problem: formularz mdiChild, ktory powstaje jako drugi przyjmuje pewne parametry pierszego mdiChild np. rozmiary. Wlasciwie to pytanie powinno brzmiec - czy mozna kazdy z nich oddzielnie kontrolowac, i jak powinna wygladac instrukcja tworzenia nowego formularza (zaleznie od potrzeby pierwszego lub drugiego) w trakcie dzialania programu?
W pracy, którą piszę praktycznie każdy ChildWindow jest inny. Ale tak jak ja to ładuję to Ci się nie przyda.
Za to możesz zrobić tak:
1) projektujesz dowolną ilość formatek typu MDIChild i w opcjach projektu przenosisz je do prawej kolumny, aby nie były tworzone przy uruchamianiu programu głównego;
2a) tworzysz wybraną formatkę w ten sposób:
TChld01 *fChild; //TChld01 jest nazwą klasy danej formatki
Application->CreateForm(__classid(TChld01), &fChild);
3a) odwołanie do dowolnych parametrów zarówno formatki, jak i komponentów na niej umieszczonych:
fChild->Left = 123;
fChild->Top = 321;
fChild->Edit1->Text = "test";
Pomimo, że ten sposób jest prostrzy i zdecydowanie wygodniejszy, to jednak nie zawsze jest możliwość od razu zdefiniować, jaką będziemy tworzyli formatkę. Dlatego przedstawię drugi sposób - jest on bardziej zagmatwany, no ale piszę (opisy punktów takie same):
2b)
TForm *fChild; //TForm - klasa podstawowa dla każdej formatki
Application->CreateForm(__classid(TForm), &fChild);
3b)
fChild->Left = 123; //to działa, bo Left jest polem klasy TForm
fChild->Top = 321;
fChild->Edit1->Text = "test"; //ale tu już będzie błąd, gdyż Edit1 nie należy do klasy TForm, toteż należy zrobić rzutwanie
((TChld01*)fChild)->Edit1->Text = "test";
Należy jednak pamiętać, iż jeśli zrzutujemy obiekt klasy TForm na TChild02 a odwołamy się jak w przypadku powyższym do obiektu, który jest na TChild01, ale nie ma go na TChild02 to oczywiście będzie błąd.
Mam nadzieję, że to wszystko wyjaśniło. Pisałem z głowy i jeśli gdzieś się walnąłem i coś nie działa - daj znać.
Taak, ogólnie rozumiem. Wlasnie kilka minut temu wpadlem na banalny pomysl:
TForm *NewForm;
NewForm = new TMojFormularzMDIChildTyp1(Application);
new_form->Caption="Nowa forma";
new_form->Show();
Tak szczerze mowiac, w trakcie studiow powiedzialem sobie, ze jako hobby w wolnej chwili bede mial programowanie, a konkretnie - chce napisac sobie gierke w 3d, i wlasnie zaczynam od edytora obiektow :) poczatki sa dosc chaotyczne, ale coz... :)
pozdrowionka,
Ray
Modyfikacja pogladow:
ta prosta metoda, ktora opisalem jest nieprawidlowa. Owszem, mozna utworzyc za pomoca tego kopie wybranego formularza, ale traci sie dostep do komponetow do niego nalezacych.
Kolegi metoda jednak jest gora :)
Pozdrowienia,
Ray
Kolegi metoda jednak jest gora :)
[browar]
Oczywiście chyba nie muszę nadmieniać, że zwalnianie obiektów wygląda tak:
fChild->Free();
lub jeśli fChild była zmienną lokalną przydatną tylko w celu utworzenia formatki, to tak:
MDIChildren[0]->Free();
natomiast zwalnianie wszystkich obiektów jest banalne i sprowadza się do jednej linijki kodu:
while (MDIChildCount) MDIChildren[0]->Free();
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.