
- •«Современные методы разработки программ». Этапы решения задачи
- •Постановка задачи.
- •Техническое задание
- •Разработка структуры базы данных
- •Написание кодов
- •Отладка и внедрение
- •База данных
- •Поля таблицы
- •Ключи и индексы.
- •Способы доступа к данным.
- •Связь между таблицами.
- •Создание базы данных
- •Псевдонимы базы данных
- •Создание таблицы
- •Задание полей
- •Задание свойств таблицы (Table properties)
- •Свойство Validity Checks – проверка правильности значений.
- •Свойство Table Lookup – таблица просмотра
- •Свойство Table Language – язык таблицы
- •Изменение структуры таблицы с помощью Database Desktop
- •Изменение в реестре для корректного отображения русского языка
- •О бзор компонентов Delphi, используемых для связи с бд.
- •Форма модуль данных Data Module
- •Компонент Database
- •Компонент Table
- •Свойства, которые доступны программным путем
- •Методы компонента tTable
- •События компонента tTable.
- •К омпонент Query
- •Свойство sql
- •Query и Параметры
- •К омпонент DataSource
- •Свойства
- •События
- •Компонент dbNavigator
- •Компоненты визуализации и управления данными со страницы Data Control Компонент dbGrid
- •События
- •Другие компоненты визуализации
- •П ример простейшего приложения с использованием компонента Table
- •Основы языка sql. Общие сведения.
- •Отбор данных из таблиц. Оператор выбора Select
- •Совокупные характеристики
- •Вложенные запросы.
- •Объединение таблиц.
- •Соединение union
- •Модификация записей Вставка записи
- •Values(‘Орлов’,’Александр’,’Иванович’,’м’,’23.04.1981’,’Гродно’)
- •Редактирование записи
- •Удаление записи
- •Операции с таблицами Создание таблицы
- •Изменение структуры таблицы
- •Удаление таблицы
- •Операции с индексами
- •Создание индекса
- •Удаление индекса
Удаление индекса
Удаление существующего индекса осуществляется оператором Drop Index:
Drop index <имя таблицы>.<имя индекса>
Например Drop index osndan.fio
Разработка графического интерфейса пользователя.
Общие рекомендации по разработке графического интерфейса.
Delphi предоставляет разработчику приложения широкие возможности быстрого и качественного проектирования графического интерфейса пользователя – различных окон, кнопок, меню и т.д. Есть определенные принципы построения графического интерфейса пользователя, который должен включать:
Главное меню. Реализуется компонентом MainMenu.
Инструментальную панель быстрых кнопок, дублирующих основные разделы меню. Чаще всего это компонент ToolBar.
Контекстные меню (реализуется компонентом PopurMenu), всплывающие при щелчке пользователя правой кнопкой мыши на том или ином компоненте.
Продуманную последовательность переключения фокуса управляющих элементов.
Клавиши быстрого доступа ко всем разделам меню и всем управляющим элементам, горячие клавиши для доступа к основным командам.
Ярлычки подсказок, всплывающие при перемещении курсора мыши над быстрыми кнопками и иными компонентами
Полосу состояния (реализуется компонентом StatusBar), используемую для развернутых подсказок и выдачи различной информации пользователю
Файл справки, темы которого отображаются при нажатии клавиши F1 или при выборе пользователем соответствующего раздела меню
Информацию о версии, доступную пользователю при щелчке на пиктограмме приложения правой кнопкой мыши.
Возможность настройки приложения и запоминания настроек, чтобы при очередном сеансе работы восстанавливать настройки, установленные в предыдущем сеансе.
Создание проекта.
Хорошим тоном программирования считается хранить каждый проект в отдельной папке. Поэтому на диске C:\ создадим папку PRIPO, а в ней две папки Progr и Base. Все файлы, относящиеся к проекту, будем хранить в папке Progr, а файлы базы данных в Base.
Создание главной формы.
З
апустим
Delphi.
Появится чистая форма. Сразу присвоим
имя форме Fgl.
Для этого в Object
inspector
свойство Name
изменим
на Fgl.
Сохраним форму под именем Ugl.pas,
а проект под именем PrIPO.dpr.
В результате на диске C:\PRIPO,
в папке Progr
появятся три основных файла: Pripo.prg(файл
проекта), ugl.pas(файл
модуля), ugl.dfm
(файл формы), которые необходимы в случае,
если Вам понадобится перенести программу
на другой компьютер. После компиляции
или запуска на выполнение появится еще
один файл Pripo.exe,
единственный файл, который необходим,
чтобы Ваше приложение работало на любом
другом компьютере (еще, конечно, нужен
файл или файлы базы данных).
Теперь будем добавлять компоненты:
Статусная строка.
Компонента CtatusBar с закладки Win32.
Главное меню.
Компонента MainMenu с закладки Standard. Щелкнем дважды по компоненте и создадим пункты главного меню и пункты подменю как показано на рис.2- рис.5. Для этого введем в свойства Caption соответствующие названия.
Свойство ShortCut определяет горячие клавиши, с помощью которых пользователь, даже не заходя в меню, может в любой момент вызвать выполнение процедуры, связанной с этим разделом (рис.3).
С
войство
Break
используется в длинных меню, чтобы
разбить список разделов на несколько
столбцов.
С
войство
Checked,
установленное в true,
указывает, что в разделе меню будет
отображаться маркер флажка (галочки),
показывающий, что в данный момент раздел
выбран (рис.3). При этом имеет смысл
свойство AutoCheck
установить
в true,
тогда маркер будет автоматически
переключаться, указывая то на выбранное
состояние, то на отсутствие выбора.
С
войство
RadioItem,
установленное true,
определяет что данный раздел должен
работать в режиме радиокнопки совместно
с другими разделами, имеющее то же
значение свойства.
Если установить свойство Enabled=false, то раздел будет изображаться серой надписью и не будет реагировать на щелчок пользователя.
Если же задать свойство Visible=false, то раздел вообще не будет виден, а остальные разделы сомкнутся, заняв место невидимого.
В
Delphi
предусмотрена возможность ввода в
разделы меню изображений (рис.5). Для
этого необходимо добавить компоненту
ImageList
с закладки
Win32.
Щелкнув затем двойным щелчком мыши по
этой компоненте, в появившемся окне
(рис.6) нажать кнопку Add.
В директории C:\Program
files\Common
files\Borland
Shared\Imagens\Buttons
выбрать подходящие картинки для кнопок.
Далее у компоненты MainMenu1
свойство
Images
указать
ImageList1.
И, наконец, свойство ImageIndex
пункта
меню изменить, выбрав нужную картинку
с соответствующим номером.
В каждом названии раздела меню должен быть выделен подчеркиванием символ, соответствующий клавише быстрого доступа к разделу (клавиша Alt плюс подчеркнутый символ). Хотя вряд ли такими клавишами часто пользуются, но традиция указания таких клавиш незыблема (рис.1). Для установки быстрого доступа в свойстве Caption перед буквой нужно ввести символ &. Например «&Выход».
Многим разделам могут быть поставлены в соответствие горячие клавиши, позволяющие обратиться к команде данного раздела, даже не заходя в меню (рис.3). Для этого Свойство элемента меню ShortCut выбрать подходящее значение клавиш.
Инструментальная панель. Можно использовать компоненту ToolBar с закладки Win32. Мы рассмотрим компоненту panel с закладки Standart. Добавим эту компоненту на форму. Свойство Align изменить на alTop. На панель бросить пять кнопок: четыре компоненты SpeedButton и одну компоненту BitBtn со страницы Additional. На каждой кнопке разместим подходящую назначению кнопки картинку (рис.1) . Для этого необходимо изменить свойство Glyph. . В директории C:\Program files\Common files\Borland Shared\Imagens\Buttons можно выбрать подходящие картинки для кнопок. У компоненты BitBtn свойство Caption изменим на «Закрыть». Для того, чтобы при изменении размеров формы кнопка «Закрыть» оставалась всегда справа необходимо настроить свойство Anchor – привязку к родительскому компоненту при изменении размеров последнего. Это свойство представляет собой множество, которое может содержать следующие элементы:
akLeft -Левый край компонента привязан к левому краю родительского компонента;
akTop - Верхний край компонента привязан к верхнему краю родительского компонента;
akRight - Правый край компонента привязан к правому краю родительского компонента;
akBottom - Нижний край компонента привязан к нижнему краю родительского компонента.
Таким образом мы установим akLeft=False, akTop=False, akRight=True, akBottom=False.
Дополнительно можно добавить еще две панели (рис.1): На первой панели разместим компоненту Label, свойство Caption которой введем «Поиск по фамилии». Свойство Align изменить на alTop. На эту панель добавим компоненту Edit, свойство Name изменим на EditFam. На второй будем выводить информацию о слушателе, например дату рождения и т.п. Эта панель будет располагаться внизу формы, поэтому свойство этой панели Align изменим на alBottom. На вторую панель инструментов добавим компоненту Label, свойство Caption которой введем «Дата рождения». Добавим на эту панель еще одну компоненту Label. Свойство Name изменим на LabelDr.
Для вывода списка слушателей (рис.1) добавим компоненту DBGrid. Для того, чтобы при изменении размеров формы компонента DBGrid также меняла свои размеры, свойство Align изменим на alClient.
Подсказки.
Приложение должно предельно облегчать работу пользователя, снабжая его системой подсказок, помогающих сориентироваться в приложении. Эта система включает в себя:
Ярлычки, которые всплывают, когда пользователь задержит курсор мыши над каким-то элементом окна приложения. В частности, такими ярлычками обязательно должны снабжаться быстрые кнопки инструментальных панелей, поскольку нанесенные на них пиктограммы часто не настолько выразительны, чтобы пользователь без дополнительной подсказки мог понять их назначение.
Более развернутые подсказки в панели состояния или в другом отведенном под это месте экрана, которые появляются при перемещении курсора мыши в ту или иную область окна приложения.
Тексты ярлычков и подсказок панели состояния устанавливаются для любых визуальных компонентов в свойстве Hint в виде строки текста, состоящей из двух частей, разделенных символом вертикальной черты ’|’. Первая часть, обычно очень краткая, предназначена для отображения в ярлычке; вторая более развернутая подсказка предназначена для отображения в панели состояния или ином заданном месте экрана. Свойство компоненты ShowHint необходимо установить True.
Свойство Hint компонентов можно также использовать для отображения текстов заключенных в них сообщений в какой то метке или панели с помощью функций GetShortHint и GetLongHint, первая из которых возвращает первую часть сообщения, а вторая – вторую (если второй части нет, то возвращается первая часть). Например, эти функции можно использовать в обработчиках событий OnMouseMove, соответствующих прохождению курсора мыши над данным компонентом. Так обработчик
procedure TFgl.SpeedButton1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Panel1.Caption:=GetShortHint(speedButton1.hint);
StatusBar1.SimpleText:=GetLongHint(speedButton1.hint);
end;
отобразит в панели Panel1 первую, а в StatusBar1 вторую часть свойства Hint, всех компонентов, над которыми будет перемещаться курсор, если в этих компонентах в событии OnMouseMove указан этот обработчик.
Имеется еще один способ отображения второй части сообщения, записанного в Hint, в строке состояния, когда курсор мыши проходит над компонентом – это использование обработки события приложения OnHint. Это событие не того компонента, над которым проходит курсор мыши, а именно приложения – объекта Application. Это событие перехватывается компонентом ApplicationEvrnts со страницы Additional.
procedure TFgl.ApplicationEvents1Hint(Sender: TObject);
begin
StatusBar1.SimpleText:=Application.Hint;
end;
Последовательность фокусировки элементов.
При проектировании приложения важно правильно определить последовательность табуляции оконных компонентов. Под этим понимается последовательность, в которой переключается фокус с компонента на компонент, когда пользователь нажимает клавишу табуляции Tab. Это важно, поскольку в ряде случаев пользователю удобнее работать не с мышью, а с клавиатурой. Пусть, например, вводя данные о каком-то сотруднике, пользователь должен в отдельных окнах редактирования указать фамилию, имя и отчество. Конечно, набрав фамилию ему удобнее нажать клавишу Tab и набирать имя, а потом опять, нажав Tab, набирать отчество, чем каждый раз отрываться от клавиатуры, хватать мышь и переключаться в новое окно редактирования.
Свойство формы ActiveControl, установленное в процессе проектирования, определяет, какой из размещенных на форме компонентов будет в фокусе в первый момент при выполнении приложения.
Последовательность табуляции задается свойством TabOrder компонентов. Первому элементу присваивается значение TabOrder, равное 0, второму 1 и т.д.
Значение свойства TabOrder играет роль только, если другое свойство компонента TabStop установлено в True. Установка TabStop в False приводит к тому, что компонент выпадает из последовательности табуляции и ему невозможно передать фокус клавишей Tab (однако передать фокус мышью, конечно, можно).
Имеется и программная возможность переключения фокуса – это метод SetFocus. Например, если Вы хотите переключить в какой-то момент фокус на окно Edit2, Вы можете сделать это оператором:
Edit2.SetFocus;
Для перехода от одного ввода до следующего удобнее нажать клавишу Enter. Это можно сделать, обрабатывая событие нажатия клавиши OnKeyDown. Например, если после ввода данных в окно EditFam пользователю надо переключиться в окно DBGrid1, то обработчик события OnKeyDown компоненты EditFam можно сделать следующим:
procedure TFgl.EditFamKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
begin
if key=vk_return then DBGrid1.SetFocus; {или if key=13 then DBGrid1.SetFocus;}
end;
Можно подобные операторы ввести во все окна, обеспечивая требуемую последовательность, однако можно сделать все это более компактно, используя один обработчик для различных окон редактирования и кнопок. Для этого можно использовать метод FindNextControl, возвращающий дочерний компонент, следующий в последовательности табуляции. Если компонент, имеющий в данный момент фокус, является последним в последовательности табуляции, то возвращается первый компонент этой последовательности. Метод определен следующим образом:
Function FindNextControl(CurControl: TwinControl; GoForward, CheckTabStop, CheckParent:Boolean): TWinContril;
Он находит и возврвщает следующий за указанным в параметре CurControl дочерний оконный компонент в соответствии с последовательность табуляции.
Параметр GoForward определяет направление поиска. Если он равен True, то поиск проводится вперед и возвращается компонент, следующий за CurControl. Если же параметр GoForward равен False, то возвращается предшествующий компонент.
Если параметр CheckTabStop равен True, то просматриваются только компоненты, в которых свойство TabStop установлено в True. При CheckTabStop равном false значение TabStop не принимается во внимание. Если параметр CheckParent равен True, то просматриваются только компоненты, в свойстве Parent которых указан данный оконный элемент, т.е. просматриваются только прямые потомки. Если CheckParent равен False, то просматриваются все, даже косвенные потомки данного элемента.
Таким образом, для автоматической передачи фокуса при нажатии клавиши Enter, Вы можете написать единый обработчик событий OnKeyDown всех интересующих Вас оконных компонентов, содержащий оператор:
if key=vk_return then FindNextControl(sender as TwinControl, true,true,false).SetFocus;
Сообщения для пользователя
ShowMessage(ТЕКСТ_СООБЩЕНИЯ)
Пример: ShowMessage ('Привет!')
MessageDLG(ТЕКСТ_СООБЩЕНИЯ,ТИП_СООБЩЕНИЯ,КНОПКИ,ИНДЕКС_ПОМОЩИ)
ТИП_СООБЩЕНИЯ: mtWarning, mtError, mtInformation, mtConfirmation, mtCastom
КНОПКИ: mbYes,mbNo,mbOk,mbCansel,mbHelp,mbAbort,mbRetry,mbIgnore,mbAll
Пример: if MessageDLG ('Сохранить файл перед выходом?',mtConfirmation,[mbYes,mbNo,mbCancel],0)= mrYes then…
MessageBox(Handle,ТЕКСТ_СООБЩЕНИЯ,ЗАГОЛОВОК_ОКНА,ТИП_СООБЩЕНИЯ)
ТИП_СООБЩЕНИЯ включает в себя иконку и кнопки:
ИКОНКИ: mb_iconExlamation, mb_iconWarning, mb_iconError, mb_iconInformation, mb_iconAsterisk, mb_iconQuestion, mb_iconStop, mb_iconHand
КНОПКИ: mb_AbortRetryIgnore, mb_Ok, mb_OkCansel, mb_RetryCancel,mb_YesNo, mb_YesNoCancel
Пример: if MessageBox (Hanle,Pchar('Сохранить файл перед выходом?'),Pchar(('Мое сообщение'), mb_iconinformation+mb_YesNo+mb_defbutton2)= idYes then…
Именно функцию MessageBox я рекомендую использовать в своих приложениях, т.к. эта функция подстраивается под язык операционной системы, что позволяет текст окна и названия кнопок выводить на русском языке (рис.9)
Включение в проект форм
Во многих случаях Ваш проект будет содержать не одну, а несколько форм. Если Вы хотите включить новую пустую форму, Вам достаточно выполнить команду File | New Form или нажать соответствующую быструю кнопку. Если же Вам нужно включить в проект форму, разработанную ранее, то тут возможны несколько вариантов.
Можно включить готовую форму в проект командой Project |Add to Project соответствующей быстрой кнопкой. При этом, если форма (или модуль) имеет тоже имя, которое имеет одна из имеющихся в проекте форм (модулей), то вам придется переименовать вашу форму (модуль). Введенное описанными действиями совместное владение несколькими приложениями одной и той же формой имеет свои плюсы и минусы. Если эти приложения представляют собой некую группу связанных друг с другом приложений, рассчитанных на применение одними и теми же пользователями, то наличие общих форм можно только приветствовать. Какие-то усовершенствования, введенные в подобной форме, согласованно отобразятся во всех использующих ее приложениях (после их компиляции). Если же приложения, совместно использующие форму, совершенно разные или форма используется в них для разных целей, то введя изменения в форму в одном приложении, вы рискуете испортить прежнее приложение, если соберетесь ее перекомпилировать.
Создание отдельной копии формы.
Чтобы избежать совместного владения формой несколькими приложениями, можно просто средствами Windows скопировать соответствующие файлы из одного каталога в другой. При этом нужно знать, что копировать необходимо два файла: файл модуля формы с расширением pas и файл ее изображения с расширением dfm. Файл объектного модуля с расширением dcu можно не копировать, т.к. он будет создан Delphi в процессе компиляции. А уже затем можно добавить ее в проект.
Управление формами.
П
о
умолчанию все формы создаются автоматически
при запуске приложения и первая из
введенных в приложение форм считается
главной. Главная форма отличается от
прочих рядом свойств. Во-первых, именно
этой форме передается управление в
начале выполнения приложения. Во-вторых
закрытие главной формы означает
завершение выполнения приложения. В
третьих, главная форма так же, как и
любая другая, может быть спроектирована
невидимой (свойство Visible),
но если все остальные формы закрыты, то
главная форма становится в любом случае
видимой (иначе пользователь не смог бы
продолжать работать с приложением и
даже не смог бы его завершить).
У
казанные
выше условия, принятые по умолчанию
(первая форма – главная, все формы
создаются автоматически), могут быть
изменены. И это обязательно нужно сделать
(если форм в проекте много), чтобы не
загружать оперативную память. Изменить
принятые по умолчанию условия относительно
форм можно в окне опций проекта, которое
вызывается командой Project
| Options.
В открывшемся окне опций проекта (Project
Options)
надо выбрать страницу Forms
(рис.7). В верхнем выпадающем списке Main
forms
можно выбрать главную форму среди
имеющихся в проекте. Пользуясь двумя
нижними окнами можно установить какие
формы должны создаваться автоматически
(левое окно Auto-create
Forms),
а какие не должны (правое окно Available
forms).
Для каждой автоматически создаваемой
формы Delphi
добавляет в файл программы соответствующий
оператор ее создания методом CreateForm.
Это можно увидеть, если выполнить команду
Project
| View
Source
и просмотреть появившийся файл проекта
.dpr.
Он может, например, содержать следующие
выполняемые операторы:
Aplication.CreateForm(TFgl, Fgl);
Aplication.CreateForm(TFdan, Fdan);
Aplication.run;
Первый и второй из них создают соответствующие формы, а третий начинает выполнение приложения. Для форм, которые были исключены из списка автоматически создаваемых, аналогичный метод CreateForm надо выполнить в тот момент, когда форма должна быть создана. Например, при выборе пункта меню подключает форму Ffob (рис.8):
procedure TFgl.N12Click(Sender: TObject);
begin
application.CreateForm(TFfob,Ffob);
Ffob.showmodal;
Ffob.Free;
end;
В момент создания формы возникает событие OnCreate. Обработка этого события широко используется для настройки каких-то компонентов формы, создания списков и т.д.
В нужный момент форму можно сделать видимой методами Show или ShowModal. Последний метод открывает форму как модальную. Это означает, что управление передается этой форме и пользователь не может передать фокус другой форме данного приложения до тех пор, пока он не закроет модальную форму. Методы Show или ShowModal можно применять только к невидимой в данный момент форме. Если нет уверенности, что форма в данный момент невидима, то прежде, чем применять эти методы, следует проверить свойство Visible формы. Например:
If (not Form2.Visible) then Form2.ShowModal;
При выполнении методов Show или ShowModal возникает событие формы onShow. Это событие возникает до того момента, как форма действительно станет видимой. Поэтому обработку события onShow можно использовать для настройки каких-то компонент открываемой формы. Отличие от события onCreate заключается в том, что событие onCreate наступает для каждой формы только один раз в момент ее создания, а события onShow наступают каждый раз, когда форма делается видимой.
Методом Hide форму в любой момент можно сделать невидимой. В этот момент в ней возникает событие onHide.
Необходимо помнить, что для выполнения методов CreateForm, Show, ShowModal, Hide и вообще для обмена любой информацией между формами модули соответствующих форм должны использовать друг друга. Для этого их нужно подключать оператором uses в разделе implementation. Это можно сделать вручную или использовать команду File | Use Unit, которая автоматизирует этот процесс.
З
акрыть
форму можно методом Close.
При этом в закрывающейся форме возникает
последовательность событий, которые
можно обрабатывать. Их назначение –
проверить возможность закрытия формы
и указать, что именно подразумевается
под закрытием формы. Проверка возможности
закрытия формы необходима, например,
для того, чтобы проанализировать,
сохранил ли пользователь документ, с
которым он работал в данной форме и
который изменял. Если не сохранил,
приложение должно спросить его о
необходимости сохранения и, в зависимости
от ответа пользователя, сохранить
документ, закрыть приложение без
сохранения или вообще отменить закрытие.
Рассмотрим последовательность событий,
возникающих при выполнении метода
Close.
Первым возникает событие onCloseQuery. В его обработчик передается как var (по ссылке) булева переменная CanClose, определяющая, должно ли продолжаться закрытие формы. По умолчанию CanClose равно true, что означает продолжение закрытия. Но если из анализа текущего состояния приложения или из ответа пользователя на запрос о закрытии формы следует, что закрывать ее не надо, параметру CanClose должно быть присвоено значение false. Тогда последующих событий, связанных с закрытием формы не будет. Например
procedure TFsprst.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if (MessageBox(Handle,'Данные не сохранены. Действительно хотите завершить работу?',
’Подтвердите завершение работы’, mb_iconquestion + mb_yesnocancel)<>idyes) then canClose:=false;
end;
В приведенном операторе вызывается функцией MessageBox диалоговое окно (рис.9). Первый параметр обозначает владельца окна. Второй параметр содержит текст сообщения пользователю. Третий параметр – текст заголовка окна. Четвертый параметр – набор флагов, определяющих вид окна. Флаг mb_iconquestion отображает в окне пиктограмму вопросительного знака. Флаг mb_yesnocance заносит в окно кнопки Да, Нет и отмена. Функция MessageBox возвращает результат, который указывает на реакцию пользователя в диалоговом окне. Значение IDYES возвращается, если пользователь нажал кнопку «Да», значение IDNO возвращается при нажатии кнопки «Нет», значение IDCANCEL – при нажатии кнопки «Отмена» или клавиши «Esc».
З
а
событием onCloseQuery
наступает событие onClose.
В обработчик этого события передается
как var
переменная Action,
которой можно задавать значения:
caNone – Не закрывать форму
caHide – Сделать форму невидимой. Для пользователя она исчезнет с экрана, однако вся хранящаяся в форме информация сохранится.
caMinimize – Свернуть форму до пиктограммы. Как и в предыдущем случае, вся информация в форме будет сохранена.
caFree – Уничтожение формы и освобождение занимаемой ею памяти. Вся информация, содержащаяся в форме будет уничтожена. Если эта форма в дальнейшем потребуется еще раз, ее надо будет создавать методом CreateForm.
Если в обработчике события OnClose задано Action, равное caFree, то при освобождении памяти возникает еще одно последнее событие - onDestroy. Оно обычно используется для очистки памяти от тех объектов, которые автоматически не уничтожаются при закрытии приложения.
Примеры обработчика событий для кнопок «Формы Обучения» (рис.8). Предварительно на форму необходимо поместить 4 компонента Query:
QueryFob, свойство SQL которого: select * from fob order by name_fob - для отображения в DbGrid
QueryI, свойство SQL которого: insert into fob(name_fob) values(:name_fob) - для добавления
QueryU, свойство SQL которого: update fob set name_fob=:name_fob where kod_fob=:kod_fob – для редактирования
QueryI, свойство SQL которого: delete from fob where kod_fob=:kod_fob - для удаления
Кнопка «Добавить»
procedure TFfob.BitBtnIClick(Sender: TObject);
begin
GroupBox1.Caption:=BitbtnI.Caption;
GroupBox1.Visible:=true;
Edit1.Text:='';
Edit1.SetFocus;
end;
Кнопка «Изменить»
procedure TFfob.BitBtnUClick(Sender: TObject);
begin
GroupBox1.Caption:=BitbtnU.Caption;
GroupBox1.Visible:=true;
Edit1.Text:= QueryFob.fieldbyname('name_fob').asstring;
Edit1.SetFocus;
end;
Кнопка «Удалить»
procedure TFfob.BitBtnDClick(Sender: TObject);
begin
if (MessageBox(Handle,'Подтверждение удаления!','Вы уверены', mb_iconWarning + mb_YesNo)= id_Yes) then
begin
try
QueryD.Close;
QueryD.parambyname('kod_fob').asinteger:=QueryFob.fieldbyname('kod_fob').asinteger;
QueryD.ExecSQL;
QueryFob.Close;
QueryFob.Open;
except
MessageBox(Handle,'Ошибка!', 'Обратитесь к разработчику', mb_iconError + mb_Ok);
end;
end;
groupBox1.Visible:=false;
end;
Кнопка «Подтвердить»
procedure TFfob.BitBtnPClick(Sender: TObject);
begin
if (MessageBox(Handle,'Подтверждение !','Вы уверены', mb_iconWarning + mb_YesNo)= id_Yes) then
begin
try
if GroupBox1.caption=BitbtnI.Caption then {признак нажатия кнопки «Добавить»}
begin
QueryI.Close;
QueryI.parambyname('name_fob').asstring:=edit1.Text;
QueryI.ExecSQL;
end;
if GroupBox1.caption=BitbtnU.Caption then {признак нажатия кнопки «Изменить»}
begin
QueryU.Close;
QueryU.parambyname('name_fob').asstring:=edit1.Text;
QueryU.parambyname(' kod_fob').asinteger:=QueryFob.fieldbyname('kod_fob').asinteger;
QueryU.ExecSQL;
end;
queryFob.Close;
queryFob.Open;
except
MessageBox(Handle,'Ошибка!', 'Обратитесь к разработчику', mb_iconError + mb_Ok);
end;
end;
groupBox1.Visible:=false;
end;
Кнопка «Отменить»
procedure TFfob.BitBtn5Click(Sender: TObject);
begin
groupBox1.Visible:=false;
end;
В вышеприведенном примере мы использовали три компонента Query для добавления, корректировки и удаления записей для таблицы Fob. А можно обойтись только одной компонентой Query, при этом ее можно использовать для добавления, корректировки и удаления записей для других таблиц. Для этого компоненту QueryD разместим на модуле данных, а не на форме «Вид обучения». В свойстве SQL компонента ничего писать не нужно, его мы будем прописывать динамически, тогда для кнопок «Удалить» и «Подтвердить» код будет следующим.
Кнопка «Удалить»
procedure TFfob.BitBtnDClick(Sender: TObject);
begin
if (MessageBox(Handle,'Подтверждение удаления!','Вы уверены', mb_iconWarning + mb_YesNo)= id_Yes) then begin
try
datamodule1.QueryD.Close;
datamodule1.QueryD.sql.Clear;
datamodule1.QueryD.sql.add('delete from fob where kod_fob=:kod_fob');
datamodule1.QueryD.parambyname('kod_fob').asinteger:=QueryFob.fieldbyname('kod_fob').asinteger;
datamodule1.QueryD.ExecSQL;
QueryFob.Close;
QueryFob.Open;
except
MessageBox(Handle,'Ошибка!', 'Обратитесь к разработчику', mb_iconError + mb_Ok);
end;
end;
groupBox1.Visible:=false;
end;
Кнопка «Подтвердить»
procedure TFfob.BitBtnPClick(Sender: TObject);
begin
if (MessageBox(Handle,'Подтверждение !','Вы уверены', mb_iconWarning + mb_YesNo)= id_Yes) then
begin
try
datamodule1.QueryD.Close;
datamodule1.QueryD.sql.Clear;
if GroupBox1.caption=BitbtnI.Caption then
begin
datamodule1.QueryD.sql.add('insert into fob(name_fob) values(:name_fob)');
end;
if GroupBox1.caption=BitbtnU.Caption then
begin
datamodule1.QueryD.sql.add('update fob setname_fob=:name_fob where kod_fob=:kod_fob');
datamodule1.QueryD.parambyname('kod_fob').asinteger:=QueryFob.fieldbyname('kod_fob').asinteger;
end;
datamodule1.QueryD.parambyname('name_fob').asstring:=edit1.Text;
datamodule1.QueryD.ExecSQL;
ibqueryFob.Close;
ibqueryFob.Open;
except
MessageBox(Handle,'Ошибка!', 'Обратитесь к разработчику', mb_iconError + mb_Ok);
end;
end;
groupBox1.Visible:=false;
end;
Функции API Windows для запуска из приложения внешних программ
Функция ShellExecute
Открывает или печатает указанный файл или открывает указанную папку.
Модуль ShellApi
Определение
Function shellExecute (Wnd: HWnd; Operation, FileName, Parameters, Directory: PChar; SnowCmd: Integer ) : THandl;
Описание
Параметр |
Описание |
|
Wnd |
Родительское окно, в котром отображаются сообщения запускаемого приложения. |
|
Operation |
open -открыть, print - напечатать файл, explore -открыть папку, nil- по умолчанию выполняется open |
|
FileName |
Имя открываемого файла |
|
Parameters |
Nil – открываемый документ |
|
Directory |
Католог по умолчанию |
|
ShowCmd |
Режим открытия указанного файла |
|
Sw_hide |
Окно делается невидимым |
|
Sw_minimize |
Свертывает указанное окно |
|
Sw_maximize |
Развертывает указанное окно |
|
Sw_restore |
Активизирует и отображает окно |
|
Sw_shownormal |
Активизирует и отображает окно |
Параметры функции:
Если возвращаемое функцией значение меньше или равно 32, это указывает на ошибку.
Примеры:
Открыть файл документа file.doc
ShellExecute(Handle, nil, ‘file.doc’,nil,nil,sw_shownormal);
Печать документа
ShellExecute(Handle, ‘print’, ‘file.doc’,nil,nil,sw_restore);
Открытия приложения «Калькулятор»
ShellExecute(Handle, ‘open’, ‘calc’,nil,nil,sw_restore);
Открыть папку c:\Program files\Borland
ShellExecute(Handle, ‘explore’, ‘c:\Program files\Borland’,nil,nil,sw_restore);
Печать и разработка отчетов.
Печать форм методом Print
Ф
ормы
в Delphi
имеют метод Print,
который печатает клиентскую область
формы. При этом полоса заголовка формы
и полоса главного меню не печатается.
Таким образом, можно включить в приложение
форму, в которой пользователь во время
выполнения размещает необходимые для
печати результаты. Если имя этой формы
Form2,
то ее печать может выполняться оператором
Form2.Print;
Свойство формы PrintScale определяет опции масштабирования изображения при печати
poNone – Масштабирование не используется. Размер изображения может изменяться в зависимости от используемого принтера.
poPrintToFit – Делается попытка напечатать изображение формы того же размера, который виден на экране.
poProportional – Увеличивает или уменьшает размер изображения, подгоняя его под размер страницы, заданный при установке принтера. Это значение принято по умолчанию.
Методы компонентов, обеспечивающих печать.
Ряд компонентов в Delphi имеют методы, обеспечивающие печать хранящихся в них данных. Например, компонент RichEdit имеет метод Print, позволяющий печатать в обогащенном формате текст, хранящийся в компоненте. Например, оператор
RichEdit1.Print(‘любое имя’);
Создание отчетов с помощью Rave.
Для подготовки отчетов в версиях Delphi7 имеется страница Rave с компонентами системы Rave Reports фирмы Nevrona. Система состоит как бы из двух частей: редактора Rave, позволяющего визуально проектировать форму отчета, и страницы компонентов Rave. Открыть редактор можно из среды Delphi7 командой Tools | Rave Designer. Перед Вами откроется окно редактора (рис.1).
В центральной части окна расположено поле страницы будущего отчета. На него можно переносить компоненты, например со страницы Standart (это своя страница отчета, не путать со страницей в Delphi). В правой части экрана редактора размещается дерево отчетов, включенных в текущий проект, включая страницы и размещенные на них компоненты. В левой части окна расположен Инспектор Объектов (ИО), подобный тому, с которым Вы уже освоились в Delphi. Состав свойств, отображаемых в окне Инспектора Объектов, зависит от настроек меню Edit | Preferences, в разделе Environment, в разделе радиокнопок User Level: Beginner - начинающий, Intermediate - средний, Advanced – продвинутый. Целесообразно выбрать Advanced.
Н
овый
проект можно открыть, выбрав File
| New.
Каждый проект Rave
может включать несколько отчетов.
Команда File
| New
Report
Page
создаст новую страницу в проекте.
К
омпонент
Bitmap
со страницы Standard.
Свойство FileLink
– файл, содержимое которого отображается
в компоненте. Например, можно связать
с файлом c:\Program
Files\
Common
Files\
Borland
Shared\
Images\
Splash\
16Color
\athena.bmp.
Свойство Anchor
компонента позволяет выбрать привязку
поля компонента к странице.
Компонент Text со страницы Standard. Свойство Text для отображения надписей. Свойство Font позволяет выбрать шрифт (при проблемах с русским отображением выбирайте системный шрифт Ms Sans Serif).
К
омпонент
Memo
со страницы Standard
используется
для отображения многострочной текстовой
информации.
Этот компонент
имеет свойства
Text,
Fonts,
FontJustify
(выравнивание
текста внутри окна).
Компонент DataText со страницы Report используется для отображения текущей даты, времени, номера страниц, общее число страниц и т. п. Для этого в ИО выберите свойство DataField, нажав кнопку с тремя точками рядом с этим свойством, появится новое окно (рис.2). В выпадающем списке Report Variables выберите нужную переменную, например DateShort. После этого щелкните на кнопке Insert Report Var. В панель Data Text занесется текст «Report.DateSort», который обеспечит отображение даты. Если в отчет входит несколько страниц, то можно задать последовательность их отображения. Для этого выделите в дереве проекта вершину вашего отчета (Report). В ИО выберите свойство PageList – список страниц. Щелкните на кнопке с многоточием около этого свойства. Откроется окно (рис.3). Из выпадающего списка Report Pages Вы можете выбрать поочередно страницы отчета, и кнопкой Add Page добавить выбранные страницы в список Page List. Кнопками со стрелками можно поменять последовательность страниц. Свойство FullName служит для пояснения (можно ввести несколько слов русского текста). Свойство Description может содержать развернутое многострочное пояснение.
Команда File | Save as сохраняет отчет. Команда File | Execute Report запускает отчет на выполнение.
Компоненты Delphi для связи с Rave
Вернемся в среду Delphi. Компоненты Delphi, обеспечивающие работу с отчетами Rave, расположены на странице Rave. Основным из них является RvProject. Установите свойство ProjectFile этого компонента на имя файла проекта (с расширением .rav). Метод Execute вызывает выполнение отчета. Для этого на событие Click соответствующей кнопки напишите оператор RvProject1.Execute;
Запустите программу. Щелкните по кнопке, запустится отчет и Вы увидите окно (рис.4)
Возможности компонента RvProject могут быть существенно расширены , если в приложение перенести компонент RvSystem (рис.5) и в свойстве Engine компонента RvProect сослаться на введенный компонент RvSystem1. Тогда при выполнении методов Execute и ExecuteReport компонента RvProject будут учитываться установки, заданные в компоненте RvSystem. А в этом компоненте имеется множество свойств, позволяющих раздельно выполнять операции, связанные с предварительным просмотром и печатью, задаваь настроечные параметры операций. Свойство DefaultDest задает операцию, выполняемую по умолчанию: RdFile –печать в файл, rdPreview – предварительный просмотр, rdPrinter – печать. Множество подсвойств таких свойств, как SystemPreview, SystemPrinter, SystemSetup позволяют программно во время проектирования задать соответственно опции просмотра, печати и окна.
Создание отчетов на основе информации из базы данных.
В
ыведем
список слушателей из базы данных.
Перенесите на форму компонент Table.
Соедините этот компонент с таблицей
osndan.
Перенесите на форму со страницы Rave
компонент RvDataSetConnection.
Компонент RvDataSetConnection
свяжите его свойством DataSet
с набором данных Table1.
Перенесите на форму компонент RvProect.
На этом пока можно остановиться и перейти
к созданию формы отчета. Выполните в
Delphi
команду Tools
| Rave
Designer.
Откроется окно редактора Rave
(рис. 1). Первое, что нам нужно сделать –
ввести объекты просмотра источников
данных. Для этого выполните команду
File
| New
Data
Object.
Перед Вами откроется окно выбора типа
объекта (рис.8). Выделите в нем Direct
Data
New
и щелкните
на кнопке Next.
Следующее диалоговое окно будет содержать
список активных соединений Вашего
проекта: RvDataSetConnection1.
Выберите его и щелкните на кнопке Finish.
В дереве объектов с права в вершине Data
View
Dictionary
появится вершина DataView1,
раскрыв которую Вы сможете увидеть
доступные в проекте объекты полей.
Можете удалить клавишей Delete
те из них, которые вам не потребуются.
Теперь приступим к формированию формы
отчета. Начните с того, что со страницы
Report
палитры компонентов перенесите на
страницу отчета компонент Region
(седьмая
справа пиктограмма на рис.7). Компонент
Region1
будет содержать весь наш отчет. Так что
растяните его на всю площадь страницы
отчета, учитывая поля. Этот компонент
Region1
является контейнером, включающим в
себя полосы, из которых создается отчет.
Один из видов полос – Band.
Эти полосы будут печататься один раз.
Другой вид полос – DataBand.
Эти полосы связываются с источником
данных, и будут печататься столько раз,
сколько записей в соответствующей
таблице д
анных.
В нашем приложении первая полоса должна
содержать заголовок отчета. Так что
перенесите со страницы Report
палитры компонентов компонент Band
(шестая справа пиктограмма на рис.7).
Полоса растянется по горизонтали на
всю ширину Region1.
А ее высоту нужно увеличить, чтобы можно
было разместить на полосе компоненты
текстов. Перенесите на полосу компонент
Text
со страницы Standart
(седьмая
справа пиктограмма на рис.6). Растяните
его на всю ширину полосы, напишите в
свойстве Text
«Список слушателей», выберите с помощью
страницы Fonts
(рис.9) подходящий шрифт и размер. Вторая
часть заголовка должна содержать текущую
дату. Поэтому для второй части возьмите
компонент DataText
со страницы Report
(крайняя левая пиктограмма на рис.7 ). В
свойстве DataField
задайте строку:
' по состоянию на ' + Report.DateShort
Затем добавьте полосу DataBand. В его свойстве DataView укажите объект DataView1. Осталось разместить на ней компоненты , отображающие фамилию, имя, отчество. Для этого поместите на полосу компоненты DataText, связав каждый из них с отдельным полем таблицы данных в свойсве dataField. Разработка формы отчета завершена. Сохраним его. Теперь вернемся в среду Delphi и завершим приложение, работающее с нашим отчетом. В свойстве ProjectFile компонента RvProect1 укажите файл созданного Вами проекта. Перенесите на форму кнопку и в обработчике его щелчка запишите оператор:
RvProject1.Execute;
Сохраните проект. Запустите и убедитесь, что он работает.
Технология Com
Т
ехнология
Com
(Component
Object
Model
– компонентная модель объектов)
предоставляет возможность одной
программе (клиенту) работать с объектом
другой программы (сервера). Com
– это модель объекта, которая
предусматривает полную совместимость
во взаимодействии между компонентами,
написанными разными компаниями и на
разных языках. Сервером может быть
исполняемый файл или библиотека DLL.
Клиент получает указатель на интересующий
его интерфейс объекта и через этот
указатель может вызывать методы объекта.
Использование серверов Com для документирования данных.
При составлении отчетов, содержащих сведения, черпаемые из баз данных, можно использовать систему Rave. Однако Rave накладывает на форму отчетов достаточно жесткие ограничения. На основе Rave можно разработать приложения для некоторых стандартных отчетов с часто обновляемыми данными. Но нередко хотелось бы иметь значительно большую свободу при компоновке и написании отчетов, хотелось бы вставлять данные в некий произвольный текст и в произвольной форме. Такую возможность дает программа Microsoft Word. Взаимодействие с Word, Excel и др. может осуществляться с помощью компонентов, размещенных на странице Servers. Но прежде необходимо проверить совместимость с различными версиями Windows и Microsoft Office (рис. 10).
Компонент WordApplication
У этого компонента очень немного свойств (рис. 11). Свойство AutoConnect определяет, должен ли сервер автоматически загружаться с началом выполнения приложения. Но желательно вызывать этот метод. Например:
WordApplication1.Connect;
Свойство ConnectKind определяет, как именно осуществляется соединение с сервером. Значение по умолчанию ckRunningOrNew – подсоединиться к выполняеющемуся серверу или создать новый экземпляр сервера.
Ниже описаны значения, которые может принимать ConnectKind:
CkRunningOrNew - Контроллер производит подключение к уже существующему процессу, или запускает новый процесс, при отсутствии такового. Этот вид взаимодействия между COM сервером и контроллером наиболее часто применяется на практике. Такое значение свойства установлено по умолчанию.
CkNewInstance- При соединении с сервером каждый раз создается новый экземпляр
CkRunningInstance - Соединение устанавливается с уже запущенным COM сервером. Если таковой отсутствует – будет создан соответствующий объект ошибки, который необходимо обработать
CkRemote - Это значение используется совместно со свойством RemoteMachineName, если необходимо подключиться к серверу на удаленной машине
ckAttachToInterface - При установке этого значения интерфейс не создается и соответственно нельзя указывать значение True для свойства AutoConnect. Соединение с сервером производится с помощью метода ConnectTo
После того как Вы установили соединение с сервером, он еще не становится видимым, хотя можно вызывать его методы. Для того, чтобы пользователь увидел сервер, нужно задать его свойству Visible значение True. Например:
WordApplication1.Visible:=true;
Метод Disconnect разрывает соединение с сервером.
Если Вы хотите создать новый документ на основе обычного шаблона, нужно написать опрератор
WordApplication1.Documents.Add(EmptyParam,EmptyParam);
Например код
WordApplication1.Selection.InsertAfter(‘’+#13);
WordApplication1.Selection.InsertAfter(‘Дорогой ’+Edit1.Text+ ‘!’+#13);
Вставляет после Selection пустую строку, затем переходит на новую строку и вставляет текст «Дорогой…!»
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
WordApplication1.Connect;
WordApplication1.Documents.add(EmptyParam,Emptyparam);
WordDocument1.ConnectTo( WordApplication1.ActiveDocument);
WordDocument1.Range.InsertAfter(#13+'Переход к документу'+#13+
WordApplication1.ActiveDocument.Get_FullName+' произведен :'+DateTimeToStr(Now));
WordApplication1.Visible:=true;
WordApplication1.Disconnect;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
ExcelApplication1.Connect;
ExcelApplication1.Visible[0]:=true;
ExcelApplication1.Workbooks.Add(EmptyParam,0);
ExcelApplication1.Range['D6','D6'].Select;
ExcelApplication1.ActiveCell.FormulaR1C1:='10';
ExcelApplication1.Range['A1','A1'].Select;
ExcelApplication1.ActiveCell.FormulaR1C1:='1';
ExcelApplication1.Range['A2','A2'].Select;
ExcelApplication1.ActiveCell.FormulaR1C1:='2';
ExcelApplication1.Range['A3','A3'].Select;
ExcelApplication1.ActiveCell.FormulaR1C1:='3';
ExcelApplication1.Range['A4','A4'].Select;
ExcelApplication1.ActiveCell.FormulaR1C1:='4';
ExcelApplication1.Range['A5','A5'].Select;
ExcelApplication1.ActiveCell.FormulaR1C1:='5';
//последовательно заносим значения в первый столбец и переходим к новой ячейке для введения формулы ExcelApplication1.Range['A7','A7'].Select;
ExcelApplication1.ActiveCell.Formula:='Сумма:';
ExcelApplication1.Range['B7','B7'].Select;
ExcelApplication1.ActiveCell.Formula:='=SUM(A1:A5)';
//записали в ячейку значение, полученное применением системной функции самого Excel ExcelApplication1.Range['A9','A9'].Select;
ExcelApplication1.ActiveCell.Formula:='Выражение:';
ExcelApplication1.Range['B9','B9'].Select;
ExcelApplication1.ActiveCell.Formula:='=(A1+A2)*2+A3-A5+A4';
excelApplication1.Disconnect;
end;
Разработка справочной системы (создание файлов.hlp)
Р
азработка
справочной системы (рис.1) осуществляется
не Delphi,
а средствами Windows.
Просмотр ее также осуществляется
программой Windows
WinHelp.
Delphi
только позволяет встроить справочную
систему в приложение. Однако, поскольку
полноценное приложение немыслимо без
хорошо разработанной справочной системы,
мы коротко рассмотрим некоторые основные
вопросы, связанные с ее созданием.
разработка справки состоит их двух
основных этапов:
Создание файла или нескольких файлов, содержащих темы справок. Это делается с помощью Microsoft Word.
Компиляция справки в один или несколько файлов.hlp и отладка всей справочной системы. Это осуществляется с помощью специальных программ
Создание файла тем справок.
Файл тем справок создается с помощью текстового редактора Microsof Word в формате .rtf. Каждая тема или кадр (в дальнейшем он будет отображаться в отдельном окне) занимает одну страницу. Друг от друга темы отделяются символом разрыва страницы. (Меню Вставка | Разрыв…начать новую страницу). В кадр могут специальным образом включаться рисунки, кнопки. Каждая тема содержит ряд сносок, определяющих ее отображение в WinHelp.
Сноски
Сноски в Word делаются командой Вставка | Сноска, после чего откроется диалоговое окно (рис.2).
Сноска #
Обозначают уникальный идентификатор темы, по которому на нее могут ссылаться другие темы. Этому идентификатору в дальнейшем будет ставиться в соответствие номер, по которому на данную тему может ссылаться использующее справку приложение. Идентификатор может писаться латинскими или русскими буквами и состоять из одного или нескольких слов.
Сноска K
Сноска с символом K (заглавная латинская K) должна включаться в кадр, если надо, чтобы тематика этого кадра отображалась в окне справочной системы на закладке "Предметный указатель" (рис.1) в списке, из которого пользователь может выбрать требуемую тему по ее первым буквам или просто пролистав список. Те названия тем, которые пользователь видит в предметном указателе - это и есть тексты сносок K соответствующих кадров. Текст сноски может состоять из одного или нескольких слов. Например KМеню правка. Можно также ввести несколько различных обозначений для одного и того же кадра, раздеряя их точками с запятой. Например, ссылка .
K
Меню
правка; Меню
обеспечит две строки в указателе: "Меню правка" и "Меню", которые будут ссылаться на одну и туже тему.
Сноска $
Сноска с символом $ определяет заголовок данной темы.
Переходы
Для того, чтобы выделить в тексте темы некоторое слово или сочетание слов, при щелчке на котором пользователь перейдет на другую тему, надо сделать следующее. Сразу после этих слов (без пробела) надо написать идентификатор темы, на которую надо перейти. Затем соответствующее слово или сочетание слов выделяется двойным подчеркиванием. Это подчеркивание не будет видно пользователю при работе со справкой - для него оно заменится выделением цветом (обычно зеленым). Следующий за подчеркнутыми словами идентификатор темы оформляется как скрытый. (Меню Формат | Шрифт).
Добавление изображений
В
тему можно добавлять изображения в виде
файлов типов .bmp,
.dib,
.wmf,
.shg,
.mrb.
Для этого можно просто воспользоваться
буфером обмена, занеся туда изображение.
Так целесообразно поступить, если данное
изображение используется только в одном
месте файла текстов тем. Если же оно
используется в нескольких местах, то
экономичнее использовать команды {mbc
<имя файла>} - позиционирует изображение
так же, как обычные символы. {mbl
<имя файла>}- позиционирует изображение
у левого края и обтекание текста справа;
{mbr
<имя файла>}>}- позиционирует
изображение у правого края и обтекание
текста слева.
Кнопки
Вы можете добавлять в текст кнопки, нажимая которые пользователь будет запускать тот или иной макрос. Это делается командой {button <надпись>, <список макросов>}. Например
{button см. также, Klink(Меню)}
Компиляция и отладка
Компиляция и отладка справки, предназначенной для Windows, производится с помощью программы Microsoft Help Workshop, запускаемой из файла Hcrtf, расположенного в каталоге Delphi\Help\tools. Эта программа позволяет легко создавать файл проекта справки, без которого ее нельзя компилировать.
С
оздание
файла Проекта справки
Запустите Delphi\Help\tools\Hcrtf.exe. В появившемся окне Microsoft Help Workshop (рис. 3) выполните команду меню File New и в появившемся окне New выберите опцию Help Project. Далее в окне Project File Name надо задать имя и каталог файла проекта справки. При этом учтите, что то же имя , какое вы зададите файлу Проекта, будет присвоено компилятором и завершающему файлу справки .hlp (впрочем, это можно отменить, задав другое имя файлу справки в окне Options на странице Files). Стандартное расширение файла проекта .hpj.
В
результате описанных действий перед
Вами появится окно заготовки файла
Проекта, в котором первоначально будет
занесен только раздел [Options]
(рис. 4).
Теперь, щелкая на соответствующих кнопках в правой части этого окна, можно создавать и заполнять другие разделы.
Кнопка Files
П
озволяет
указать имена файлов с текстами тем.
Щелкните по этой кнопке. перед Вами
появится окно Topic
Files
с кнопками (рис. 5), в котором надо щелкнуть
по кнопке Add…
и выбрать среди файлов подготовленный
файл текстов справки (файл с расширением
.rtf).
В результате в файле проекта появится
раздел [Files]
с внесенным в него именем файла. Если
Ваша справка компилируется из нескольких
файлов тем, то аналогичным образом вы
должны включить в раздел [Files]
и остальные файлы. Для файлов тем,
расположенных в том же каталоге, где
располагается файл Проекта hpj,
имена файлов могут указываться без
путей. Если же они расположены в другом
каталоге, то они указываются с путем.
Возможен и другой подход - в окне Topic
Files
можно щелкнуть на кнопке Folders…
и выбрать паку или папки, в которых
хранятся файлы тем. Тогда в файле Проекта
появится оператор Root,
в котором указана соответствующая
папка. Кнопка Remove
в окне Topic
Files
позволяет удалить файл тем из списка.
Кнопка Include…
позволяет включить в проект текстовый
файл ASCII,
содержащий список файлов тем.
Кнопка Windows.
П
озволяет
определить атрибуты окон, используемых
в справке. При щелчке на этой кнопке
открывается диалоговое окно Window
Properties
(рис. 6). Оно
имеет ряд страниц. На странице General
(общие
характеристики) Вы можете изменить
список определенных Вами типов окон,
добавляя в него (кнопкой Add…
) или удаляя (кнопкой Remove)
идентификаторы окон. Кнопка Include…
позволяет включить целый файл, содержащий
список окон. Дополнительным окнам вы
можете присваивать имена по Вашему
усмотрению. Эти имена затем могут
использоваться в сносках> и в операторах
переходов.
Установка опции Auto_size hright (автоматическое изменение высоты) делает окно изменяющимся по высоте в зависимости от объема темы. Это удобно, если у Вас есть темы, существенно различающиеся по объему. Главное окно (main) не может содержать эту опцию. Опция Keep Help window on top позволяет обеспечить положение данного окна справки всегда поверх остальных окон. Title bar text позволяет задать текст, который будет записан в полосе заголовка окна. Если этот текст не задан ни тут, ни в файле Содержания .cnt, то в заголовке окна просто не будет никакого текста.
Страница Position (положение) диалогового окна позволяет выбрать положение и размеры окна. Здесь особенно полезной является кноака Auto-Siser. Щелчок на ней вызывает появление на экране окна (рис. 7). Вы можете изменять размеры и позицию этого окна на экране. Когда Вы расположите окно так, как вам хочется, щелкните на кнопке Ok и выбранные Вами положение и размеры передадутся окну Вашей справки, атрибуты которого вы зададите. Страница Buttons позволяет задать кнопки, которые должны быть в окне. Страница Color позволяет выбрать цвета фона окна, причем отдельно для основной области текста, и для не прокручиваемого заголовка. кнопка Macros дает возможность определить макрос, выполняемый в момент открытия окна.
Кнопки Bitmaps.
Позволяет указать паки в которых Help Workshop сможет найти использованные в темах файлы изображений .bmp, если они расположены не в том каталоге, в котором находится файл проекта.
К
нопка
Map…
Если вы хотите, чтобы из Вашего проекта можно было управлять файлом справки, необходимо создать таблицу соответствия номеров контекстной справки, задаваемых в приложении, и идентификаторов тем.
Для
этого надо щелкнуть на кнопке Map,
в открывшемся диалоговом окне Map
(рис. 8) щелкнуть Add…
и в окне добавления нового входа Add
Map
Entry
(рис. 9) ввести идентификатор темы (в окно
Topic
ID)
и соответствующий номер (в окно Mapped
numeric
value),
по которому будет осуществляться ссылка
на эту тему из приложения. Можно также
ввести коментарий в окно Comment.
Этот коментарий просто будет занесен
в файл проекта и никак не повлияет на
справку. Но он очень пригодится вам,
когда Вы будете назначать значения
HelpContext
компонентам своего приложения. Затем
надо щелкнуть на O
k,
вернуться в окно Map
и опять
щелкнуть на Ok.
В результате подобных действий в файле
проекта появится раздел [Map].
Кнопка Alias…
Позволяет добавлять, редактировать и удалять псевдонимы идентификаторов тем, чтобы изменять переходы в файле справки, не меняя текстов тем.
Кнопка Config…
Позволяет указывать макросы, которые должны выполняться при каждом входе в справку.
Кнопка Data Files…
Позволяет указать файлы данных для библиотек DLL, используемых в Вашей справке.
Кнопка Options…
Открывает многостраничное диалоговое окно (рис. 10) Страница General позволяет задать идентификатор темы по умолчанию. Это тема, на которую будет осуществляться переход, при ошибочном задании идентификатора темы.
Создание простого файла проекта.
Для создания файла Проекта простой справки достаточно выполнить следующее:
Запустите Delphi\Help\tools\Hcrtf.exe. В появившемся окне Microsoft Help Workshop (рис. 3) выполните команду меню File | New и в появившемся окне New выберите опцию Help Project. Далее задайте имя Файла Проекта (желательно каталог выбрать тот, где лежит файл текстов .rtf). В результате описанных действий перед Вами появится окно заготовки файла Проекта, в котором первоначально будет занесен только раздел [Options] (рис. 4).
В открывшемся окне Проекта (рис.4) нажать кнопку Files… и в окне Topic Files щелкнуть на кнопке Add… и выбрать подготовленный файл текста справки .rtf.
Откомпилировать файл справки (Меню File | Compile или кнопка с пиктограммой мясорубки на панели инструментов). В результате выполнения этой команды откроется окно Compike a Help File (рис. 11). Опция Automatically display Help File in WinHelp when done обеспечивает сразу после компиляции просмотр скомпилированного файла справки. Если Вы не установили опцию Minimize window while compiling, то во время компиляции Вы будете видеть окно, с работающей мясорубкой, отражающей процесс компиляции. Опция Turn off compression (reduces compile time) позволяет временно отключить сжатие файла. Это приведет к увеличению размера файла справки, но заметно уменьшит время компиляции больших справок. После компиляции Вы увидите в окне содержимое текстового файла Compilation, в котором содержатся сведения о результатах компиляции.
Все остальное - дело совершенствования этой справки, ее оформления и т.п.
Ф
айл
содержания - .cnt
Файл
содержания (Contents
file),
имеющий расширение .cnt,
является текстовым файлом, который
можно проектировать с помощью Microsoft
Help
WorkShop
и присоединять его к файлу проекта
справки. Этот файл обеспечивает при
работе со справкой страницу Содержание
в окне справочной системы, в которой в
виде пиктограмм открытых и закрытых
книг и пиктограмм тем отражается
структура справки. Чтобы создать новый
файл содержания, надо запустить
Delphi\Help\tools\Hcrtf.exe.
В появившемся окне Microsoft
Help
Workshop
(рис. 3) выполнить команду меню File
| New
и в появившемся окне New
выберите опцию Help
Contents.
Откроется окно с загруженным в него
файлом содержания (рис. 12). В верхних
окнах надо задать: в левом - имя файла
. hlp,
в правом заголовок, который будет
появляться в окне содержание при работе
со справочной системой. Нижнее окно
заполняется с помощью кнопок Add
Above…и
Add
Below…
Первая из
этих кнопок вставляет новую строку выше
той, в которой находится в данный момент
курсор, а вторая - ниже этой строки. При
нажатии любой из этих кнопок открывается
окно Edit
Contents
Tab
Entry
(рис. 13), в котором Вы можете задать
очередной заголовок (Heading),
отображающийся в виде книги, и
ли
очередную тему (Topic).
Для заголовка указывается только его
текст (Title).
Для темы записывается ее название
(Title),
которое появится на странице Содержание
справки, и идентификатор темы (Topic
ID),
указанный в файле тем. Если справка
использует несколько файлов .hlp,
то указывается также имя файла (Help
file),
содержащего данную тему. Может также
указываться тип окна (Window
type)
- одного из тех, которые указаны в файле
проекта (если они там указаны). Если
отображение должно проводиться в окне
по умолчанию, то вид окна не указывается.
В этом окне можно также задать макрос
(Macro)
или включить внешний файл содержания
(Include).
В
окне (рис. 12) кнопки Move
Right
и Move
Left
позволяют сдвигать вправо и влево
выделенные строки заголовков и тем,
обеспечивая нужные отступы, характеризующие
многоуровневую структуру. При этом
строки тем, относящиеся к одному
заголовку, располагаются на один шаг
правее своего заголовка и не могут
сдвигаться относительно друг друга.
(Вообще-то сдвигать можно, но это не
отобразится в справке). Кнопка Edit..
позволяет редактировать выделенную
строку, а кнопка Remove
удаляет строку.
Подключение справки в Delphi
Вызов справки при щелчке по кнопке:
Procedure TFosn.SpeedButton1.Click(Sender: TObject);
Begin
Application.HelpContext(30);
End;
Создание и хранение шаблонов компонентов.
В
процессе разработки различных приложений
нередко используются одинаковые
компоненты, с одинаковыми обработчиками
событий. Каждый раз повторять все эти
настройки – непроизводительная трата
собственных сил и времени. Наиболее
простой способ сохранения разработанных
вами компонентов или групп компонентов
для последующего их использования в
других проектах – запоминание в
библиотеке визуальных компонентов
соответствующих шаблонов. Рассмотрим
пример. Пусть Вы хотите на основе
компонента Edit
создать окно редактирования, в котором
пользователь мог бы вводить только
целые числа, т.е. не мог бы вводить никаких
других символов, кроме цифр. Кроме того,
при нажатии Enter
фокус должен передаваться следующему
компоненту в последовательности
табуляции. Это можно сделать, например,
следующим образом.
О
ткройте
новое приложение и перенесите на форму
компонент типа Edit.
Измените также текст в окне (свойство
Text)
на ‘0’. В обработчике события OnKeyPress
компонента напишите оператор
If not (key in [‘0’..’9’]) then key:=#0;
А в обработчике события OnKeyDown – оператор:
If (Key=VK_RETURN) then FindNextControl(Sender as TWinControl,true, true, false).SetFocus
Сохраним этот шаблон в библиотеке визуальных компонентов, чтобы в дальнейшем включать подобный компонент в другие приложения. Для этого надо, выделив предварительно данный компонент, выполнить команду Component | Create Component Template (создать шаблон компонента). В открывшемся диалоговом окне Component Template Information (рис.1) вы можете задать имя компонента (например EditNum). В выпадающем списке Вы можете выбрать страницу библиотеки визуальных компонентов, на которой хотите разместить пиктограмму компонента. Вы можете также указать новое имя (например «Мои шаблоны) и тогда в библиотеке визуальных компонентов будет создана новая страница с этим именем. Можно также изменить пиктограмму данного компонента (кнопка Change). Пиктограмма, если Вы ее хотите сменить, должна быть подготовлена заранее в виде файла .bmp размером 24 на 24. Ваш шаблон появится в библиотеке. Вы можете убедиться в этом, посмотрев на указанную вами страницу библиотеки. Теперь попробуйте создать новое приложение и перенести на форму созданный вами компонент. Вы увидите, что он появится на форме в том виде, в котором Вы записали его в библиотеку. Посмотрев на закладку событий этого компонента В Инспекторе объектов, вы увидите, что на ней указаны обработчики событий OnKeyDown и OnKeyPress, а в процедурах этих обработчиков уже записаны те операторы, которые Вы написали перед созданием шаблона. Правда у этого подхода имеется определенный недостаток. Если на форме разместить несколько таких компонентов, то для каждого из них в текст модуля включатся соответствующие обработчики событий. А это уже явная избыточность. Чтобы избежать избыточности, желательно будет оставить в модуле по одному обработчику каждого вида, остальные удалить из текста, а во всех окнах редактирования сослаться на оставшиеся обработчики.
Аналогичным образом можно создавать шаблоны не только отдельных компонентов, но и групп компонентов, расположенных , например на панели.
Если в дальнейшем Вам перестанет нравиться созданный Вами шаблон, вы можете удалить его из библиотеки. Для этого надо выполнить команду Component | Configure Palette. При выполнении этой команды вы увидите диалоговое окно страницы Palette опций среды Delphi (рис.2). Вы можете удалить ваш шаблон.
Создание новых компонентов и включение их в библиотеку.
Создание новых компонентов дает, конечно, неизмеримо больше возможностей, чем построение шаблонов имеющихся компонентов.
С
оздадим
окно редактирования, в котором по желанию
во время проектирования и во время
выполнения можно будет разрешать ввод
только цифр (например, если предполагается,
что пользователь должен вводить целое
число), запрещать ввод цифр (например,
при вводе пользователем фамилии, имени
и отчества) или разрешать ввод любых
символов. Кроме того, предусмотрим
очистку содержимого окна и свойство,
показывающее был ли модифицирован
пользователем текст с момента последней
очистки. В момент очистки определим
генерацию соответствующего события,
которое пользователь при желании может
обрабатывать.
П
остроим
наш компонент как наследника класса
TEdit
и назовем наш новый класс TEditLetNum.
В компонент, помимо свойств, обычных
для Tedit,
желательно добавить два новых свойства:
EnabledNum
(разрешает или запрещает ввод цифр) и
EnabledLet
(запрещает или разрешает ввод каких-либо
символов, кроме цифр). Тип обоих свойств
Boolean.
Если EnabledNum=true
и EnabledLet=true,
то это будет обычное окно редактирования.
Если EnabledNum=true
и EnabledLet=false,
получим
окно, в которое можно вводить только
цифры. EnabledNum=false
и EnabledLet=true,
то в окно
запрещено вводить цифры. Ну а ситуацию,
когда EnabledNum=false
и EnabledLet=false,
надо запретить поскольку
в такое окно ничего ввести невозможно.
Предусмотрим в компоненте метод Clear – очистку текста в окне, и свойство Modified, которое будет показывать, был ли модифицирован текст с момента последней очистки. В момент очистки будем генерировать событие OnClear.
Компоненты Delphi компилируются в пакеты. Для создания нового пакета:
Закройте текущий проект, выполните команду File | New | Other и в диалоговом окне New Items на странице New выберите пиктограмму Package – пакет. Вам будет задан вопрос об имени файла и его описании. После этого Вы попадете в окно Диспетчера Пакетов (Package Manager рис.3). В этом окне Contains – содержимое пакета, а Requires – список других пакетов, требующихся для поддержания вашего.
Сохраните пакет под именем, например «MyComp.dpk»
Щелкнув на кнопке Add (рис.3), Вы попадаете в окно (рис.4) в котором Выберите закладку New Component. В выпадающем списке Ancestor Type выберите родительский тип «TEdit[StdCtrls]». Имя нового класса введите «TEditLetNum». Страницу в библиотеке компонентов введите «Мои компоненты». Проверьте также имя модуля и путь вновь создаваемого компонента.
Щелкните на OK и Вы вернетесь в окно диспетчера Пакетов (рис.3), но в нем уже появится имя Вашего компонента (если не вернетесь, то откройте).
Щелкните на кнопке Install, и компонент будет установлен на указанной Вами странице библиотеки компонентов. Можете открыть эту страницу и увидеть его там. Выполнив в окне Диспетчера Пакетов двойной щелчок на имени файла компонента, Вы можете перейти в окно редактирования и увидеть, что в нем появилась заготовка модуля Вашего компонента. Сохраните ее в файле (File | Save).
Чтобы скомпилировать модуль Вашего компонента, можно щелкнуть в окне Диспетчера пакетов на кнопке Compile. Но в заданном случае модуль уже скомпилирован во время его установки. При выходе из Диспетчера пакетов Вам будет задан вопрос о сохранении информации в файле пакета (расширение этого файла .dpk). Ответьте на вопрос утвердительно.
Если Вы захотите удалить какой-нибудь модуль из пакета, это можно сделать в окне диспетчера пакетов, выделив нужный модуль и щелкнув на кнопке Remove. Удалить сам зарегистрированный пакет можно следующим образом:
Выполните команду Project Options из главного меню
Выберите страницу Package.
На этой странице щелкните на пакете, который хотите удалить, и затем щелкните на Remove.
Структура класса компонента
Заготовка модуля компонента, созданная в результате указанных ранее действий, имеет следующий вид:
unit EditLetNum;
interface
uses
SysUtils, Classes, Controls, StdCtrls;
type
TEditLetNum = class(TEdit)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Мои компоненты', [TEditLetNum]);
end;
end.
Собственно говоря, в этой заготовке пока только каркас будущего модуля и внесена одна процедура – Register, которая регистрирует компонент на заданной странице библиотеки. Рассмотрим коротко описание класса. Вы видите в нем разделы, которые определяют четыре варианта доступа к переменным, процедурам и функциям:
Private (закрытые). Процедуры и функции, определенные таким образом, доступны только в пределах данного модуля.
Protected (защищенные) Процедуры и функции, определенные таким образом, доступны в классах потомков.
Public (открытые). Эти процедуры и функции доступны везде.
Published. (опубликованные). Процедуры и функции доступны везде и имеют связь со средой разработки Delphi, обеспечивающие вывод на экран в Инспекторе Объектов страниц информации о свойствах и событиях.
Напомню определение объекта (компонент – это объект): Объект – это совокупность свойств, методов и обработчиков событий. Причем свойства – это совокупность полей данных и методов их чтения и записи. Вспомним также принцип скрытия информации. Исходя из этого, разработчик компонента должен продумать, в какиеразделы вставить вводимые им поля данных, свойства и методы.
Свойства.
Поля данных всегда должны быть защищены от несанкционированного доступа. Поэтому их целесообразно определять в Private – закрытом разделе класса. В редких случаях их можно помещать в Protected – защищенном разделе класса, чтобы возможные потомки данного класса имели к ним доступ. Традиционно идентификаторы полей совпадают с именами соответствующих свойств, но с добавлением в качестве префикса символа «F». Таки образом, в нашем примере Вы можете занести в раздел Private объявления трех необходимых нам полей данных:
private
{ Private declarations }
FEnableNum: boolean;
FEnableLet: boolean;
FMofified: boolean;
Теперь надо объявить свойства – методы чтения и записи этих полей. Свойство объявляется оператором вида:
Property <имя>: <тип> read <имя аоля или метода чтения>
write <имя поля или метода записи>
<директивы запоминания>
Если в разделах read или write записано имя поля, значит предполагается прямое чтение или запись данных.
Если в разделе read записано имя метода чтения, то чтение будет осуществляться только функцией с этим именем. Функция чтения – это функция без параметра, возвращающая значение того типа, который объявлен для свойств. Имя функции чтения принято начинать с префикса Get, после которого следует имя свойства.
Если в разделе write записано имя метода записи, то запись будет осуществляться только процедурой с этим именем. Процедура записи – это процедура с одним параметром того типа, который объявлен для свойства. Имя процедуры записи принято начинать с префикса Set, после которого следует имя свойства.
Если раздел write отсутствует в объявлении свойства, значит это свойство только для чтения и пользователь не может задавать его значение.
Директивы запоминания определяют, как надо сохранять значения свойств при сохранении пользователем файла .dfm. Чаще всего используется директива
Defult <значение по умолчанию>
Она не задает начальные условия. Это дело конструктора. Директива просто говорит, что если пользователь в процессе проектирования не изменил значение свойства по умолчанию, то сохранять значение свойства не надо.
Итак, для нашего примера объявления свойств могут иметь вид:
public
{ Public declarations }
property Modified: boolean read FModified default true;
published
{ Published declarations }
Property EnableNum: boolean read FEnableNum write SetEnableNum default true;
Property EnableLet: boolean read FEnableLet write SetEnableLet default true;
Объявление свойства Modified помещается в раздел Public, поскольку это свойство должно быть доступно только во время выполнения. Свойства EnableNum и EnableLet помещаются в раздел Published, так как они должны отображаться в Инспекторе объектов во время проектирования. Свойства EnableNum и EnableLet имеют прямой доступ к полям для чтения. Но для записи они имеют методы SetEnableNum и SetEnableLet соответственно. Это связанос тем, что при записи свойств надо проверять, не окажутся ли значения обоих этих свойств равными false. Подобное задание значений надо предотвращать, поскольку в этом случае в окно редактирования вообще ничего нельзя будет ввести.
Свойство Modified вообще не имеет метода записи, поскольку оно предназначено только для чтения.
Указанные в объявлениях методы записи могут быть реализованы прстыми процедурами, объявления которых помещаются в private – закрытый раздел класса, а их реализация помещается в раздел модуля implementation – реализация.
Для того, чтобы задать свойствам начальные значения, надо еще объявить т написать конструктор. В итоге имеем:
unit EditLetNum;
interface
uses
Windows, Messages,SysUtils, Classes,Graphics,Controls,
Forms,Dialogs,StdCtrls;
type
TEditLetNum = class(TEdit)
private
{ Private declarations }
FEnableNum: boolean;
FEnableLet: boolean;
FModified: boolean;
protected
{ Protected declarations }
procedure SetEnableNum (Value:boolean);// Процедура записи
procedure SetEnableLet (Value:boolean);// Процедура записи
public
{ Public declarations }
property Modified: boolean read FModified default true;
constructor create (Aowner:TComponent);override;// конструктор
published
{ Published declarations }
Property EnableNum: boolean read FEnableNum write SetEnableNum default true;
Property EnableLet: boolean read FEnableLet write SetEnableLet default true;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Мои компоненты', [TEditLetNum]);
end;
procedure TEditLetNum.SetEnableNum(Value:boolean);
begin
FENableNum:=Value;// Присваивание значения полю FENableNum
{если значения FENableNum è FENableLet=false,
то полю FENableLet присваивается true}
if (not Value) then if (not FENableLet) then FENableLet:=true;
end;
procedure TEditLetNum.SetEnableLet(Value:boolean);
begin
FENableLet:=Value;// Присваивание значения полю FENableLet
{ если значения FENableNum è FENableLet=false,
то полю FENableNum присваивается true}
if (not Value) then if (not FENableNum) then FENableLet:=true;
end;
Constructor TEditLetNum.Create(AOwner:TComponent);
begin
inherited create (AOwner);//Вызов конструктора класса ролителя
FEnableNum:=true;
FEnableLet:=true;
FModified:=false;
end;
end.
Процедуры, реализующие методы записи, присваивают полю переданное значение Value и в случае, если передано значение false, проверяют значение другого поля. Если и другое поле имеет значение false, то оно исправляется на true.
Объявления процедур записи включены в раздел protected. Это означает, что они закрыты для внешнего пользователя, но доступны для возможных потомков Вашего класса.
Конструктор объявлен в открытом разделе класса public и имеет стандартное имя – create. Указанная после объявления конструктора директива Override говорит о том, что производится переопределение конструктора класса – родителя. В реализации конструктора первый оператор
Inherited create(AOwner); // Вызов конструктора класса родителя
Обеспечивает вызов конструктора родительского класса, который и выполняет основную работу по созданию объекта. Ключевое слово inherited показывает, что вызывается именно метод родительского класса. Последующие операторы конструктора просто задают начальные значения новым свойствам, которые вы добавили в компонент.
Обратите внимание, что в реализации всех процедур к имени процедуры добавляется в начале имя класса.
В окне Диспетчера Пакетов, выделив компоненту, еще раз откомпилируйте измененный модуль.
Откройте новый проект и внесите в него с соответствующей страницы ваш новый компонент. Взгляните на его свойства в Инспекторе Объектов. Вы найдете там добавленные вами свойства EnableNum и Enablelet. Оба свойства имеют по умолчанию заданные в конструкторе значения True. Попробуйте изменить оба значения на false. Это Вам не удастся сделать, так как сработают написанные вами методы записи. Свойство Modified в инспекторе объектов Вы не увидите, так как это свойство может использоваться только во время выполнения.
Методы
Методы включаются в открытый раздел класса – раздел public, поскольку иначе их нельзя было бы использовать. Собственно один метод – Create Вы уже написали, причем переопределили соответствующий метод родительского класса. Теперь вам нужно написать метод Clear, очищающий содержимое окна редактирования и устанавливающий значение поля FModified равным false. В этом случае объявление и реализация метода Clear может иметь вид:
Во втором способе можно не обращаться к родительскому методу.
Теперь запишем процедуру, разрешающую или запрещающую ввод символов того или иного типа. Для этого нам надо анализировать вводимый пользователем символ. Это можно сделать при обработке события OnKeyPress. Значит, нам надо переопределить стандартный обработчик этого события в родительской компоненте TEdit. Стандартные обработчики имеют то же имя, что и события, но без префикса On. То
ПервыйI способ public { Public declarations } ……… procedure Clear;override; ……... implementation ……….. procedure TEditLetNum.Clear; begin inherited Clear;// Вызов родительского метода FModified:=false; end; |
Второй способ public { Public declarations } ……… procedure Clear; ……... implementation ……….. procedure TEditLetNum.Clear; begin Text:=’’; FModified:=false; end; |
procedure KeyPress(var Key:Char);override;
В разделе implementation напишем:
procedure TEditLetNum.KeyPress(var Key:Char);
begin
if (not FenableNum) and (key in['0'..'9']) then Key:=#0;
if (not FenableLet) and not ((key in['0'..'9'])or(ord(key)=8)) then Key:=#0;
if (Key<>#0) then FModified:=true;
inherited KeyPress(key);
end;
Эта процедура заменяет недопустимые символы нулевыми. Если символ допустимый, то задается значение trueполю свойства FModified и затем вызывается метод KeyPress родительского класса.
Заново откомпилируйте модуль нового компонента в окне Диспетчера Пакетов. Можете протестировать полученный компонент.
События
Необходимо ввести событие OnClear. В Delphi событие – это просто специальное свойство, являющееся указателем функции. Тип обобщенного указателя на функцию, которой передается один параметр типа Tcomponent (обычно Self), - TNotifyEvent. Тогда объявление нашего события имеет вид:
private
{ Private declarations }
FEnableNum: boolean;
FClear:TNotifyEvent;//поле события onClear;
……….
published
{ Published declarations }
Property OnClear: TNotifyEvent read FClear write FClear;
……………..
И необходимо откорректировать процедуру метода Clear:
procedure TEditLetNum.Clear;
begin
if assigned(FClear) then OnClear(Self);
inherited Clear;// вызов родительского метода
FModified:=false;
end;
Заново откомпилируйте модуль в окне Диспетчера Пакетов.
1 2