Смекни!
smekni.com

Клиентская часть технологической среды для разработки больших экономических моделей: компоненты поддержки работы эксперта-экономиста при формировании и отладке (в расчетном режиме) структурного текста (стр. 7 из 13)

TBitBtn = class(TButton)

private

FCanvas: TCanvas;

FGlyph: Pointer;

FStyle: TButtonStyle;

FKind: TBitBtnKind;

FLayout: TButtonLayout;

FSpacing: Integer;

FMargin: Integer;

IsFocused: Boolean;

FModifiedGlyph: Boolean;

procedure DrawItem(const DrawItemStruct: TDrawItemStruct);

procedure SetGlyph(Value: TBitmap);

function GetGlyph: TBitmap;

function GetNumGlyphs: TNumGlyphs;

procedure SetNumGlyphs(Value: TNumGlyphs);

procedure GlyphChanged(Sender: TObject);

function IsCustom: Boolean;

function IsCustomCaption: Boolean;

procedure SetStyle(Value: TButtonStyle);

procedure SetKind(Value: TBitBtnKind);

function GetKind: TBitBtnKind;

procedure SetLayout(Value: TButtonLayout);

procedure SetSpacing(Value: Integer);

procedure SetMargin(Value: Integer);

procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;

procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;

procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;

procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;

procedure WMLButtonDblClk(var Message: TWMLButtonDblClk);

message WM_LBUTTONDBLCLK;

protected

procedure CreateHandle; override;

procedure CreateParams(var Params: TCreateParams); override;

function GetPalette: HPALETTE; override;

procedure SetButtonStyle(ADefault: Boolean); override;

public

constructor Create(AOwner: TComponent); override;

destructor Destroy; override;

procedure Click; override;

published

property Cancel stored IsCustom;

property Caption stored IsCustomCaption;

property Default stored IsCustom;

property Enabled;

property Glyph: TBitmap read GetGlyph write SetGlyph stored IsCustom;

property Kind: TBitBtnKind read GetKind write SetKind default bkCustom;

property Layout: TButtonLayout read FLayout write SetLayout default blGlyphLeft;

property Margin: Integer read FMargin write SetMargin default -1;

property ModalResult stored IsCustom;

property NumGlyphs: TNumGlyphs read GetNumGlyphs write SetNumGlyphs stored IsCustom default 1;

property ParentShowHint;

property ShowHint;

property Style: TButtonStyle read FStyle write SetStyle default bsAutoDetect;

property Spacing: Integer read FSpacing write SetSpacing default 4;

property TabOrder;

property TabStop;

property Visible;

property OnEnter;

property OnExit;

end;

В данном примере описан стандартный компонент TBitBtn, наследующий от стандартного класса Tbutton - стандартная кнопка, используемая повсеместно в Windows. Он имеет четыре секции в описании - private, protected, publishedи public. Данные секции регламентируют доступ к методам, полям и свойствам, находящимся в них для других компонент и для программ пользователя.


2.2.2 Многократное использование кода

Термин «многократное использование кода» (codereuse) говорит сам за себя. Данная технология подразумевает возможность написания таких участков программ, которые затем с небольшими изменениями (или совсем без изменений) могут быть использованы в другой программе. Нельзя сказать, что такой подход является привилегией средств быстрой разработки приложений - еще раньше программисты поняли преимущества возможности выделения универсальных и часто используемых подпрограмм в отдельные библиотеки (модули). Таким образом появлялись библиотеки подпрограмм для различных языков программирования, работающие с графикой, базами данных, реализующие многие математические функции и прочие универсальные задачи. Но именно в RAD–средствах технология многократного использования кода приобрела законченный и целостный вид - существует широкий набор стандартных компонентов, которые могут использоваться во многих программах различного типа, а при необходимости получения какого-либо компонента с отличными от стандартных возможностями, его написание облегчается из-за механизма наследования от уже существующих компонентов их свойств и методов.

Сложность данного подхода в изменении идеологии программирования - разработчик должен изначально ориентироваться на создания кода, который затем можно будет многократно использовать. Особенно актуальна эта проблема для групп разработчиков. В этом случае необходимо мыслить глобально, с учетом требований всех членов группы и перспективы дальнейших разработок.

Кроме описанных особенностей средств быстрой разработки приложений, следует отметить наличие определенного инструментария, который призван помогать разработчику при создании стандартных элементов приложений. Эти средства автоматизируют рутинную работу при генерации например графического интерфейса. В различных средах они носят различное наименование - expert и master в средах фирмы Borlandи wizard в средах, разработанных фирмой Microsoft.

2.3 Создание программ в среде Delphi

Благодаря всем вышеописанным преимуществам технологии быстрого проектирования приложений, создание программ в среде Delphi является удобным и необременительным делом. Для генерации программы первоначально необходимо создать файл проекта, имя которого будет совпадать с именем будущей программы. Причем Delphiсама сделает каркас программы - пользователю необходимо только выбрать соответствующий пункт в диалоговом окне New,которое показано на рис.6

Рис.6. Окно выбора объекта создания

Таким образом, выбрав тип создаваемой программы, программист получит готовый шаблон, который затем необходимо будет заполнить содержанием.

Каждое окно в Delphi называется формой. На форме располагаются различные визуальные и не визуальные компоненты. Весь набор компонент, доступных в системе, хранится в файле complib.dclили в файле с другим именем и отображается в специальном окне среды Delphi, называемом «палитрой компонент» (componentpalette).

Рис.7. Палитра компонентов

Палитра разбивается на страницы, группирующие компоненты по каким-либо общим признакам.

Рис.8. Пример создания экранной формы

Например, на одной странице помещаются компоненты работы с данными, на другой - сетевые и т.д. Гибкость среды Delphiпозволяет настраивать палитру по своему усмотрению - объединять, разбивать страницы, переносит компоненты с одной страницы на другую и т.п. Для того, чтобы поместить компонент на форму, необходимо нажать на его изображении на палитре компонент кнопку «мыши», затем переместить указатель «мыши» на нужное место и там отпустить. Это процесс приведет к тому, что у класса формы появится поле типа этого компонента. Собрав на одну форму несколько компонентов, можно получит сколь угодно сложные диалоговые окна с полями ввода, мемо-полями и прочими компонентами. Простой пример создаваемого окна (в режиме разработки) показан на рис.8.

На рис.8 показана разрабатываемая форма с несколькими визуальными компонентами. Хотя количество визуальных компонент на форме практически не ограничено, здравый смысл подсказывает, что перегружать форму ими не целесообразно, поскольку пользоваться программой с большим количеством кнопок, полей ввода и т.д. будет трудно из-за информационной перенасыщенности. Кроме того, рекомендуется каждый визуальный компонент снабжать строкой описания, чтобы пользователь мог догадаться, что же от него требуется.

Кроме визуальных, существуют также невизуальные компоненты. Поместив такой компонент на форму и запустив программу, мы ничего не увидим. Но некоторые компоненты во время работы себя отображают, правда для этого необходимо вызвать их методы. К таким компонентам относится всевозможные диалоговые компоненты, например OpenDialog, который является стандартным окном для открытия файла. Другие невизуальные компоненты внешне никак себя не проявляют, например компонент DataSet.

Свойства каждого компонента и формы в целом, а также события, на которые они откликаются, отображаются в окне инспектора объектов (objectinspector). Инспектор объектов имеет две страницы - страницу со свойствами и страницу с событиями. Общий вид обеих страниц указан на рис.9

Рис.9. Инспектор объектов

При редактировании свойства в инспекторе объектов учитывается тип этого свойства. Например, если свойство логического типа, то возможен будет выбор только лишь между значениями Trueи False. Для более сложных свойств, например, для списков строк, существуют свои редакторы свойств. Например, компонент ComboBox с рис.8 имеет свойство Items типа списка строк - TStrings. В этом случае нажатие на кнопку с многоточием, расположенную рядом с именем свойства, приведет к активизации редактора списка строк. Его вид показан на рис.10

Для нестандартных свойств, описанных программистом, существует возможность создания своего редактора свойств методами Delphi.

Рис.10. Редактор списка строк

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