MDICHild

0

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

0

Co rozumiesz przez "rodzaj formularza MDIChild" ?

0

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?

0

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ć.

0

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();

  • tez dziala :)

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

0

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

0

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();

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