[ Mr. Rejn @ 31.08.2006. 18:38 ] @
Akcije menija ne mogu da menjaju osobine kontrola na MDI formi? Napravio sam objekat MDI
forme i forma se prikazala. Iz menija glavne forme (koja je roditelj) kod treba da menja naslov jednog
taba na Page kontroli, međutim dolazi do krljanja programa (Access violation...). Zaglavlje MDI forme
je uključeno u jedinicu glavnog prozora.
Mozda neko zna o čemu je reč?
[ X Files @ 01.09.2006. 07:09 ] @
Mozes li da das neki minimalan kod koji oslikava taj slucaj? (Moze i kao Attachment).

Access Vioalation najcesce nastaje kada pokusavas da pristupis nekom objektu
koji nije instanciran.
[ Mr. Rejn @ 01.09.2006. 15:53 ] @
Citat:
X Files: Mozes li da das neki minimalan kod koji oslikava taj slucaj? (Moze i kao Attachment).

Access Vioalation najcesce nastaje kada pokusavas da pristupis nekom objektu
koji nije instanciran.

Evo stavljam...znači MDI prozor se otvara ovako:
Code:

...
#include "Unit3.h" 
...
void __fastcall TForm2::SpeedButton1Click(TObject *Sender)
{

CreateMDIChild("Spisak");

}

void __fastcall TForm2::CreateMDIChild(String Name) //f-ja koja otvara prozor (Form3):
{
    TForm3 *Form3;
    Form3 = new TForm3(Application);
}

i forma se regularno otvara unutar MDI roditeljske forme.
Kada pokušam da delujem na kontrole koje su na toj formi ali preko menija
glavne(roditeljske) forme,npr:
Code:

void __fastcall TForm1::N2Click(TObject *Sender) //N2 je element menija na glavnom prozoru
{
Form3->TabSheet1->Show(); //ovo treba da prikaze tab na Page kontroli koji se yove TabSheet1
}

nastaje Access violation...ovo sam tek sad primetio jer ranije uopšte nisam ni imao potrebe
da delujem na kontrole MDI prozora sa menija glavne (roditeljske) forme,dobro da sam uopšte
uočio problem.
Inače pošto nisam ćorav vidim da program zapravo "ne zna" da je napravljen objekat Form3,iako
se program sastavi bez problema,pa je verovatno tu problem:kako pristupiti osobinama objekta koji
je instanciran iz poznate klase (TForm3)?
[ Mr. Rejn @ 02.09.2006. 14:26 ] @
Naravno da se MDI forma moze pozvati i ovako,npr:
Code:

Application->CreateForm(__classid(TForm3), &Form3);

kasnije se normalno uništava sa Action=caFree
i nisam uočio neke probleme,ali možda neko sa iskustvom
u ovome može da mi kaže da li bezbedno pozivati formu na ovaj način?
[ X Files @ 02.09.2006. 20:28 ] @
Onako 'odokativno':

Citat:

...
#include "Unit3.h"
...
void __fastcall TForm2::SpeedButton1Click(TObject *Sender)
{
CreateMDIChild("Spisak");
}

void __fastcall TForm2::CreateMDIChild(String Name) //f-ja koja otvara prozor (Form3):
{
TForm3 *Form3; // <--- Zasto ce ti ovo ovde? To bi trebalo da bude u CPP delu Form3 kao global...
...a da ne pominjemo da nakon izlaska iz funkcije taj Form3 pointer nije vise validan

Form3 = new TForm3(Application);
}


Citat:

void __fastcall TForm1::N2Click(TObject *Sender) //N2 je element menija na glavnom prozoru
{
Form3->TabSheet1->Show(); //ovo treba da prikaze tab na Page kontroli koji se yove TabSheet1
ovaj Show() se ne odnosi na Form3 koji ti je u CreateMDIChild(), nego onaj default
}


Sve u svemu, mislim da u kodu imas DVA Form3.

Preporucujem da pogledas jednostavan primer /examples/ rada sa MDI:
C:\Program Files\Borland\CBuilder6\Examples\Doc\TextEdit\


[ Mr. Rejn @ 04.09.2006. 12:03 ] @
X Files,reci mi sta misliš o ovome, da li je bezbedno za upotrebu:
Code:

Application->CreateForm(__classid(TForm3), &Form3);

[ X Files @ 04.09.2006. 14:51 ] @
Najbolje je da takav stil ostane samo u WinMain(), jer ima uticaja na IDE
koji ga sam i generise tamo, ali kada tebi licno treba kreiranje najbolje je
da radis kako si i radio:

Form3 = new TForm3( this );

Jedino ti preostaje da odlucis da li ce tvoja forma (njen objekat) biti kreirana
odmah, ili ces je sam kreirati.

A to ti je ono u Project / Options / Forms / [Auto-Create i Available]