(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

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

Источник: 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.



 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 28.02.2008 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
GFI FaxMaker и 1 год поддержки (10-49 лицензий)
Toad Data Modeler Per Seat License/Maint
Panda Mobile Security - ESD версия - на 1 устройство - (лицензия на 1 год)
AutoCAD LT 2022 Commercial New Single-user ELD Annual Subscription
VMware Workstation Pro 12 for Linux and Windows, ESD
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Программирование на Microsoft Access
CASE-технологии
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Реестр Windows. Секреты работы на компьютере
СУБД Oracle "с нуля"
Мастерская программиста
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100