Шаблоны форм, создание и применение (исходники)

Источник: Reacoding

Создание графического интерфейса программы как правило отнимает 50 и более процентов времени, затрачиваемого на ее разработку. Причем, при создании приложений, работающих с реляционными базами данных, приходится создавать довольно большое количество форм для отображения/изменения данных различного рода справочных таблиц. Так же, практически каждое приложение содержит форму About, показывающую информацию о проекте и разработчике. Разумеется, глупо и не производительно тратить время на создание функционально одних и тех же форм. Вот здесь в помощь разработчику Borland C++ Builder предлагает такой мощный инструмент, как Object Repository, позволяющий совместно или повторно использовать формы, проекты, модули данных и т.д.

При создании шаблона необходимо сделать его максимально законченным и функциональным. Так при создании справочников, необходимо, чтобы форма была полностью функциональной, за исключением работы с базой данных. А при создании формы About это требование еще жестче - форма должна быть абсолютно функциональной. Ведь она создается один раз для всех приложений и является визитной карточкой разработчика.

Для начала нужно создать новый проект и сохранить его в отдельной папке под именем MyAbout. Далее в качестве заготовки будем использовать стандартное окно About, предлагаемое в Borland C++ Builder. Для его добавления в приложение выберем команду File->New->Other и во вкладке Forms диалогового окна New Items выберите пиктограмму About box.

Теперь в соответствии со своим собственным эстетическим представлением исправляем внешний вид формы и сохраняем с именем MyAboutBox (имя для формы AboutBoxMy). К примеру, пусть это будет выглядеть так:

Теперь пишем исполняемый код. Ниже приведены примеры листингов:
MyAboutBox.h
//----------------------------------------------------------------------------
#ifndef MyAboutBoxH
#define MyAboutBoxH
//----------------------------------------------------------------------------
#include <vclSystem.hpp>
#include <vclWindows.hpp>
#include <vclSysUtils.hpp>
#include <vclClasses.hpp>
#include <vclGraphics.hpp>
#include <vclForms.hpp>
#include <vclControls.hpp>
#include <vclStdCtrls.hpp>
#include <vclButtons.hpp>
#include <vclExtCtrls.hpp>
#include "Animate.hpp"
#include "GIFCtrl.hpp"
//----------------------------------------------------------------------------
class TAboutBoxMy : public TForm
{
__published:
   TPanel *Panel1;
   TLabel *ProductName;
   TLabel *Version;
   TLabel *Copyright;
   TLabel *Comments;
   TButton *OKButton;
   TLabel *Company;
   TLabel *Author;
   TPanel *Panel2;
   TRxGIFAnimator *ProgPic;
   TLabel *ProdName;
   void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
   void __fastcall FormActivate(TObject *Sender);
   void __fastcall FormCreate(TObject *Sender);
   void __fastcall AuthorClick(TObject *Sender);
private:
   struct TransArray
   {
      WORD LangID, CharSet;
   };
   TransArray *Array;
   DWORD VerInfo,VerSize;
   HANDLE MemHandle;
   LPVOID MemPtr, BufPtr;
   UINT BufferLength;
   char QueryBlock[40];
public:
   virtual __fastcall TAboutBoxMy(TComponent* AOwner);
};
//----------------------------------------------------------------------------
extern PACKAGE TAboutBoxMy *AboutBoxMy;
//----------------------------------------------------------------------------
#endif
а также
MyAboutBox.cpp
//---------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MyAboutBox.h"
//--------------------------------------------------------------------- 
#pragma link "Animate"
#pragma link "GIFCtrl"
#pragma resource "*.dfm"
TAboutBoxMy *AboutBoxMy;
//--------------------------------------------------------------------- 
__fastcall TAboutBoxMy::TAboutBoxMy(TComponent* AOwner)
	: TForm(AOwner)
{
}
//---------------------------------------------------------------------
void __fastcall TAboutBoxMy::FormClose(TObject *Sender, TCloseAction &Action)
{
   ProgPic->Animate=false;
}
//---------------------------------------------------------------------------
void __fastcall TAboutBoxMy::FormActivate(TObject *Sender)
{
   ProgPic->Animate=true;
}
//---------------------------------------------------------------------------
void __fastcall TAboutBoxMy::FormCreate(TObject *Sender)
{
   AnsiString Path(Application->ExeName);
   VerSize=GetFileVersionInfoSizeA(Path.c_str(),&VerInfo);
   if(VerSize>0)
   {
      MemHandle=GlobalAlloc(GMEM_MOVEABLE,VerSize);
      MemPtr=GlobalLock(MemHandle);
      GetFileVersionInfo(Path.c_str(),VerInfo,VerSize,MemPtr);
      VerQueryValue(MemPtr,"\VarFileInfo\Translation",&BufPtr,&BufferLength);
      Array=(TransArray *)BufPtr;
      wsprintf(QueryBlock,"\StringFileInfo\%04x%04x\ProductName",Array[0].LangID,Array[0].CharSet);
      VerQueryValue(MemPtr,QueryBlock,&BufPtr,&BufferLength);
      ProductName->Caption=(char *)BufPtr;
      ProdName->Caption=ProductName->Caption;
      wsprintf(QueryBlock,"\StringFileInfo\%04x%04x\FileVersion",Array[0].LangID,Array[0].CharSet);
      VerQueryValue(MemPtr,QueryBlock,&BufPtr,&BufferLength);
      Version->Caption="Version "+String((char *)BufPtr);
      wsprintf(QueryBlock,"\StringFileInfo\%04x%04x\CompanyName",Array[0].LangID,Array[0].CharSet);
      VerQueryValue(MemPtr,QueryBlock,&BufPtr,&BufferLength);
      Company->Caption=(char *)BufPtr;
      wsprintf(QueryBlock,"\StringFileInfo\%04x%04x\LegalCopyright",Array[0].LangID,Array[0].CharSet);
      VerQueryValue(MemPtr,QueryBlock,&BufPtr,&BufferLength);
      Copyright->Caption="Copyright "+String((char *)BufPtr);
   }
   else
   {
      ProductName->Caption="";
      Version->Caption="";
      Company->Caption="";
      Copyright->Caption="";
   }
}
//---------------------------------------------------------------------------
void __fastcall TAboutBoxMy::AuthorClick(TObject *Sender)
{
   ShellExecute(Handle,"open","www.bcbsql.front.ru",NULL,NULL,SW_RESTORE); 
}
//---------------------------------------------------------------------------
Здесь используется GIFanimator из комплекта RX Library. Если у Вас нет RX Library, придется отказаться от использования формата GIF. Вместо него можно использовать файлы *.avi.
На форму Form1 бросается кнопка. В ее обработчик события OnClick введите код:
void __fastcall TForm1::Button1Click(Tobject *Sender)
{
   AboutBoxMy->ShowModal();
}
В окне Project->Options->VersionInfo заполняем необходимую информацию и подключаем информацию о версии к проекту. Теперь все сохраняем, компилируем и запускаем на выполнение. В результате появится форма с кнопкой. При нажатии на нее увидим наш AboutBox:
Теперь добавим окно AboutBoxMy в Object Repository. Для этого щелкаем правой кнопкой мышки на форме AboutBoxMy и выберем пункт меню Add To Repository. Осталось заполнить требуемые описания и нажать кнопку ОК.
И уже при создании нового проекта не надо думать о создании окна About. Достаточно выбрать его из Object Repository.


Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=9405