C++ Builder. Idea

0

Witam,

w projektach utworzonych w C++ Builderze gdy kladziemy kontrolki jest generowana klasa, przykladowo:

class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TMemo *Memo1;
        TMemo *Memo2;
        TButton *Button1;
        void __fastcall Memo1Change(TObject *Sender);
        void __fastcall Memo2Change(TObject *Sender);
private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};

Patrzac w plikach projektu nie widze zeby gdziekolwiek byly tworzone obiekty TMemo i TButton. Wie ktos jak to jest tworzone?

Dalej.
Funkcja Memo1Change. Domyslam sie ze jest wywolywana wewnatrz metody Change() klasy TMemo. Tylko skad wiadomo wewnatrz tej klasy ze tzreba wywolac Memo1Change() albo Memo2Change (bo to przeciez ta sama klasa dla obu obiektow)?

Moze jakis przyklad jakbyscie to zaimplementowali na miejscu tworcow Buildera?:)

0

Heh, z cppb nie miałem do czynienia od lat, ale radziłbym zaglądnąć do pliku(ów) *.dfm /chyba takie rozszerzenie było/. Z nich powstaje sekcja rcdata w zasobach. Powinno być coś takiego:
object MainForm: TMainForm
...
OnCreate = FormCreate

W skompilowanych execach jest zapsane info RTTI, a coż to, gdzieś na forum chyba już o tym było. Cała idea polega na tym,że mamy w zasobach info o metodach. Z zasobów pobierane są nazwy metod/przy tworzeniu okna/, następnie z RTTI odczytywany jest adres procedury obsługi. Tak to działa... A co do tworzenia obiektów, to za to odpowiada silnik VCL/nota bene znacznie ułatwia to programowanie i 'bardzo znacznie' spowalnia program.../.
Jeśli chcesz wiedzieć coś jeszcze to pisz, RTTI do bardzo rozległy temat.

0

faktycznie w plikach *.dfm jest informacja o metodach, teraz jasne.

Tak sie sklada ze programuje wykorzystujac tylko win32 api, a wiec pisze wlasne klasy do obslugi kontrolek. Moj problem jest taki ze nie wiem jak to wszystko w miare optymalnie polaczyc np. chcialbym utworzyc okno z kontrolka edit i button.
Mam klasy podstawowe CWindow, CButton i CEdit, przy czym CButton i CEdit wywodza sie z CWindow, wiec pisze:

class CMyWindow ;

class CMyButton : public CButton
{
  public:
    CMyWindow* owner ;
    void Click() ; // Click jest virtualna w CButton
} ;

class CMyEdit : public CEdit
{
  public:
    CMyWindow* owner ;
    void Change() ; // Change jest virtualna w CEdit
} ;

class CMyWindow : public CWindow
{
  public:
    CMyButton* button ;
    CMyEdit* edit ;
} ;

// implementacja klasy CMyWindow

CMyWindow::CMyWindow()
{
  // tworzymy kontrolki
  // kontrolki maja wlasciwosc 
  // CMyWindow* owner ktora jest inicjowana w konstruktorze
  // pierwszy parametr kontruktora to owner :)
  button = new CMyButton(this, 2,3,45,55) ;
  edit = new CMyEdit(this, 2,5,56,56) ;
}


// CMyButton
void CMyButton::Click()
{
  // powiedzmy ze po nacisnieciu przycisku chcialbym wpisac tekst w CMyEdit
  wnd->edit->SetText("tralalala") ;
}

// CMyEdit

void CMyEdit::Change()
{
  // tutaj np zmieniamy tekst na przycisku
  wnd->button->SetText("aha") ;
}

// koniec :)

Nie wpisywalem w klasach kontruktorow czy metod SetText zeby wszystko bylo czytelniejsze. Chodzi mi o sama idee tego jak to wszystko polaczyc :)
Jak to mozna lepiej zrobic?

1 użytkowników online, w tym zalogowanych: 0, gości: 1