Answer the question
In order to leave comments, you need to log in
How to explain a piece of C++ code?
How to explain a piece of C++ code?
File 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
TLabel *Label1;
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcallTForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
this->Close();
}
//---------------------------------------------------------------------------
Answer the question
In order to leave comments, you need to log in
All this code (with the exception of Close) is auto-generated.
///// Защита от повторного включения
#ifndef Unit1H
#define Unit1H
///// Хедеры VCL. Причём всё это сделано так, чтобы упростить написание ценой удлинения
///// компиляции. Более громоздкий, но и более удачный вариант.
///// В H:
///// namespace Controls { class TLabel; }
///// using namespace Controls;
///// В CPP:
///// #include <Controls.hpp>
///// Вот таким образом можно (было) избавиться от каскадного подключения
///// хедера Controls. А то каждый, кто использует главной форму,
///// автоматически подключает эти хедеры.
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
///// Только от Forms.hpp избавиться таким макаром нельзя:
///// мы наследуемся от TForm.
#include <Forms.hpp>
///// Класс формы. Все формы наследуются от TForm.
class TForm1 : public TForm
{
///// Особое право доступа Borland, для совместимости с Delphi.
///// Поля и свойства published не просто public, но включаются
///// в структуру рефлексии (aka reflection или introspection)
///// и программа о них знает при выполнении.
///// Применительно к формам — published-поля доступны
///// загрузчику.
__published: // IDE-managed Components
///// Компоненты, которые мы установили на форме редактором.
TLabel *Label1;
TButton *Button1;
///// События, которые мы прописали в редакторе.
///// __fastcall — модель вызова, аналогичная Delphi.
///// Именно такая модель вызова принята в обработчиках
///// событий.
void __fastcall Button1Click(TObject *Sender);
///// Пользователь пока не прописал никаких своих
///// полей и функций.
private: // User declarations
public: // User declarations
///// Конструктор. Раз уж у формы нетривиальный конструктор —
///// по правилам Си++ его надо повторить в подклассе.
///// Снова-таки, модель вызова __fastcall: в формах Delphi
///// используются т.н. виртуальные конструкторы,
///// когда по имени класса можно создать объект этого класса.
///// Фабричный метод, только немного лучше.
///// Но это значит: у всех подчинённых классов
///// должен быть один и тот же набор параметров
///// и модель вызова.
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
///// Как известно, переменная объявляется один раз.
///// Поскольку хедер может подключаться к огромному числу CPP,
///// её объявляют как extern (она есть, но в другом месте).
///// Макрос PACKAGE раскрывается в __declspec(package),
///// чтобы эту штуку можно было собрать как пакет.
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question