CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Dynamiczne formy a odwołanie się do komponetów

Dynamiczne formy a odwołanie się do komponetów

dział ogólny

Dynamiczne formy a odwołanie się do komponetów

Nowy postprzez piotr.kwlk » środa, 11 czerwca 2014, 13:29

Witam
Mam problem polegający na odwołaniu się do komponentu BDE. Tworze dynamicznie Form2 na którym jest wspomniany komponent BDE. Następnie tworze kolejny formularz dynamicznie Form3 z przicisku utworzonym na Form2. Gdy w Form3 odwołuje się do komponentu BDE znajdującym się na Form2 program generuje błąd.
KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TForm2 *Form2 = new TForm2(this);
    Form2->ShowModal();
    Form2->Free();
}

KOD cpp:     UKRYJ  
void __fastcall TForm2 ::Button1Click(TObject *Sender)
{
    TForm3 *Form3 = new TForm3(this);
    Form3->ShowModal();
    Form3->Free();
}

KOD cpp:     UKRYJ  
void __fastcall TForm3::FormShow(TObject *Sender)
{
    if(Form2->Table1->State == dsInsert){
        Button1->Enabled  = true;
        Button2->Enabled  = false;
    }
    else{
        Button1->Enabled  = false;
        Button2->Enabled  = true;
    }
}


pomóżcie.
Piotr
Avatar użytkownika
piotr.kwlk
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): środa, 9 marca 2011, 17:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: Builder 6
Gadu Gadu: 0
    Windows 7Chrome

Re: Dynamiczne formy a odwołanie się do komponetów

Nowy postprzez Mironas » środa, 11 czerwca 2014, 13:47

A jaki błąd?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Dynamiczne formy a odwołanie się do komponetów

Nowy postprzez Cyfrowy Baron » środa, 11 czerwca 2014, 23:36

Czy w Unit3.cpp (Form3) dodałeś w sekcji include: #include "Unite2.h" gdzie Unit2 -> Form2?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Dynamiczne formy a odwołanie się do komponetów

Nowy postprzez piotr.kwlk » czwartek, 12 czerwca 2014, 09:54

Zapomniałem dodać ze mam BCB 6 zainstalowanym na win 7 Pro. Mam #include "Unite2.h".
A błędy jakie mi wyrzuca to:

Project Program.exe raised exception class EAccessViolation with message 'Access violation address 004106A7 in module 'Program.exe'. Read of adress 000002F4'. Process stopped. Use or Run to continue.


Czyli naruszone są zasady dostępu do modułu. Wcześniej nie miałem tworzonych dynamicznie formularzy i działało ok. teraz jeśli odwołam się z Form2 do Form1, gdzie Form1 nie jest dynamicznie tworzona, a Form2 tak to działa. Jednak gdy z Form3 do Form2 to już nie działa. Napisze jeszcze, że w czasie kompilacji nie wyrzuca błędu dopiero po uruchomieniu programu, gdy chcę się odwołać do komponentu ten błąd wyrzuca.
Piotr
Avatar użytkownika
piotr.kwlk
Bladawiec
Bladawiec
 
Posty: 25
Dołączył(a): środa, 9 marca 2011, 17:34
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: Builder 6
Gadu Gadu: 0
    Windows 7Chrome

Re: Dynamiczne formy a odwołanie się do komponetów

Nowy postprzez Mironas » czwartek, 12 czerwca 2014, 11:29

1. Przenieś #include "Unit2.h" z Unit3.cpp do Unit3.h

2. W Unit3.h w sekcji public:
Kod: Zaznacz cały
public:
  TForm2* pForm2;

* W Unit3.cpp:
Kod: Zaznacz cały
void __fastcall TForm3::Button2Click(TObject *Sender)
{
  if ( pForm2 )
    pForm2->Button1->Enabled = !pForm2->Button1->Enabled;  // tutaj operacje na Form2
  else
    Beep();
}


3. Na formie2 (w Unit2.cpp):
Kod: Zaznacz cały
void __fastcall TForm2::Button1Click(TObject *Sender)
{
  TForm3 *Form3 = new TForm3(this);
  Form3->pForm2 = this;  // <- to musisz dodać
  Form3->ShowModal();
  Form3->Free();
}
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Dynamiczne formy a odwołanie się do komponetów

Nowy postprzez Cyfrowy Baron » czwartek, 12 czerwca 2014, 11:36

Tworzysz Form3 jako okno Modalne. Wywołując okno Form3 modalnie z Form2 blokujesz dostęp do Form2 dopóki okno Form3 nie zostanie zamknięte. Można się odwoływać do niektórych metod zablokowanego okna, ale nie do obiektów na tym oknie.

Kolejna sprawa. Jeśli tworzysz dynamicznie jakikolwiek obiekt wewnątrz jakiegokolwiek zdarzenia i umieszczasz w tym zdarzaniu zarówno deklarację jak i definicje tegoż obiektu, to poza tym zdarzeniem obiekt nie jest dostępny. Pół biedy jeśli go niszczysz w tym zdarzeniu jak tutaj, gorzej gdybyś go nie zniszczył, miałbyś wyciek pamięci, bo po zakończeniu zdarzenie obiekt wciąż by istniał, ale aplikacja nie miałaby już do niego dostępu. Rozumiesz o czym pisze?




Kod: Zaznacz cały
void __fastcall TForm3::FormShow(TObject *Sender)
{
    if(Form2->Table1->State == dsInsert){
        Button1->Enabled  = true;
        Button2->Enabled  = false;
    }
    else{
        Button1->Enabled  = false;
        Button2->Enabled  = true;
    }
}


To są jak rozumiem Button'y na Form3 (Mironas mi trochę namieszał) bo nie widzę by były adresowane na Form2? Z Form3 w tym kodzie odwołujesz się tylko do Table1 na Form2?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 8 gości

cron