 |
Przesyłanie zmiennych między formularzami
|

|
extern,bez,jak,przesyłać,dane,formularze,builder,cppbuilder
Często pisząc programy w C++ Builderze zastanawiałem się, jak przesyłać zmienne pomiędzy dwoma różnymi formularzami. Do pewnego momentu posługiwałem się rozwiązaniem, które polegało na deklarowaniu zmiennej w pierwszym formularzu jako globalną, a w drugim ponownie deklarowaną, z tą że różnicą, iż tym razem ze słówkiem extern (tak zresztą nauczyła mnie książka, która dała mi podstawy w tej dziedzinie), które informowało kompilator, że zmienna znajduje się gdzieś poza plikiem. Oczywiście wtedy do drugiego formularza należało dołączyć plik nagłówkowy pierwszego. To rozwiązanie miało kilka swoich minusów i było raczej niewygodne. Przy kilku formularzach można było pogubić się która zmienna należała do którego.
Może to brzmi jak to tej pory trochę zawile, ale postaram się przedstawić to w sposób jaśniejszy.
Otóż jak wszyscy wiemy (a jak nie wiemy to powinniśmy!), formularz w C++ Builderze to obiekt. Jak większość obiektów w C++ ma swoje właściwości, takie jak np. wysokość, szerokość i nazwa. Znaczna część właściwości to zwykłe wartości typu int , czy char. No a czym są nasze zmienne które chcemy przekazywać? Również wartościami typu int czy char, choć mogą to i być obiekty klasy AnsiString. Przechodzimy więc do setna sprawy. Aby móc sprawnie korzystać ze zmiennych jednego formularza w drugim, wystarczy zadeklarować je w sekcji public formularza. W tym celu otwieramy plik nagłówka pierwszego formularza (rozszerzenie .h) - np. klikając prawym klawiszem na kodzie źródłowym pliku CPP i z menu kontekstowego wybierając "Open Source / Header File" i odnajdujemy w nim sekcję public: . Po niej dopisujemy np.
 |
|
 |
int rower;
int koza;
AnsiString radiowoz;
|
 |
|
|
|
Przykładowy wygląd pliku unit1.h:
 |
|
 |
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
int rower;
int koza;
AnsiString radiowoz;
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
|
 |
|
|
|
Pamiętaj, aby nie definiować zmiennych (nie przypisywać im wartości) w tym miejscu, ponieważ kompilator uzna to za błąd. Możesz je zdefiniować w konstruktorze formularza (funkcji, znajdującej się w pliku .cpp, która nazywa się tak jak klasa tworzonego obiektu, czyli np. TForm). Po zadeklarowaniu zmiennych w formularzu w którym to zrobiliśmy, możemy odwoływać się do nich jak do zwykłych zmiennych globalnych.
Przykład definicji zmiennych w pliku Unit1.cpp wcześniej zadeklarowanych w pliku Unit1.h:
 |
|
 |
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
rower = 1;
koza = 2;
radiowoz = "Policja";
}
//---------------------------------------------------------------------------;
|
 |
|
|
|
Jeżeli teraz chcemy odczytać/zapisać coś z/do zmiennej zdefiniowanej ,załóżmy, w formularzu o nazwie Form1, odnosimy się do nich w taki sposób:
Form1->nazwa_zmiennej
czyli np.:
Trzeba jednak pamiętać, aby w formularzu w którym odnosimy się do zmiennej z Form1 załączyć plik nagłówkowy tego formularza (Form1). Bez tego kompilator zaprotestuje.
Przykład użycia w formularzu drugim zmiennych z formularza pierwszego:
 |
|
 |
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void TForm2::JakasFunkcja
{
Form1->rower = 5;
Form1->koza = 2;
Form1->radiowoz = "Straż";
}
|
 |
|
|
|
Mam nadzieję że przedstawiony tu sposób korzystania ze zmiennych z jednego formularza w innym przyda się początkującym programistom piszącym w C++ Builderze (choć ten już powoli odchodzi :-( ). Jednak w Delphi, XBuilderze i w każdym innym środowisku obiektowym to rozwiązanie też powinno działać.
extern,bez,jak,przesyłać,dane,formularze,builder,cppbuilder
|
 |
|