Курсовая работа (т): Асинхронный ввод/вывод

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Действия Вырезать и Копировать подобны друг другу. ДействиеКопировать копирует выделенный текст в буфер обмена, а действие Вырезать сначала копирует выделенный текст в буфер обмена, а затем удаляет текст из редактора.

Поскольку действия Вырезать и Копировать имеют один обработчик события OnUpdate, давайте сначала создадим оба действия, а затем напишем необходимые обработчики событий.

Чтобы создать действие Вырезать, выполните следующие шаги:

Создайте новое действие в редакторе Action List.

В поле свойства Caption нового действия введите Вырезать.

В поле свойства Hint введите Вырезать выделенный фрагмент в буфер обмена.

Присвойте действию имя CutAction.

Назначьте свойству Shortcut комбинацию Ctrl+X.

Чтобы создать действие Копировать, выполните перечисленные ниже шаги:

Создайте новое действие в редакторе Action List.

В поле свойства Caption нового действия введите Копировать.

В поле свойства Hint введите Копировать выделенный фрагмент в буфер обмена.

Присвойте действию имя CopyAction.

Назначьте свойству Shortcut комбинацию Ctrl+C.

Реализовать оба обработчика события OnExecute не составляет особого труда. Чтобы скопировать текст из редактора в буфер обмена, вы должны вызвать метод CopyToClipboard. Чтобы вырезать текст в буфер обмена, вызовите метод CutToClipboard редактора.

Рисунок 19. Код программы

Код в обработчике события OnUpdate должен запрещать действие, если в редакторе не будет выделен текст. Для определения, сколько символов было выделено пользователем, можно использовать свойство SelLength редактора. Если значение этого свойства будет равно 0, это значит, что в редакторе нет выделенных символов, и действие должно быть запрещено.

Теперь запишем следующий обработчик события OnUpdate для действия вырезать и назначим его событию OnUpdate действия Копировать:

Рисунок 20. Код программы

Назначьте действия CutAction и CopyAction неименованным пунктам в менюПравка.

Вставка в буфер обмена

Во время действия Вставить содержимое буфера обмена вставляется в редактор. Чтобы ваш редактор был по-настоящему профессиональным, вы должны позволить пользователю выбирать команду Вставить только тогда, когда в буфере обмена будет содержаться хоть какой-нибудь текст. Чтобы узнать, какой формат имеют данные, хранящиеся в буфере обмена, вызовите метод HasFormat.

Чтобы узнать, содержит ли буфер обмена простой текст, который может быть вставлен в редактор, вызовите метод HasFormat и передайте в качестве параметра константу CF_TEXT. Чтобы использовать глобальный объектClipboard, необходимо добавить модуль Clipbrd в список uses.

Для создания действия Вставить потребуется выполнить следующие шаги:

Создайте новое действие.

В поле свойства Caption нового действия введите Вставить.

В поле свойства Hint введите Вставить текст из буфера обмена.

Присвойте действию имя PasteAction.

Назначьте свойству Вставить комбинацию Ctrl+V.

Рисунок 21. Код программы

Назначьте действие PasteAction неименованному пункту в меню Правка.

Удаление

Действие Удалить выполняет практически то же самое, что и действиеВырезать. Подобно Вырезать, действие Удалить удаляет выделенный текст из редактора. Различие между ними состоит в том, что действие Удалить не копирует текст в буфер обмена перед удалением текста из редактора.

Чтобы создать действие Delete, выполните следующие шаги:

Создайте новое действие.

В поле свойства Caption нового действия введите Удалить.

В поле свойства Hint введите Удалить выделенный фрагмент.

Присвойте действию имя DeleteAction.

Назначьте свойству Shortcut клавишу Del.

Для удаления текста из редактора без изменения содержимого буфера обмена применяется метод ClearSelection. Кроме этого, назначьте обработчик события OnUpdate действия Cut событию OnUpdate действия Delete, чтобы позволить пользователю удалять выделенный текст только в том случае, если этот текст существует.

Назначьте действие DeleteAction неименованному пункту в меню Правка.

Выделение всего документа

Пожалуй, наиболее простым из всех действий является Выделить все, которое позволяет выделять все содержимое редактора. Чтобы создать действие Выделить все, выполните следующие шаги:

Создайте новое действие.

В поле свойства Caption нового действия введите Выделить все.

В поле свойства Hint введите Выделить весь документ.

Присвойте действию имя SelectAllAction.

Назначьте свойству Shortcut клавишу Ctrl+A.

Назначьте действие SelectAllAction неименованному пункту в меню Правка.

Чтобы выделить все содержимое компонента ТМеmо, необходимо вызвать метод SelectAll:


Поиск текста в Delphi

Чтобы реализовать команду Найти, сначала добавьте в окно Designer Surfaceкомпонент TFindDialog. Компонент TFindDialog заключает в себе обычное диалоговое окно Найти, с помощью которого пользователь может производить поиск строки текста. Строка, которую пользователь пытается найти, хранится в свойстве FindText.

Чтобы пользователь мог осуществлять поиск в тексте, потребуется создать действие Найти, отображающее диалоговое окно Найти, и написать обработчик для события OnFind диалогового окна для реализации поиска. Поскольку диалоговое окно Найти позволяет искать несколько экземпляров строки, мы должны объявить переменную Integer, в которой будет храниться последняя позиция поиска:

Рисунок 23. Код программы

Теперь, чтобы создать действие Найти, выполните перечисленные ниже шаги:

В поле свойства Caption нового действия введите Найти.

В поле свойства Hint введите Найти указанный текст.

Присвойте действию имя FindAction.

Назначьте свойству Shortcut комбинацию Ctrl+F.

В обработчик события OnExecute действия поместите следующий код:

Рисунок 24. Код программы

Код, отвечающий за выполнение поиска:

Рисунок 25. Код программы

Первая строка (приведение параметра Sender к типу TFindDialog) необязательна, если в команде Правка - Найти вы намереваетесь использовать только этот метод. В данном случае мы должны выполнить приведение к типу по той причине, что это позволит повторно использовать этот метод в событии OnFind компонента TReplaceDialog.

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

Если функция Pos найдет экземпляр строки поиска, мы должны будем сохранить позицию найденного экземпляра в переменной FLastSearch, а затем выделить строку в редакторе. Для выделения строки в редакторе потребуется изменить свойства SelStart и SelLength. Свойство SelStartпоказывает позицию курсора, а свойство SelLength определяет количество выделенных символов.

Наконец, чтобы показать выделение, мы должны вызвать метод SetFocus для передачи редактору фокуса.

Назначьте действие FindAction неименованному пункту в меню Правка.

Замена текста

В плане завершения работы над меню Правка необходимо создать действиеЗаменить, которое позволит производить поиск и замену строки. Чтобы реализовать действие Заменить, потребуется выполнить следующие шаги:

Добавить в окно Designer Surface компонент TReplaceDialog. Создать действие, которое будет отображать диалоговое окноЗаменить.

Реализовать обработчики для событий OnFind и OnReplace компонентаTReplaceDialog.

Для создание действия Заменить потребуется выполнить перечисленные ниже шаги:

В поле свойства Caption нового действия введите Заменить… . В поле свойства Hint введите Заменить найденный текст другим текстом. Присвойте действию имя ReplaceAction. Назначьте свойству Shortcut комбинацию Ctrl+H.

Присвойте свойству Tag значение 1 или любое другое значение, отличное от 0. Назначьте обработчик события OnExecute действия Найти событиюOnExecute.

Мы должны изменить свойство Tag с целью повторного использования обработчика события OnExecute действия Найти. После того как вы измените свойство Tag действия Заменить, вы можете изменить обработчик событияOnExecute действия Найти, чтобы отобразить оба диалоговых окна:

Рисунок 26. Код программы

Наконец, мы должны реализовать обработчики для события OnFind. которое происходит при щелчке пользователем на кнопке Найти, и событияOnReplace, которое происходит при щелчке пользователем на кнопкахЗаменить или Заменить все.

На самом деле, писать обработчик для события OnFind не потребуется, поскольку можно воспользоваться существующим обработчиком событияOnFind компонента TFindDialog. Этот обработчик можно использовать по той причине, что вначале было выполнено приведение параметра Sender к компоненту TFindDialog, а также потому, что TReplaceDialog происходит от класса TFindDialog.

В обработчике события OnReplace необходимо проверить, существует ли выделенный текст в редакторе (SelText <> ''), и если он существует, то заменить его строкой из свойства ReplасеТехt.

Рисунок 27. Код программы

Меню Формат в нашем примере приложения является наиболее простым меню. Оно состоит только из двух команд - Перенос по словам и Шрифт.

Рисунок 28.Всплывающее окно

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

Чтобы создать действие Перенос по словам, выполните следующие шаги:

Создайте новое действие и присвойте его свойству AutoCheck значениеTrue, чтобы команда автоматически принимала состояние Checked.

В поле свойства Caption введите Перенос по словам.

Присвойте свойству Checked значение True, поскольку свойствоПеренос по словам редактора имеет значение True по умолчанию.

Присвойте действию имя WordWrapAction.

Рисунок 29. Код программы

Назначьте действие WordWrapAction неименованному пункту в менюФормат.

Чтобы создать команду Формат - Шрифт, сначала добавьте в окно Designer Surface компонент TFontDialog, а затем создайте новое действие. В полеCaption нового действия введите Шрифт, присвойте действию имяFontAction, a затем напишите следующий код в обработчике событияOnExecute:

Рисунок 30. Код программы

Назначьте действие FontAction неименованному пункту в меню Формат.

Отображение подсказок и состояния

Добавьте на форму компонент TStatusBar. Если свойству SimplePanelприсвоить значение True, то компонент TStatusBar сможет отображать только одну порцию информации, заданную свойством SimpleText. Однако если свойству SimplePanel присвоить значение False, мы сможем использовать свойство Panels для создания многопанельной строки состояния и отображения большего количества информации для пользователя. Выберите компонент строки состояния и щелкните на кнопке (...) рядом со свойством Panels, чтобы вывести на экран редактор коллекций Collection Editor.

Щелкните на кнопке Add New (Добавить новую), чтобы создать три панели строки состояния. Присвойте свойству Width первых двух панелей значение 75. чтобы зарезервировать большее пространство для вывода текста. Первая панель будет служить для отображения количества строк в документе и номера выбранной в данный момент отроки. Вторая панель будет использоваться для отображении идентификатора Modified (Изменено), если содержимое редактора будет изменяться, а последняя панель будет применяться для вывода подсказок.

Наилучшим местом для этого кода является событие OnIdle приложения, поэтому добавьте в окно Designer Surface компонент TApplicationEvents и в обработчик события OnIdle поместите следующий код:

Рисунок 31. Код программы

Чтобы отобразить подсказку в последней панели, подготовьте обработчик для события OnHint:

Рисунок 32. Код программы

Панель инструментов

Теперь нам осталось сделать всего две вещи: добавить глифы для наиболее часто используемых действий, а затем поместить эти действия в панель инструментов. Для начала добавьте в окно Designer Surface компонентTImageList, присвойте ему имя Normal, а затем добавьте глифы для действийNew, Open, Save, Undo, Cut, Copy, Paste, Delete и Find. После того как вы добавите эти изображения в компонент TImageList, назначьтекомпонентTImageList компонентам TActionList, TToolbar и TMainMenu, после чего откройте редактор Action List и назначьте глифы соответствующим действиям.

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

При желании можете также изменить следующие два свойства, чтобы придать панели инструментов более привлекательный вид: Присвойте свойству AutoSize значение True, чтобы удалить пустое пространство в панели инструментов. Присвойте свойству ShowCaptions значение True, чтобы отобразить заголовки кнопок (если вы сделаете это, то должны будете удалить символы ам-персанда и точки из заголовков кнопок).

Рисунок 33.Готовая программа

ЗАКЛЮЧЕНИЕ


В заключении материала об асинхронном вводе-выводе следует отметить сложность реализации такого способа ввода-вывода. Для многих приложений, работающих с несколькими устройствами и/или сетевыми соединениями синхронная модель неудобна. Работа в режиме опроса тоже не всегда приемлема.

Решение этих проблем известно давно и называется асинхронный ввод/вывод. В этом режиме системные вызовы ввода/вывода возвращают управление сразу после формирования запроса к драйверу устройства, как правило, даже до того, как данные будут скопированы в системный буфер.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ


1.Практикум по дисциплине "Информатика и программирование". Князева М.Д. 2010 г.

. Основы программирования в Delphi XE (+CD) Никита Культин 2011 г.

.Основы алгоритмизации и программирования Семакин И.Г., Шестаков А.П. 2012 г.

. Внутренний мир Borland Delphi Иван Хладни 2006 г.

ПРИЛОЖЕНИЕ А

note;, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,, StdCtrls, Printers, clipbrd, OleCtrls, vcspell3, ExtCtrls;= class(TForm): TMemo;: TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TOpenDialog;: TSaveDialog;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TFontDialog;: TPrinterSetupDialog;: TPopupMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;FormCreate(Sender: TObject);New1Click(Sender: TObject);Undo1Click(Sender: TObject);Cut1Click(Sender: TObject);Copy1Click(Sender: TObject);Paste1Click(Sender: TObject);AlignLeft1Click(Sender: TObject);AlignRight1Click(Sender: TObject);AlignCenter1Click(Sender: TObject);WordWrap1Click(Sender: TObject);Exit1Click(Sender: TObject);Edit1Click(Sender: TObject);SelectAll1Click(Sender: TObject);Clear1Click(Sender: TObject);Memo1Change(Sender: TObject);FormResize(Sender: TObject);Open1Click(Sender: TObject);Save1Click(Sender: TObject);CountChars1Click(Sender: TObject);Font1Click(Sender: TObject);Print1Click(Sender: TObject);FormCloseQuery(Sender: TObject; var CanClose: Boolean);SaveAs1Click(Sender: TObject);ReadOnly1Click(Sender: TObject);About1Click(Sender: TObject);Cut2Click(Sender: TObject);Copy2Click(Sender: TObject);Paste2Click(Sender: TObject);SelectAll2Click(Sender: TObject);PopupMenu1Popup(Sender: TObject);: string;: bool;SaveChanges: Boolean;Save: Boolean;SaveAs: Boolean;;: TForm1;