Шаблони форм, створення і застосування (исходники), Різне, Програмування, статті

Створення графічного інтерфейсу програми як правило забирає 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,”VarFileInfoTranslation”,&BufPtr,&BufferLength);
Array=(TransArray *)BufPtr;
wsprintf(QueryBlock,”StringFileInfo\%04x%04xProductName”,Array[0].LangID,Array[0].CharSet);
VerQueryValue(MemPtr,QueryBlock,&BufPtr,&BufferLength);
ProductName->Caption=(char *)BufPtr;
ProdName->Caption=ProductName->Caption;
wsprintf(QueryBlock,”StringFileInfo\%04x%04xFileVersion”,Array[0].LangID,Array[0].CharSet);
VerQueryValue(MemPtr,QueryBlock,&BufPtr,&BufferLength);
Version->Caption=”Version “+String((char *)BufPtr);
wsprintf(QueryBlock,”StringFileInfo\%04x%04xCompanyName”,Array[0].LangID,Array[0].CharSet);
VerQueryValue(MemPtr,QueryBlock,&BufPtr,&BufferLength);
Company->Caption=(char *)BufPtr;
wsprintf(QueryBlock,”StringFileInfo\%04x%04xLegalCopyright”,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.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*