Консольные API (Console API)
Microsoft предоставляет определённый набор функций, которые очень даже полезны при создании консольных приложений. Для начала скажу, что существует по крайней мере два дескриптора (handles), которые связаны с консольным окном. Один для ввода, второй для вывода. Ниже приводятся две небольшие функции, которые показывают, как получить эти дескрипторы.
//-----------------------------------------// Получение дескриптора для консольного ввода//-----------------------------------------function GetConInputHandle : THandle;begin Result := GetStdHandle(STD_INPUT_HANDLE)end; //-----------------------------------------// Получение дескриптора для консольного вывода//-----------------------------------------function GetConOutputHandle : THandle;begin Result := GetStdHandle(STD_OUTPUT_HANDLE)end; |
Так же, лучше сразу создать свои функции для таких простых операций как позиционирование курсора, очистки экрана и отображение/скрытие курсора (так как в консольных API они немножко громозки и запутаны). Вот как они выглядят:
//-----------------------------------------// Установка курсора в координаты X, Y//-----------------------------------------procedure GotoXY(X, Y: Word);begin Coord.X := X; Coord.Y := Y; SetConsoleCursorPosition(ConHandle, Coord);end; //-----------------------------------------// Очистка экрана - заполнение его пробелами//-----------------------------------------procedure Cls;begin Coord.X := 0; Coord.Y := 0; FillConsoleOutputCharacter(ConHandle, ' ', MaxX * MaxY, Coord, NOAW); GotoXY(0, 0);end; //--------------------------------------// Показываем/Скрываем курсор//--------------------------------------procedure ShowCursor(Show: Bool);begin CCI.bVisible := Show; SetConsoleCursorInfo(ConHandle, CCI);end; |
Как Вы успели заметить, мы воспользовались четырьмя функциями консольного API: GetStdHandle, SetConsoleCursorPosition, FillConsoleOutputCharacter, SetConsoleCursorInfo. Иногда может возникнуть задача определения размера консольного окна по вертикали и по горизонтали. Для этого мы создадим две переменные: MaxX и MaxY, типа WORD:
//--------------------------------------// Инициализация глобальных переменных//--------------------------------------procedure Init;begin // Получаем дескриптор вывода (output) ConHandle := GetConOutputHandle; // Получаем максимальные размеры окна Coord := GetLargestConsoleWindowSize(ConHandle); MaxX := Coord.X; MaxY := Coord.Y;end; |
Мы даже можем сделать "цикл обработки сообщений" (message loop) - для тех, кто только начинает программировать в Delphi - цикл обработки сообщений необходимо делать, если приложение создаётся в чистом API - при этом необходимы как минимум три составляющие: WinMain, message loop и window proc.
Ниже приведён код "цикла обработки сообщений":
SetConsoleCtrlHandler(@ConProc, False);Cls;//// "Цикл обработки сообщений"//Continue := True;while Continue dobegin ReadConsoleInput(GetConInputHandle, IBuff, 1, IEvent); case IBuff.EventType of KEY_EVENT : begin // Проверяем клавишу ESC и завершаем программу if ((IBuff.KeyEvent.bKeyDown = True) and (IBuff.KeyEvent.wVirtualKeyCode = VK_ESCAPE)) then Continue := False; end; _MOUSE_EVENT : begin with IBuff.MouseEvent.dwMousePosition do StatusLine(Format('%d, %d', [X, Y])); end; end;end {While} |
Так же можно добавить "обработчик событий" и перехватывать такие комбинации клавиш как Ctrl+C и Ctrl+Break:
//-----------------------------------------------------// Обработчик консольных событий//-----------------------------------------------------function ConProc(CtrlType: DWord): Bool; stdcall; far;var S: string;begin case CtrlType of CTRL_C_EVENT: S := 'CTRL_C_EVENT'; CTRL_BREAK_EVENT: S := 'CTRL_BREAK_EVENT'; CTRL_CLOSE_EVENT: S := 'CTRL_CLOSE_EVENT'; CTRL_LOGOFF_EVENT: S := 'CTRL_LOGOFF_EVENT'; CTRL_SHUTDOWN_EVENT: S := 'CTRL_SHUTDOWN_EVENT'; else S := 'UNKNOWN_EVENT'; end; MessageBox(0, PChar(S + ' detected'), 'Win32 Console', MB_OK); Result := True;end; |
Чтобы посмотреть всё это в действии, я сделал небольшую демонстрационную программу, которая содержит подпрограммы, приведённые выше, а так же некоторые другие возможности. Далее приведён полный исходный код этого приложения. Наслаждайтесь!
{[]-----------------------------------------------------------[]CON001 - Show various Console API functions. Checked with Win95 version 1.01 by Alex G. Fedorov, May-July, 1997alexfedorov@geocities.com 09-Jul-97 some minor corrections (shown in comments)[]-----------------------------------------------------------[]}program Con001; {$APPTYPE CONSOLE} uses Windows, SysUtils; const // Некоторые стандартные цвета YellowOnBlue = FOREGROUND_GREEN or FOREGROUND_RED or FOREGROUND_INTENSITY or BACKGROUND_BLUE; WhiteOnBlue = FOREGROUND_BLUE or FOREGROUND_GREEN or FOREGROUND_RED or FOREGROUND_INTENSITY or BACKGROUND_BLUE; RedOnWhite = FOREGROUND_RED or FOREGROUND_INTENSITY or BACKGROUND_RED or BACKGROUND_GREEN or BACKGROUND_BLUE or BACKGROUND_INTENSITY; WhiteOnRed = BACKGROUND_RED or BACKGROUND_INTENSITY or FOREGROUND_RED or FOREGROUND_GREEN or FOREGROUND_BLUE or FOREGROUND_INTENSITY; var ConHandle: THandle; // Дескриптор консольного окна Coord: TCoord; // Для хранения/установки позиции экрана MaxX, MaxY: Word; // Для хранения максимальных размеров окна CCI: TConsoleCursorInfo; NOAW: LongInt; // Для хранения результатов некоторых функций //-----------------------------------------// Получение дескриптора для консольного ввода//-----------------------------------------function GetConInputHandle : THandle;begin Result := GetStdHandle(STD_INPUT_HANDLE)end; //-----------------------------------------// Получение дескриптора для консольного вывода//-----------------------------------------function GetConOutputHandle : THandle;begin Result := GetStdHandle(STD_OUTPUT_HANDLE)end; //-----------------------------------------// Установка курсора в координаты X, Y//-----------------------------------------procedure GotoXY(X, Y : Word);begin Coord.X := X; Coord.Y := Y; SetConsoleCursorPosition(ConHandle, Coord);end; //-----------------------------------------// Очистка экрана - заполнение его пробелами//-----------------------------------------procedure Cls;begin Coord.X := 0; Coord.Y := 0; FillConsoleOutputCharacter(ConHandle, ' ', MaxX * MaxY, Coord, NOAW); GotoXY(0, 0);end; //--------------------------------------// Показываем/Скрываем курсор//--------------------------------------procedure ShowCursor(Show : Bool);begin CCI.bVisible := Show; SetConsoleCursorInfo(ConHandle, CCI);end; //--------------------------------------// Инициализация глобальных переменных//--------------------------------------procedure Init;begin // Получаем дескриптор вывода (output) ConHandle := GetConOutputHandle; // Получаем максимальные размеры окна Coord := GetLargestConsoleWindowSize(ConHandle); MaxX := Coord.X; MaxY := Coord.Y;end; //---------------------------------------// рисуем строку статуса ("status line")//---------------------------------------procedure StatusLine(S : string);begin Coord.X := 0; Coord.Y := 0; WriteConsoleOutputCharacter(ConHandle, PChar(S), Length(S)+1, Coord, NOAW); FillConsoleOutputAttribute (ConHandle, WhiteOnRed, Length(S), Coord, NOAW);end; //-----------------------------------------------------// Консольный обработчик событий//-----------------------------------------------------function ConProc(CtrlType : DWord) : Bool; stdcall; far;var S: string;begin case CtrlType of CTRL_C_EVENT: S := 'CTRL_C_EVENT'; CTRL_BREAK_EVENT: S := 'CTRL_BREAK_EVENT'; CTRL_CLOSE_EVENT: S := 'CTRL_CLOSE_EVENT'; CTRL_LOGOFF_EVENT: S := 'CTRL_LOGOFF_EVENT'; CTRL_SHUTDOWN_EVENT: S := 'CTRL_SHUTDOWN_EVENT'; else S := 'UNKNOWN_EVENT'; end; MessageBox(0, PChar(S + ' detected'), 'Win32 Console', MB_OK); Result := True;end; {[]-----------------------------------------------------------[]Основная программа - показывает использование некоторых подпрограмма так же некоторых функций консольного API[]-----------------------------------------------------------[]}var R: TSmallRect; Color: Word; OSVer: TOSVersionInfo; IBuff: TInputRecord; IEvent: DWord; Continue: Bool; begin // Инициализация глобальных переменных Init; // Расположение окна на экране {!! 1.01 !!} with R do begin Left := 10; Top := 10; Right := 40; Bottom := 40; end {!! 1.01 !!} SetConsoleWindowInfo(ConHandle, False, R); // Устанавливаем обработчик событий SetConsoleCtrlHandler(@ConProc, True); // Проверяем обработчик событий GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); // Изменяем заголовок окна SetConsoleTitle('Console Demo'); // Прячем курсор ShowCursor(False); Coord.X := 0; Coord.Y := 0; // Устанавливаем белый текст на синем фоне Color := WhiteOnBlue; FillConsoleOutputAttribute(ConHandle, Color, MaxX * MaxY, Coord, NOAW); // Console Code Page API is not supported under Win95 - only GetConsoleCP Writeln('Console Code Page = ', GetConsoleCP); Writeln('Max X=', MaxX,' Max Y=', MaxY); Readln; // ожидаем ввода пользователя Cls; // очищаем экран ShowCursor(True); // показываем курсор // Use some Win32API stuff OSVer.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); GetVersionEx(OSVer); with OSVer do begin Writeln('dwMajorVersion = ', dwMajorVersion); Writeln('dwMinorVersion = ', dwMinorVersion); Writeln('dwBuildNumber = ', dwBuildNumber); Writeln('dwPlatformID = ', dwPlatformID); end; // ожидаем ввода пользователя Readln; // Удаляем обработчик событий SetConsoleCtrlHandler(@ConProc, False); Cls; // "Цикл обработки сообщений" Continue := True; while Continue do begin ReadConsoleInput(GetConInputHandle, IBuff, 1, IEvent); case IBuff.EventType of KEY_EVENT : begin // Проверяем клавишу ESC и завершаем программу if ((IBuff.KeyEvent.bKeyDown = True) and (IBuff.KeyEvent.wVirtualKeyCode = VK_ESCAPE)) then Continue := False; end; _MOUSE_EVENT : begin with IBuff.MouseEvent.dwMousePosition do StatusLine(Format('%d, %d', [X, Y])); end; end; end {While}end. |
Контрольні питанна
1. Надати характеристику поняття консольне застосування
2. Навести рриклади роботи із консольними застосуваннями та процедурою їх створення
САМОСТІЙНА РОБОТА СТУДЕНТА
ЗМІСТОВИЙ МОДУЛЬ 6: ПРОГРАМУВАННЯ З ГРАФАМИ
ТЕМА 6.5: ОРГАНІЗАЦІЯ ПРИКЛАДНИХ ЗАСТОСУВАНЬ
Самостійне заняття №36 –Екранне середовище
План заняття
1. Характеристика об’єкту Screen
2. Характеристика властивостей ActiveForm, Cursor, FormCount, Forms, Height, Width
Для каждого нового приложения в Delphi автоматически создается объект экрана Screenтипа TScreen. Данный объект предназначен для работы с различной экранной информацией. Используя объект Screen,можно получить сведения о текущем состоянии экрана, а именно:
■ открытые формы и модули приложения;
■ активную в текущий момент времени форму;
■ текущие размеры и разрешение экрана;
■ курсоры и шрифты, доступные для использования приложением.
Свойства объекта Screen, так же, как и объекта Application,доступны только в момент выполнения приложения и недоступны при его проектировании.
Далее будут описаны наиболее важные свойства данного объекта.
Свойство ActiveForm(тип TForm)позволяет определить активную форму приложения. Это свойство доступно только для чтения и указывает форму, имеющую фокус ввода в текущий момент времени.
Свойство Cursor(тип TCursor)задает форму указателя мыши для всего приложения Свойство Fonts(тип TStrings),доступное только для чтения, используется для работы со списком шрифтов, установленных в системе.
Свойство FormCount(тип Integer)дает возможность определить количество форм приложения (сюда включаются все созданные формы, независимо от того, видимы ли они в настоящий моМент на экране или нет).
Свойство Forms [Index: Integer](тип TForm)возвращает список форм приложения. Это свойство представляет собой массив форм, к которым можно обращаться по индексам Index.
Свойство Height(тип Integer)возвращает высоту экранной области в пикселях.
Свойство Width(тип Integer)возвращает ширину экранной области в пикселях. С помощью свойств Widthи Heightможно, например, определить установленное в данный момент разрешение монитора.
Контрольні питання
1. Характеристика об’єкту Screen
2. Характеристика властивостей ActiveForm, Cursor, FormCount, Forms, Height, Width
САМОСТІЙНА РОБОТА СТУДЕНТА
ЗМІСТОВИЙ МОДУЛЬ 6: ПРОГРАМУВАННЯ З ГРАФАМИ
ТЕМА 6.5: ОРГАНІЗАЦІЯ ПРИКЛАДНИХ ЗАСТОСУВАНЬ
Самостійне заняття №37 –Буфер обміну даними
План заняття
1. Характеристика об’єкта Clipboard
2. Характеристика методів об’єкта Clipboard
В Windows широко используется буфер межпрограммного обмена данными Clipboard.Для того чтобы получить доступ к объекту Clipboard,который инкапсулирует методы и свойства для работы с буфером, необходимо в разделе usesуказать ссылку на модуль Clipboard.
В качестве важнейших свойств объекта Clipboardможно выделить следующие свойства.
Свойство AsText(тип String)рассматривает содержимое буфера как текстовую строку длиной до 255 символов. Для обмена с буфером более длинными строками следует использовать его методы SelTextBufи GetTextBuf.
Свойство FormatCount(тип Integer)возвращает общее количество форматов, хранящихся в буфере данных.
Свойство Formats [Index: Integer](тип Word)открывает доступ к данным по формату, указанному индексом Index.
Ниже приводятся основные методы объекта Clipboard.
Метод Assign (Source: TPersistent)копирует в буфер изображение.
Метод Clearочищает буфер.
Метод Closeуменьшает на 1 счетчик блокировок буфера и закрывает его, если счетчик содержит 0.
Метод GetTextBuf(Buffer: PChar; BufSize: Integer) : Integer копирует из Clipboard не более BufSize символов в текстовый буфер Buffer и возвращает действительное количество скопированных символов.
Метод HasFormat (Format: Word): Boolean возвращает True, если буфер содержит данные в формате Format.
Метод Open увеличивает на 1 счетчик блокировок буфера и открывает его, если он еще не был открыт.
Метод SetTextBuf (Buf f er: PChar) помещает в Clipboard содержимое текстового буфера Buffer.
Чтобы поместить в буфер изображение, хранящееся, например, в объекте BitMap (тип TBitMap), следует обратиться к методу Assign буфера Clipboard.Assign(BitMap); а для копирования изображения из буфера - к методу Assign объекта-приемника: BitMap.Assign(Clipboard)
Контрольні питання
1. Наведіть характеристику об’єкта Clipboard
2. Наведіть характеристику методів об’єкта Clipboard
АУДИТОНЕ ЗАНЯТТЯ
ЗМІСТОВИЙ МОДУЛЬ 6: ПРОГРАМУВАННЯ З ГРАФАМИ
ТЕМА 6.5: ОРГАНІЗАЦІЯ ПРИКЛАДНИХ ЗАСТОСУВАНЬ
Лекція №49 –Багатодокументні прикладні застосування
План заняття
1. Характеристика MIDI-прикладних застосувань
2. Характеристика методів та властивостей MIDI-об’єктів
MDI-приложения требуют больше планирования при их создании и более комплексного подхода к проектированию, чем SDI-приложения. В многодокументном приложении главное окно содержит дочерние окна, располагаемые в его пределах.
Организация многодокументных приложений не имеет принципиальных различий с созданием однодокументных приложений. Отличие MDI-приложений обусловлено рядом особенностей, связанных с взаимодействием главного и дочерних окон, а также с управлением открытыми дочерними окнами.
Родительская форма служит контейнером, содержащим дочерние формы, которые заключены в клиентскую область и могут перемещаться, изменять размеры, минимизироваться или максимизироваться только в пределах родительской формы. Чтобы задать тип формы при проектировании приложения, необходимо установить свойство FormStyle: для родительской формы равным f sMDIForm, а для дочерней формы - f sMDIChild. В приложении могут быть дочерние формы разных типов, например, одна - для обработки изображений, а другая - для работы с текстом. Для удобства программист может разработать собственный класс для дочерних форм и создавать каждую дочернюю форму из этого класса, чтобы избежать случайного сброса ее свойств.
В MDI-приложений, как правило, требуется выводить несколько экземпляров классов формы. Поскольку каждая форма представляет собой объект, она должна быть создана перед использованием и выгружена из памяти, когда в ней больше не нуждаются. Delphi может делать это автоматически, а может предоставить эту работу программисту.
Существует ряд общепринятых правил оформления главного и дочерних окон. Они не обязательны, однако их следует учитывать при создании MDI-приложений. Так, в главном окне размещаются обычно только такие элементы управления, как меню, панели инструментов и строка состояния. Остальная клиентская область предназначается для размещения дочерних окон. Главное окно, как правило, не содержит кнопок, надписей или переключателей, потому что они будут видны сквозь дочерние формы. Со своей стороны, дочерние окна не имеют панелей инструментов и строки состояния. А в том случае, если дочерняя форма включает в себя меню, то при создании данной формы ее меню автоматически сливается с меню главной формы (при этом свойство AutoMerge обоих меню имеет значение False), но при этом необходимо установить свойство Grouplndex для пунктов обоих меню, чтобы задать порядок совмещения пунктов. Если данное свойство имеет одинаковое значение для пункта меню главной и дочерней формы, то пункт меню дочерней формы будет замещать пункт меню родительской формы. По умолчанию свойство Grouplndex для всех пунктов имеет значение 0, а поэтому, если его не изменить, то в меню будут отображаться только пункты меню дочерней формы, замещая собой пункты меню родительской формы.
Следует упомянуть еще об одной особенности дочерних форм. При попытке закрытия дочерней формы путем нажатия кнопки закрытия в верхнем правом углу формы, либо нажатием клавиш Ctrl+F4, либо вызовом метода Close, она на самом деле будет не закрываться, а минимизироваться. Это объясняется тем, что по умолчанию для всех дочерних окон параметр Action имеет значение caMinimize. Чтобы избежать данного явления, необходимо создать собственный обработчик события OnClose для дочерней формы, в котором присвоить параметру Action значение caFree.
Нельзя также закрывать дочернее окно с помощью метода Hide, так как это вызовет исключительную ситуацію.
Объект TForm имеет несколько свойств, специфичных для MDI-приложений.
Свойство ActiveMDIChild (тип TForm) возвращает дочерний объект TForm, имеющий в текущий момент времени фокус ввода. Оно полезно, когда родительская форма содержит панель инструментов или меню, команды которых распространяются на открытую дочернюю форму.
Свойство MDIChildren [I: Integer J (тип TForm) представляет собой массив, содержащий список созданных дочерних форм. Окна в данном массиве нумеруются, начиная с нуля, в зависимости от их текущего положения в родительском окне. Нумерация изменяется после каждого переупорядочения окон.
Свойство MDIChildCount возвращает количество элементов в массиве MDIChildren, то есть количество открытых дочерних форм. Два последних приведенных свойства обычно используются при выполнении какого-либо действия над всеми открытыми дочерними формами.
Свойство TileMode (тип TTileMode) определяет, как родительская форма размещает дочерние окна при вызове метода Tile (размещение окон мозаикой, см. ниже). Свойство может принимать значения tbHorizontal (по умолчанию) и tbVertical, что определяет способ размещения форм по горизонтали и вертикали соответственно.
Свойство WindowMenu используется для того, чтобы обеспечить возможность пользователю активизировать необходимое дочернее окно объекта TMenuItem, который Delphi будет использовать для вывода списка доступных дочерних форм. Для вывода списка TMenuItem должно существовать меню верхнего уровня.
Далее рассмариваются основные методы, применяемые специально для работы с MDI-формами.
Метод Arrangelcons упорядочивает пиктограммы минимизированных дочерних форм в нижней части родительской формы. Метод Next обеспечивает переход к следующей по порядку дочерней форме.
Метод Previous дает возможность передать фокус ввода предыдущей дочерней форме.
Метод Cascade располагает дочерние формы каскадом таким образом, что видны все их заголовки (см. рис. 7.2).
Метод Tile выстраивает дочерние формы мозаикой, то есть так, что они не перекрываются (см. рис. 7.3).
Рис.7.3. Расположение окон мозаикой
Для MDI-приложений свою особенность имеет событие OnActivate, которое генерируется двумя способами. Если приложение уже активно в текущий момент времени, то данное событие возникает для окна, которое получает фокус ввода при пере ключении между дочерними окнами. Если же приложение было неактивно, то событие OnActivateвозникает для главной формы в момент ее активизации.
Пример 7.2. Пусть необходимо разработать простейшее многодокументное приложение, позволяющее создавать, открывать, просматривать, редактировать и сохранять текстовые файлы, а также размещать окна каскадом или мозаикой по выбору (см. рис. 7.2,7.3).
Решение. В начале проектирования данного приложения создаются две формы: главная и дочерняя. Основные свойства, которые следует установить для этих форм, приведены в табл. 7.2.
На главную форму следует добавить такие компоненты: Main-Menu, OpenDialog и SaveDialog.
Пункты и подпункты главного меню (MainMenu) задаются в соответствии с табл. 7.3.
На дочернюю форму необходимо поместить многострочный редактор Memo. Свойству Alignданного компонента присваивается значение alClient(т.е. редактор будет занимать всю клиентскую область дочерней формы).
В листинге 7.2 содержится программный код создаваемого многодокументного приложения.
Контрольні питання
1. Наведіть характеристику MIDI-прикладних застосувань
2. Наведіть характеристику методів та властивостей MIDI-об’єктів
САМОСТІЙНА РОБОТА СТУДЕНТА
ЗМІСТОВИЙ МОДУЛЬ 6: ПРОГРАМУВАННЯ З ГРАФАМИ
ТЕМА 6.5: ОРГАНІЗАЦІЯ ПРИКЛАДНИХ ЗАСТОСУВАНЬ
Самостійне заняття №38 –Інформаційні вікна
План заняття
1. Характеристика інформаційних вікон
2. Приклади створення інформаційних вікон Delphi
В большинстве программ предусматривается возможность открывать специальное окно, содержащее краткую справочную информацию о названии программного продукта, его версии, дате выпуска, авторах и другие данные. Как правило, такое окно называется О программе или About.
Информационное окно создается с помощью стандартного шаблона либо самостоятельно.
Для того чтобы создать информационное окно с помощью шаблона, необходимо обратиться к базе объектов (выбрать в главном меню среды разработки Delphi пункт Tools \ Repository). Затем на странице Forms выбрать шаблон формы Aboutbox. В результате к приложению добавляется новая форма AboutBox с заголовком About (см. рис. 7.4). Другой способ - вызвать пункт меню File | New \ Other и в открывшемся диалоговом окне на странице Forms выбрать шаблон About box
Как видно из рис. 7.4, данная форма содержит информационную панель с рисунком (компонент Image) и четырьмя надписями (компоненты Label), а также кнопку ОК для закрытия окна. Программист может по своему усмотрению изменять эту форму, удалять и заменять существующие объекты или добавлять новые.
Как правило, события элементов, расположенных на данной форме, не используются, и обработчики событий не создаются, поскольку данное окно выполняет исключительно информационную функцию. В том числе не требуется обработчик события нажатия кнопки ОК, так как свойство ModalResult данной кнопки имеет значение mrOK,поэтому при ее нажатии форма автоматически закрывается.
Разработчик приложения может не использовать шаблон, а создавать информационное окно самостоятельно, путем добавления к проекту новой формы, на которой будут располагаться все необходимые управляющие элементы.
Вызов информационного окна на экран обычно осуществляется в модальном режиме, то есть с использованием метода ShowModal.Чтобы продолжить работу с приложением, следует закрыть информационное окно.
Контрольні питання
1. Наведіть характеристику інформаційних вікон
2. Приведіть приклади створення інформаційних вікон Delphi
САМОСТІЙНА РОБОТА СТУДЕНТА
ЗМІСТОВИЙ МОДУЛЬ 6: ПРОГРАМУВАННЯ З ГРАФАМИ
ТЕМА 6.5: ОРГАНІЗАЦІЯ ПРИКЛАДНИХ ЗАСТОСУВАНЬ
Самостійне заняття №39 –Одноекземплярні прикладні застосування
План заняття
1. Характеристика одноекземплярних прикладних застосувань
2. Характеристика методів та властивостей одноекземплярних прикладних застосувань
В ряде случаев возникает необходимость создать приложение, которое могло бы запускаться только в одном экземпляре. Иными словами, требуется, чтобы не было возможности загружать вторую копию приложения, если работает первая. Это реализуется путем использования API-функций Windows.
К решению данной проблемы существует два подхода: блокировка запуска второй копии и активизация уже открытого экземпляра приложения.
Рассмотрим, каким образом реализуется первый подход.
Перед запуском программа просматривает список заголовков открытых в системе окон и проверяет, не открыто ли ее главное окно. Для этого используется API-функция FindWindow,имеющая такой формат:
FindWindow (lpClassName, lpWindowName: LPCTSR): HWND
Если требуемое окно не найдено, то данная функция возвращает нулевое значение, если же окно найдено, то будет возвращен его дескриптор. С помощью параметра lpClassNameзадается класс искомого окна, а с помощью параметра lpWindowName-его заголовок. Другими словами, если в приложении создана форма Formlкласса TForml,то параметру lpClassNameзадается значение TForml,а параметру lpWindowNameустанавливается значение свойства Captionданной формы Обращение к функции FindWindow должно осуществляться только в файле проекта, так как если вызывать данный поиск из модуля главной формы, то к тому времени сама форма будет уже создана и открыта. Следовательно, функция найдет заданное окно, приложение заблокирует само себя и не будет запускаться вообще.
Предположим, что в приложении имеется главная форма Forml класса TForml с заголовком MainForm. Тогда, чтобы сделать данное приложение одноэкземплярным, необходимо:
1) добавить модуль Windows в список используемых модулей в разделе uses файла проекта;
2)в тело файла проекта после строки инициализации проекта Application. Initialize добавить код поиска формы следующего вида:
if FindWindow('TForml', 'MainForm') <> О then Application.Terminate;
Теперь, если при запуске приложения в системе будет обнаружено открытое ранее главное окно данного приложения, то выполнение второго его экземпляра будет прерываться.
Программисту следует обратить внимание на ряд моментов, о которых важно помнить. Во-первых, необходимо обязательно включить в файл проекта модуль Windows, потому что будет использоваться API-функция Windows. Если этого не сделать, то компилятор будет выдавать сообщение об ошибке. Во-вторых, при изменении свойств Name и Caption главной формы нужно изменить соответствующим образом и условие поиска в файле проекта. Кроме того, нельзя исключать теоретическую вероятность того, что имя и заголовок главного окна разрабатываемого приложения совпадут с аналогичными свойствами некоторого другого приложения, работающего в системе в текущий момент времени, и тогДа данное приложение нельзя будет запустить. Поэтому рекомендуется, по возможности, давать главному окну приложения оригинальный заголовок, который не имел бы аналогов среди названий окон наиболее распространенных программ.
Второй подход к созданию одноэкземплярного приложения заключается в активизации уже запущенного экземпляра данного приложения. С этой целью применяется API-функция SetFore-groundWindow (hwndWindow: HWND): boolean. При ее использовании то окно, дескриптор которого задан параметром hwndWindow, будет размещено поверх всех открытых окон.
Если принять в качестве примера те условия, которые были описаны выше, то следует создать файл проекта нижеследующего вида.
Если главное окно приложения уже открыто в системе, то при попытке запуска второго экземпляра приложения функция FindWindow вернет ненулевое значение. В этом случае функция SetForegroundWindow активизирует данное окно и разместит его поверх всех остальных открытых окон.
Контрольні питання
1. Характеристика одноекземплярних прикладних застосувань
2. Характеристика методів та властивостей одноекземплярних прикладних застосувань
АУДИТОРНЕ ЗАНЯТТЯ
ЗМІСТОВИЙ МОДУЛЬ 6: ПРОГРАМУВАННЯ З ГРАФАМИ
ТЕМА 6.5: ОРГАНІЗАЦІЯ ПРИКЛАДНИХ ЗАСТОСУВАНЬ
Лекція №51 –Виклик зовнішніх прикладних застосувань
План заняття
1. Характеристика процедур виклику зовнішніх прикладних застосувань
2. Характеристика методів та властивостей виклику зовнішніх прикладних застосувань
Часто возникает необходимость запускать другие внешние программы из разрабатываемого приложения. Для этого используются такие API-функции, как WinExecи ShellExecute.
Функция WinExec (lpCmdLine: LPCSTR, uCmdShow: UINT) : UINTобеспечивает запуск внешней программы. В качестве параметров данной функции задаются имя запускаемого файла приложения и дополнительная информация (параметры работы вызываемой программы). Если не указан путь в имени запускаемого файла, то его поиск осуществляется, в первую очередь, в текущем каталоге, из которого запущено разрабатываемое приложение, а затем в текущем каталоге Windows; в системном каталоге Windows; в главном каталоге Windows; в каталогах, заданных для поиска командой PATH. Соответственно, если файл не найден, он запускаться не будет и при этом не выдаются никакие предупреждения или сообщения об ошибке.
Параметр uCmdShowопределяет один из следующих способов отображения окна запускаемого приложения:
■ SWShowMaximized - максимальный размер окна;
■ SWShowMinimized - минимальный размер окна;
■ SW_ShowNormal - нормальный размер окна.
В качестве результата функция WinExecвозвращает целое число, большее 31 (в случае успешного выполнения). При возникновении ошибки могут быть возвращены следующие значения:
■ 0 — недостаточно памяти или других ресурсов;
■ ERRORBADFORMAT - неправильный формат файла;
■ ERRORFILENOTFOUND - не найден указанный файл;
■ ERROR_PATH_NOT_FOUND - не найден указанный путь.
Функция WinExecпозволяет запускать как 16-, так и 32-разрядные приложения Windows, хотя сама является 16-разрядной, что обеспечивает совместимость с более ранними версиями Delphi.
Вызов лазерного проигрывателя Windows с помощью функции WinExecбудет выглядеть следующим образом:
WinExec(PChar('CDPlayer.exe'), SW_ShowNormal);
Функция ShellExecute (hwnd: HWND, lpOperation: LPCSTR, lpFile: LPCSTR, lpParameters: LPCSTR, lpDirectory: LPCSTR, nShowCmd: INT) : HINSTANCEявляется 32-разрядной и предоставляет больше возможностей, чем функция WinExec,однако, как видно из ее описания, требует задания большего количества параметров при вызове. Данная функция позволяет запустить, открыть либо вывести на принтер указанный файл. Так, например, если указать исполняемый файл, то в результате будет осуществляться выполнение приложения. Если же указать файл электронной таблицы с расширением XLS, то произойдет вызов Microsoft Excel и последующее открытие таблицы. Наконец, если указать не файл, а каталог, то будет запущен Проводник Windows, в котором отображается содержимое данного каталога.
Параметры функции ShellExecuteимеют следующее назначение.
Параметр hwndссылается на окно приложения, из которого запускается другое приложение (в качестве ссылки на окно задается его дескриптор).
Параметр lpOperationсодержит строку, которая определяет тип выполняемой операции и может принимать одно из следующих значений:
■ open— открыть файл или каталог, указанный параметром lpFile,либо запустить исполняемый файл, если он задан;
■ print- напечатать файл-документ, указанный параметром lpFile,либо запустить исполняемый файл, если он задан;
■ explore- в окне Проводника Windows открыть каталог, указанный параметром lpFile.
Если для данного параметра задать значение nil,то по умолчанию принимается значение open.
Параметр lpFileсодержит строку с именем файла или каталога, для которых выполняется заданная операция.
Параметр lpParametersпредставляет собой строку, которая содержит дополнительные параметры, передаваемые приложению. Параметру lpParametersобычно задается значение nil,если открывается неисполняемый файл.
Параметр lpDirectoryявляется строкой, в которой указывается имя каталога по умолчанию.
Параметр nShowCmdзадает способ отображения окна запускаемого приложения: нормальный размер окна, окно максимизировано или окно минимизировано.
Функция ShellExecuteвозвращает ссылку на вновь запущенное приложение, значение которой в случае успешного выполнения больше 32. При неудачном выполнении данной функции возвращается код ошибки.
В разделе usesследует указывать модуль ShellAPI,чтобы была возможность использовать функцию ShellExecute.
Рассмотрим несколько примеров практического использования функции ShellExecute.
Вызов Калькулятора Windows можно осуществить следующим образом:
ShellExecute(Application.MainForm.Handle, nil, PChar('Calc.exe'), nil, nil, SW_ShowNormal);
Следует обратить внимание на то, что в данном примере в качестве окна, которое вызывает Калькулятор, используется главная форма приложения Application. MainForm.
Открытие рисунка в формате BMP производится так:
ShellExecute(Forml.Handle, PChar('open'), PChar('risunok.bmp'), nil, PChar('С:\Graph'), SW_ShowNormal);
Здесь вызов производится формой с именем Forml.В результате выполнения такой функции из каталога C:\Graph будет открыт файл рисунка risunok.bmp. При этом для открытия графического файла будет автоматически использоваться программа, назначенная для обработки рисунков данного типа, например графический редактор Jasc Paint ShopPro или редактор просмотра изображений ACDSee.
По аналогии с этим можно открыть и документ Word. Однако существует еще один способ.
ShellExecute(Forml.Handle, PChar('open'), PChar('Winword.exe'), PChar('Docl.doc'), . PChar('C:\Program Files\ Microsoft Office\ Office'), SW_ShowNormal);
В этом случае вызывается непосредственно сам текстовый редактор Word, а в качестве параметра ему передается имя документа, который и будет открыт.
Если требуется открыть и просмотреть содержимое папки C:\Program Files, то это можно сделать таким образом:
ShellExecute(Application.MainForm.Handle, PChar('explore'), PChar('С:\Program Files'), nil, nil, SW_ShowNormal);
С помощью вызова функции такого вида будет запущен Проводник Windows, в котором отобразится содержимое каталога C:\Program Files.
Контрольні питання
1. Наведіть характеристики процедур виклику зовнішніх прикладних застосувань
2. Наведіть характеристики методів та властивостей виклику зовнішніх прикладних застосувань
АУДИТОРНЕ ЗАНЯТТЯ
ЗМІСТОВИЙ МОДУЛЬ 6: ПРОГРАМУВАННЯ З ГРАФАМИ. ВІЗУАЛЬНІ КОМПОНЕНТИ. БАЗИ ДАНИХ
ТЕМА 6.6: ОСНОВИ БАЗ ДАНИХ
Лекція №52 –Введення баз даних
План заняття
1. Характеристика поняття база даних
2. Процедура роботи з базами даних
Базы данных
С точки зрения пользователя, база данных — это программа, которая обеспечивает работу с информацией. При запуске такой программы на экране, как правило, появляется таблица, просматривая которую пользователь может найти интересующие его сведения. Если система позволяет, то он может внести изменения в базу данных: добавить новую информацию или удалить ненужную.
С точки зрения программиста, база данных — это набор файлов, содержащих информацию. Разрабатывая базу данных для пользователя, программист создает программу, которая обеспечивает работу с файлами данных.
В настоящее время существует достаточно большое количество программных систем, позволяющих создавать и использовать локальные (dBASE, FoxPro, Access, Paradox) и удаленные (Interbase, Oracle, Sysbase, Infomix, Microsoft SQL Server) базы данных.
В состав Delphi входят компоненты, позволяющие создавать программы работы с файлами данных, созданными различными системами: от dBASE до Infomix и Oracle. Delphi также позволяет программисту, используя утилиту Borland Database Desktop, создавать файлы баз данных в различных форматах.
Дата добавления: 2014-12-01; просмотров: 1656;