Использование в Delphi подсказок
В операционной системе Windows при наведении указателя мыши на каком-либо значке всплывает подсказка. Наличие подсказки помогает конечному пользователю разобраться с функционалом приложения.
Разместим на форме компонент Edit и в свойстве Hint напишем "Это наш компонент, мы сюда можем все написать". Свойство ShowHint устанавливаем в TRUE. Запустим проект клавишей F9. Задержим на мгновение мышь над компонентом Edit и увидим нашу подсказку на фоне желтого цвета, как на рисунке.
А как сделать фон подсказок другой,
спросите Вы, все очень просто. Для этого разберем следующий пример.
Расположим Компоненты следующим образом, как на рисунке. Свойству формы ShowHint присвоим TRUE. Проследим, чтобы у всех компонентов свойство ParentShowHint было бы TRUE.
Теперь для каждого компонента напишем подсказку типа "Это компонент Edit" (для каждого компонента подсказка должна быть своей). Двойным щелчком на форме зайдем в обработчик формы Create и внесем туда следующие строки :
procedure TForm1.FormCreate (Sender: TObject);
begin
Button1.Hint := 'Первая строка' + #13 + 'Вторая строка' + #13 + 'Третья строка';
Application.HintColor := clGrayText;
Application.HintPause := 250;
Application.HintHidePause := 5000;
end;
Первая строка задает кнопке Button1 новую подсказку, если до этого была задана подсказка в Инспекторе Объектов, то она игнорируется. Символ #13 разбивает строку подсказки на несколько "этажей". Свойство HintColor задает фон подсказок. Свойство HintPause - время до показа подсказки в миллисекундах (где 1000 - одна секунда), а свойство HintHidePause время показа подсказки.
Лекция № 20. Создание заставки, информационных окон.
Создание заставки.
Перед появлением главного окна во всех серьёзных приложениях сначала появляется заставка. Заставка обычно несет в себе информацию о названии продукта, авторе, версии.
Рассмотрим простой способ создания окна-заставки.
Для начала необходимо подготовить само изображение, которое Вы хотите видеть в качестве заставки. В качестве примера возьмем изображение из Borland Delphi 5.
Итак, порядок действий следующий:
1. Создаем новую форму File > New > Form – Delphi for Win322.
2. Для удобства назовем ее IntroForm и зададим свойству BorderStyle значение bsNone (Исчезнут заголовок и рамка формы), свойству Position значение poDesktopCenter (окно будет появляться по центру рабочего стола).
3. Поместим на форму компонент TImage (вкладка Additional) и загрузим наше изображение с помощью свойства Picture.
4. Поместим на форму компонент TTimer (вкладка System), установим его свойству Interval значение равное 3000 (3 секунды), а в обработчике событий OnTimer запишем:
Timer1.Enabled := false;
5. Далее открываем файл проекта: Project > View Source и вносим изменения согласно примера ниже:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {IntroForm};
{$R *.res}
begin
Application.Initialize;
IntroForm := TIntroForm.Create(Application);
IntroForm.Show;
IntroForm.Update;
while IntroForm.Timer1.Enabled do
Application.ProcessMessages;
Application.CreateForm(TForm1, Form1);
IntroForm.Hide;
IntroForm.Free;
Application.Run;
end.
2. Информационное окно в Delphi приложении
В большинстве приложений есть информационное окно, .т.е форма, в которой отображается краткая информация о приложении. Как правило, это сведения о названии программного продукта, номере версии, об авторах, дате выпуска, какой нибудь рисунок (логотип) и еще какие-либо данные. Информационное окно обычно имеет пункт меню "О программе" или по английски - About.
В помощь программисту имеется шаблон в Delphi или же такое окно можно создать самостоятельно. Для того чтобы воспользоваться шаблоном, нужно выбрать в Хранилище объектов (File -> New -> Other) на странице Forms шаблон формы About box.
В итоге к приложению будет добавлена форма с заголовком About и с именем AboutBox .
На форме будут расположены панель (компонент Panel) и кнопка с заголовком OK для закрытия окна. Для кнопки обработчик события не требуется, так как свойство ModalResult кнопки установлено равным mrOK и поэтому при ее нажатии информационное окно будет закрыто.
Панель (компонент Panel) содержит в себе четыре компонента Label для показа сведений о программном продукте и его разработчиках. Компонент Image предназначен для отображения какого-либо рисунка, например логотип производителя программы.
Заголовок самой формы About при необходимости также можно изменить. Если на форме необходимы будут еще какие-нибудь элементы, то их всегда можно добавить или, при необходимости, ненужные удалить.
При работе с программой информационное окно обычно выводиться с помощью главного меню в модальном режиме. Для продолжения работы с программой информационное окно должно быть закрыто.
Пример вызова информационного окна из меню будет таким:
procedure TForm1.N1Click(Sender: TObject);
begin
AboutBox.ShowModal;
end;
Лекция № 21. Понятие и назначение DLL-библиотек. Создание DLL-библиотек. Использование DLL-библиотек.
1. Понятие и назначение DLL-библиотек.
Динамически загружаемая библиотека (от англ. dynamically loadable library) — это библиотека подпрограмм, которая загружается в оперативную память и подключается к использующей программе во время ее работы (а не во время компиляции и сборки). Файлы динамически загружаемых библиотек в среде Windows обычно имеют расширение .dll (от англ. Dynamic-Link Library).
Несколько разных программ могут использовать в работе общую динамически загружаемую библиотеку. При этом операционная система в действительности загружает в оперативную память лишь одну копию библиотеки и обеспечивает совместный доступ к ней со стороны всех программ. Кроме того, такие библиотеки могут динамически загружаться и выгружаться из оперативной памяти по ходу работы программы, освобождая ресурсы системы для других задач.
Одно из важнейших назначений динамически загружаемых библиотек — это взаимодействие подпрограмм, написанных на разных языках программирования. Например, вы можете свободно использовать в среде Delphi динамически загружаемые библиотеки, разработанные в других системах программирования с помощью языков C и C++. Справедливо и обратное утверждение — динамически загружаемые библиотеки, созданные в среде Delphi, можно подключать к программам на других языках программирования.
2. Создание DLL-библиотек.
По структуре исходный текст библиотеки похож на исходный текст программы, за исключением того, что текст библиотеки начинается с ключевого слова library, а не слова program. Например:
library SortLib; |
После заголовка следуют секции подключения модулей, описания констант, типов данных, переменных, а также описания процедур и функций. Процедуры и функции — это главное, что должно быть в динамически загружаемой библиотеке, поскольку лишь они могут быть экспортированы.
Если в теле библиотеки объявлены некоторые процедуры,
procedure BubleSort(var Arr: array of Integer); procedure QuickSort(var Arr: array of Integer); |
то это еще не значит, что они автоматически станут доступны для вызова извне. Для того чтобы это разрешить, нужно поместить имена процедур в специальную секцию exports, например: exports BubleSort, QuickSort; |
Перечисленные в секции exports процедуры и функции отделяются запятой, а в конце всей секции ставится точка с запятой. Секций exports может быть несколько, и они могут располагаться в программе произвольным образом.
Ниже приведен пример исходного текста простейшей динамически загружаемой библиотеки SortLib. Она содержит единственную процедуру BubleSort, сортирующую массив целых чисел методом «пузырька»:
library SortLib; procedure BubleSort(var Arr: array of Integer); var I, J, T: Integer; begin for I := Low(Arr) to High(Arr) - 1 do for J := I + 1 to High(Arr) do if Arr[I] > Arr[J] then begin T := Arr[I]; Arr[I] := Arr[J]; Arr[J] := T; end; end; exports BubleSort; begin end. |
Исходный текст динамически загружаемой библиотеки заканчивается операторным блоком begin...end, в который можно вставить любые операторы для подготовки библиотеки к работе. Эти операторы выполняются во время загрузки библиотеки основной программой. Наша простейшая библиотека SortLib не требует никакой подготовки к работе, поэтому ее операторный блок пустой.
3. Использование DLL-библиотек.
Для того чтобы в прикладной программе воспользоваться процедурами и функциями библиотеки, необходимо выполнить так называемый импорт. Импорт обеспечивает загрузку библиотеки в оперативную память и привязку записанных в программе команд вызова к адресам соответствующих процедур и функций библиотеки.
Существуют два способа импорта, отличающихся по удобству и гибкости программирования:
§ статический импорт (обеспечивается директивой компилятора external);
§ динамический импорт (обеспечивается функциями LoadLibrary и GetProcAddress).
Статический импорт является более удобным, а динамический — более гибким.
При статическом импорте все действия по загрузке и подключению библиотеки выполняются автоматически операционной системой во время запуска главной программы. Чтобы задействовать статический импорт, достаточно просто объявить в программе процедуры и функции библиотеки как внешние. Это делается с помощью директивы external, например:
procedure BubleSortIntegers(var Arr: array of Integer); stdcall; external 'SortLib.dll';procedure QuickSortIntegers(var Arr: array of Integer); stdcall; external 'SortLib.dll'; |
После ключевого слова external записывается имя двоичного файла библиотеки в виде константной строки или константного строкового выражения. Вместе с директивой external может использоваться уже известная вам директива name, которая служит для явного указания экспортного имени процедуры в библиотеке. С ее помощью объявления процедур можно переписать по-другому:
procedure BubleSort(var Arr: array of Integer); stdcall; external 'SortLib.dll' name 'BubleSortIntegers'; procedure QuickSort(var Arr: array of Integer); stdcall; external 'SortLib.dll' name 'QuickSortIntegers'; |
Поместив в программу приведенные выше объявления, можно вызывать процедуры BubleSort и QuickSort, как будто они являются частью самой программы.
Этот способ называется статическим импортом.
Расширение файла, содержащего DLL, может не указываться - по умолчанию подразумеваются файлы *.DLL и *.EXE. Если файл имеет другое расширение (например, как COMPLIB.DCL в Delphi), или если требуется динамическое определение DLL и импортируемых функций (например, Ваша программа работает с различными графическими форматами, и для каждого из них существует отдельная DLL.), то для решения такого рода проблем можно обратиться напрямую к API Windows, используя, так называемый, динамический импорт:
uses
WinTypes, WinProcs, ... ;
type
TMyProc = procedure ;
var
Handle : THandle;
MyImportProc : TMyProc;
begin
Handle:=LoadLibrary('MYDLL');
if Handle>=32 then { if <=32 - error ! }
begin
@MyImportProc:=GetProcAddress(Handle,'MYEXPORTPROC');
if MyImportProc<>nil then
...... {using imported procedure}
end;
FreeLibrary(Handle);
end;
Лекция № 22. Понятие исключительной ситуации. Обработка исключений.