Консольные 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, так же, как и объекта Appli­cation,доступны только в момент выполнения приложения и недоступны при его проектировании.

Далее будут описаны наиболее важные свойства данного объекта.

Свойство 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, будет размещено поверх всех открытых окон.

Если принять в качестве примера те условия, которые были опи­саны выше, то следует создать файл проекта нижеследующего вида.

Если главное окно приложения уже открыто в системе, то при попытке запуска второго экземпляра приложения функция Find­Window вернет ненулевое значение. В этом случае функция 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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.129 сек.