Создание графического интерфейса программы как правило отнимает 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. |