CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Przekazywanie danych przez zmienną globalną
Strona 1 z 1

Przekazywanie danych przez zmienną globalną

Nowy postNapisane: poniedziałek, 19 grudnia 2016, 19:04
przez PL_Andrev
Witam,

Zadanie polega na tym aby Form2 miała zadeklarowane dane w zależności od parametrów wprowadzonych przez Form1.
W moim przypadku opcja wybrana w ComboBox(Form1) powinna się wyświetlać jako opis CheckBoxa(Form02).

Niestety nie mogę zrobić tego metodą Form2->ChceckButton1->Caption = ComboBox1->Items->Strings[ComboBox1->ItemIndex];
bo wyskakuje mi access violation

Project ... raised exception class EAccessViolation with message 'Access violation at address 00402722 in module '...'. Read of address 00000334'. Process stopped. Use Step or Run to continue.


(Co ciekawe, na "testowym" projekcie poniżej takie rozwiązanie działa - być może błąd jest spowodowany tym, że chwilę wcześniej jast ładowany XML do pamięci poprzez TinyXML).
Do rozwiązania problemu użyłem więc zmiennej globalnej, która "niesie" informacje o wybranej opcji.

Kod wygląda tak:
KOD cpp:     UKRYJ  
AnsiString niesie;

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    AnsiString a = "Alfa"; AnsiString b = "Bravo"; AnsiString c = "Charlie";
    ComboBox1->Items->Add(a); ComboBox1->Items->Add(b); ComboBox1->Items->Add(c);

    ComboBox1->ItemIndex = 0;   //wartosc na start
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    niesie = ComboBox1->Items->Strings[ComboBox1->ItemIndex];
    ShowMessage("Unit1 = " + niesie);
    Form1->Hide();
    Form2->Show();
}

KOD cpp:     UKRYJ  
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
    extern AnsiString niesie;
    ShowMessage("Unit2 = " + niesie);
    CheckBox1->Caption = niesie;
}
Już pal licho że kod nie działa - ale nie mogę zrozumieć dlaczego jako pierwszy jest wywoływany ShowMessage dla Unitu2 ?

Re: Przekazywanie danych przez zmienną globalną

Nowy postNapisane: wtorek, 20 grudnia 2016, 10:31
przez Cyfrowy Baron
Tutaj masz to opisane: Przekazywanie obiektów i funkcji pomiędzy formularzami.

A to extern AnsiString niesie; - to błąd.

Re: Przekazywanie danych przez zmienną globalną

Nowy postNapisane: wtorek, 20 grudnia 2016, 11:36
przez polymorphism
To nie jest błąd, tylko powinien tę deklarację przenieść poza ciało konstruktora.


Z kolei w Twoim tekście jest błąd, ponieważ do unit2.cpp załączasz plik unit1.cpp tylko po to, żeby widzieć globalną zmienną x. Tego nie robi się w ten sposób! Opcja z extern jest jedyną poprawną (vide definicje wskaźników Form1 i Form2 i ich deklaracje extern w plikach nagłówkowych).

Re: Przekazywanie danych przez zmienną globalną

Nowy postNapisane: wtorek, 20 grudnia 2016, 21:16
przez PL_Andrev
PL_Andrev napisał(a):Już pal licho że kod nie działa - ale nie mogę zrozumieć dlaczego jako pierwszy jest wywoływany ShowMessage dla Unitu2 ?

Przyczyną w/w było umieszczenie wywołania zdarzenia w konstruktorze (?) formatki.
Po przeniesieniu do
KOD cpp:     UKRYJ  
__fastcall TForm2::FormActivate(TObject *Sender)
kolejność wyświetlania powiadomień była poprawna.

Jaką rolę pełni zatem
KOD cpp:     UKRYJ  
__fastcall TForm2::TForm1(TComponent* Owner)
        : TForm(Owner)
Pytam aby wiedzieć kiedy mogę a kiedy nie mogę umieszczać kodu w konstruktorze (?) formy.

Re: Przekazywanie danych przez zmienną globalną

Nowy postNapisane: wtorek, 20 grudnia 2016, 21:29
przez polymorphism
Konstruktor, jak sama nazwa wskazuje, służy do konstruowania (tworzenia) obiektu. Tutaj powinien znaleźć się kod, który przypisuje wartości polom klasy, inicjuje obiekt. Błąd polegał na tym, że w ciele konstruktora próbowałeś używać obiektu tak, jakby był w pełni stworzony. Na ogół nic się nie dzieje w takich przypadkach, ale przy większych frameworkach, gdzie są różne zależności, nie wszystko z poziomu konstruktora może działać (np. nie powinno się wywoływać metod wirtualnych).