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

Przekazywanie danych przez zmienną globalną

dział ogólny

Przekazywanie danych przez zmienną globalną

Nowy postprzez PL_Andrev » poniedziałek, 19 grudnia 2016, 19:04

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 ?
Avatar użytkownika
PL_Andrev
Bladawiec
Bladawiec
 
Posty: 6
Dołączył(a): czwartek, 15 grudnia 2016, 21:46
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Win.10
Kompilator: Builder 6
Gadu Gadu: 0
    WindowsChrome

Re: Przekazywanie danych przez zmienną globalną

Nowy postprzez Cyfrowy Baron » wtorek, 20 grudnia 2016, 10:31

Tutaj masz to opisane: Przekazywanie obiektów i funkcji pomiędzy formularzami.

A to extern AnsiString niesie; - to błąd.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
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: Przekazywanie danych przez zmienną globalną

Nowy postprzez polymorphism » wtorek, 20 grudnia 2016, 11:36

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).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: Przekazywanie danych przez zmienną globalną

Nowy postprzez PL_Andrev » wtorek, 20 grudnia 2016, 21:16

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.
Avatar użytkownika
PL_Andrev
Bladawiec
Bladawiec
 
Posty: 6
Dołączył(a): czwartek, 15 grudnia 2016, 21:46
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Win.10
Kompilator: Builder 6
Gadu Gadu: 0
    WindowsChrome

Re: Przekazywanie danych przez zmienną globalną

Nowy postprzez polymorphism » wtorek, 20 grudnia 2016, 21:29

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).
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
PL_Andrev
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

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 45 gości

cron