Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учимся программировать.doc
Скачиваний:
8
Добавлен:
01.04.2025
Размер:
754.18 Кб
Скачать

Простой текстовый редактор

На этом занятии мы создадим простой текстовый редактор (почти такой как стандартный Блокнот).

Создадим новый (стандартный) проект. Ввод и редактирование текста будет производится в текстовом поле (TextBox), поэтому поместим этот компонент на форму и установим его свойства.

Объект

Свойство

Значение

Форма

имя

frmNotepad

Caption

Блокнот

Текстовое поле - TextBox

имя

txtNotepad

text

"" (пустая строка)

MiltiLine

True

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

Создание меню в Visual Basic осуществляется с помощью специального инструмента создания меню — редактора меню. Окно редактора меню открывается одним из трех способов: путем нажатия комбинации клавиш [Ctrl+E], нажатием соответствующей кнопки на панели инструментов или после выбора команды меню Инстументы→Редактор меню... (Tools→Menu Editor...).

 Проще всего создавать меню при помощи встроенного редактора меню Visual Basic. Для этого сначала в поле Название (Caption) окна редактора вводится текст, который будет виден в строке меню. Для быстрого открытия меню или вызова команды используются горячие клавиши. Для определения горячих клавиш достаточно в поле Название (Caption) перед соответствующей буквой поставить амперсанд (&). Например, для быстрого открытия меню File в поле Caption диалогового окна редактора меню необходимо ввести "&File".

Второй шаг — назначение имени элементу меню (так же, как любому элементу управления). Учтите, что Visual Basic не задает имя по умолчанию, как для других элементов управления. При назначении имен элементам меню также нужно соблюдать правила. Имя должно состоять из следующих частей: прежде всего, префикса, указывающего, что это меню, т.е. mnu; затем следует: для пунктов главного меню — имя пункта, для подменю — сокращенные имена родительских пунктов, а затем собственное имя меню.

Последняя задача при создании меню — определение уровней. Для этого воспользуйтесь кнопками со стрелками. Кнопка со стрелкой вправо смещает элемент меню на уровень ниже, а со стрелкой влево — на уровень выше. Кнопки с вертикальными стрелками изменяют позицию отдельных элементов меню, т.е. перемещают их в списке вверх или вниз.

Поле Быстрая клавиша (Shortcut) позволяет определить комбинации клавиш для быстрого доступа к отдельным элементам меню. Среди наиболее часто используемых приложениями Windows комбинаций клавиш можно отметить следующие: [Ctrl+X] (Вырезать - Cut), [Ctrl+C] (Копировать - Copy), [Ctrl+V] (Вставить - Paste).

В последней строке верхней половины окна редактора меню есть еще три свойства элементов меню. Свойство Видимо (visible) позволяет отображать или скрывать отдельные элементы меню. Свойство Включено (Enabled) функционирует так же, как в других элементах управления: если его значение False, то текст надписи подсвечивается серым цветом и пользователь не может выполнить эту команду меню. Свойство Отмечено (Checked) встречается в данной книге впервые. Оно позволяет пометить выбранный элемент меню галочкой. 

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

Для создания процедуры выполнения команды меню следует во время проектирования выбрать соответствующий пункт в форме. При этом создастся процедура обработки события щелчок (click). Другие элементы меню можно найти и в списке объектов окна кода.

Итак создадим меню.

Структура меню представлена на рисунке:

 

Имя

Название (Caption)

Быстрая клавиша

mnuFile

&Файл

 

mnuFNew

Созд&ать

Ctrl+N

mnuFOpen

&Открыть...

Ctrl+O

mnuFSave 

&Сохранить

Ctrl+S

mnuFSaveAs 

Сохранить &как...

 

mnuEdit 

&Правка

 

mnuECut

&Вырезать

Ctrl+X

mnuECopy

&Копировать

Ctrl+C

mnuEPaste

Вст&авить

Ctrl+V

mnuEDel 

&Удалить

 

Нажимаем [Ok] и получаем готовое меню (осталось, только, добавить обработку кликов по его пунктам).

 

Напишем обработчики событий щелчка по пунктам меню.

Для создания процедуры выполнения команды меню следует во время проектирования выбрать соответствующий пункт в форме. При этом создастся процедура обработки события click. Другие элементы меню можно найти и в списке объектов окна кода.

Одно из основных достоинств Windows — средства поддержки работы в многозадачном режиме, позволяющие одновременно выполнять несколько приложений и других процессов. Для организации передачи данных и связи между программами в Windows созданы инструменты и структуры, обеспечивающие простое решение указанных задач. Одна из таких возможностей — обмен данными через буфер обмена (Clipboard). Команды Cut (Вырезать), Copy (Копировать) и Insert (Вставить), которые имеются в меню Edit (Правка) всех программ, работающих в среде Windows, используют буфер обмена для временного хранения данных.

Буфер обмена является общим хранилищем данных для всех приложений Windows. Поэтому данными, помещенными в буфер обмена, можно воспользоваться в любом приложении Windows. Однако при этом следует учитывать формат данных. Содержимое буфера обмена можно просмотреть с помощью программы CLIPBRD.EXE, входящей в состав Windows.

Доступ к буферу обмена Windows из приложения VisualBasic обеспечивает объект Clipboard.

Чтобы каждый элемент управления получал данные в понятном для него формате, например, объект TextBox — символьные строки, a PictureBox — графические изображения, следует использовать соответствующие методы объекта Clipboard. Методы SetText и GetText соответствующих объектов предназначены для работы с текстом, а методы GetData и SetData — для работы с графикой. Используя различные методы, разработчик при передаче информации может обеспечить совместимость форматов данных для выбранного элемента управления. Для записи и считывания текстовых данных в объект clipboard и из него предназначены методы SetText и GetText. 

Метод SetText записывает текстовую строку в буфер обмена и заменяет текущее содержимое буфера.

Скопировать содержимое выделенного текстового поля txtNotepad в буфер обмена можно следующим оператором: Clipboard.SetText txtNotepad.Text

Метод GetText возвращает содержимое буфера обмена в виде текстовой строки.

Чтобы заменить выделенный текст в текстовом поле содержимым буфера обмена, следует воспользоваться методом GetText: txtNotepad.SelText = Clipboard.GetText()

Если буфер обмена содержит данные, то после вызова метода SetData или SetText данные указанного формата переписываются в объект, но в буфере сохраняются данные в других форматах. Чтобы в буфере не находились одновременно данные из нескольких приложений, перед экспортом данных в Clipboard следует удалить все его содержимое. Для этого применяется метод Clear: Clipboard.Clear

Private Sub mnuECopy_Click() Clipboard.Clear Clipboard.SetText txtNotepad.SelText End Sub Private Sub mnuECut_Click() Clipboard.Clear Clipboard.SetText txtNotepad.SelText txtNotepad.SelText = "" End Sub Private Sub mnuEDel_Click() txtNotepad.SelText = "" End Sub Private Sub mnuEPaste_Click() txtNotepad.SelText = Clipboard.GetText() End Sub

Для реализации операций с файлами потребуется дополнительный элемент управления - диалоговое окно (CommonDialоg). Это дополнительный элемент управления. Для того чтобы он появился на панели компонентов необходимо выполнить следующие действия:

Выбрать в VisualBasic Проект → Компоненты (или [Cntr+T] )и установить флажок у компонента Microsoft Common Dialog Control 6.0.

 

 

Панель компонентов дополнится новым компонентом. Переместите его на форму в любое место (этот компонент не визуальный и виден не будет). Присвойте новому объекту имя (name): dlgFile.  Затем вызовете страницы свойств (щелчок правой кнопкой → Propirties) и установите нужные свойства на соответствующей закладке (в зависимости от того какой диалог вы вызываете).

Теперь напишем код обработки щелчков по пунктам меню "Файл".

Private Sub mnuFNew_Click() txtNotepad.Text = "" dIgFile.FileName = "" End Sub Private Sub mnuFOpen_Click() dIgFile.ShowOpen If dIgFile.FileName <> "" Then Open dIgFile.FileName For Input As #1 Do While Not EOF(1) Input #1, s$ txtNotepad.Text = txtNotepad.Text + s$ + vbCrLf   'vbCrLf - символ перевода строки (chr (13) & Chr (10)) Loop Close #1 End If End Sub Private Sub mnuFSave_Click() If dIgFile.FileName <> "" Then Open dIgFile.FileName For Output As #1 Print #1, txtNotepad.Text Close #1 Else mnuFSaveAs_Click End If End Sub Private Sub mnuFSaveAs_Click() dIgFile.ShowSave If dIgFile.FileName <> "" Then Open dIgFile.FileName For Output As #1 Print #1, txtNotepad.Text Close #1 End If End Sub

Приложение работает. Теперь мы имеем возможность производить простые операции редактирования текста (копировать, вырезать, вставлять) и операции открытия и сохранения файлов.

 

Продолжим.

Для удобства работы дополним текстовое поле полосой прокрутки. Добавим вертикальную прокрутку, для этого свойству ScrollBars установим соответствующее значение. Теперь, если весь текст не вмещается в текстовое поле, появится полоса прокрутки.

Обратимся к меню. В меню должны быть доступны только те действия, которые имеют смысл в данный момент. Другими словами, если нет выделенного текста или изображения, команды копирования и вырезания должны быть недоступны. Обычно если какой-либо элемент управления не может в данный момент выполнить требуемых от него действий, этот элемент управления должен быть недоступен. Поэтому нужно проверять, какая команда меню может быть выполнена в данный момент: вырезания и копирования или вставки. В зависимости от этого соответствующие команды в меню должны быть доступны или недоступны. Лучше всего такую проверку выполнять путем обработки события Click команды меню Edit. Это событие наступает, как только пользователь откроет соответствующее меню. В процедуре обработки события можно поместить подпрограмму, определяющую состояние команды меню. Например, можно проверить, позволяет ли текущее состояние программы выполнить требуемое действие.

Пункт "Вставка" должен быть активен только в том случае, если в буфере обмена есть текст.

Private Sub mnuEdit_Click() mnuEPaste.Enabled = False If Clipboard.GetText() <> "" Then mnuEPaste.Enabled = True End Sub

Вырезать, копировать и удалять можно только если выделен какой-либо блок текста.

Private Sub mnuEdit_Click() mnuEPaste.Enabled = False mnuECut.Enabled = False mnuECopy.Enabled = False mnuEDel.Enabled = False  If Clipboard.GetText() <> "" Then mnuEPaste.Enabled = True If txtNotepad.SelText <> "" Then mnuECut.Enabled = True mnuECopy.Enabled = True mnuEDel.Enabled = True End If End Sub

Хорошо. Теперь меню работает как надо!

Осталось исправить еще одну неприятную особенность: при изменении размеров окна размеры текстового поля не изменяются, в результате возникает такая вот картина:

Исправим. Добавим код изменяющий размеры текстового поля, если происходит изменение размеров формы:

Private Sub Form_Resize() txtNotepad.Top = 0 txtNotepad.Left = 0 txtNotepad.Width = frmNotepad.Width - 100 txtNotepad.Height = frmNotepad.Height - 800 End Sub

Так как на форме не только текстовое поле, но и меню, и полоса прокрутки нам пришлось вычесть их размеры.

Готово! Теперь приложение готово! Мы создали полноценный текстовый редактор.

 

Учимся программировать! Конспекты школьника.

Текстовый редактор с возможностью форматирования текста.

На этом занятии мы продолжим работать над проектом текстового редактора. Сделаем его более продвинутым: научим форматировать текст и добавим панель инструментов.

Добавим в меню новый пункт, позволяющий пользователю вызвать окно выбора шрифта.

 

Имя

Название (Caption)

Быстрая клавиша

mnuFile

&Файл

 

mnuFNew

Созд&ать

Ctrl+N

mnuFOpen

&Открыть...

Ctrl+O

mnuFSave 

&Сохранить

Ctrl+S

mnuFSaveAs 

Сохранить &как...

  

mnuEdit 

&Правка

  

mnuECut

&Вырезать

Ctrl+X

mnuECopy

&Копировать

Ctrl+C

mnuEPaste

Вст&авить

Ctrl+V

mnuEDel 

&Удалить

  

mnuFormat

Фор&мат

 

mnuFFont

&Шрифт

 

Для выбора шрифта воспользуемся компонентом CommonDialоg (тот который на прошлом занятии использовали для выбора файла при сохранении или открытии), содержит стандартные диалоговые окна Windows: открыть/сохранить файл, цвет, шрифт, печать, помощь.

Присвойте объекту имя (name): dlgMyDialоg.  Затем вызовете страницы свойств (щелчок правой кнопкой → Propirties) и установите нужные свойства на закладке "Font" (Шрифт).

У CommonDialog есть свойство Flags которое управляет многими параметрами диалога. Полный список всех констант можно получить с помощью проводника объектов (Object browser) Вид → Проводник объектов или F2.

В нашем примере свойство Flags мы установили = 258. Откуда взялось это значение? Это сумма двух констант cdlCFPrinterFonts = 2 (использовать только те шрифты, которые поддерживают принтеры) и cdlCFEffects = 256 (разрешить эффекты форматирования: подчеркивание, зачеркивание и выбор цвета на панели выбора шрифта).

Это свойство можно было бы задать и программно. Например, так: dlgMyDialоg.Flags =  cdlCFPrinterFonts  + cdlCFEffects  или так: dlgMyDialоg.Flags = 256 + 2 или так: dlgMyDialоg.Flags = 258

Работаем дальше.

Не забудьте заменить во всем коде программы dlgFile на dlgMyDialоg (т.к. мы изменили имя объекта: был dlgFile, а стал - dlgMyDialоg). Для этого удобно воспользоваться командой Правка → Заменить...

Теперь можно уже, наверное, писать обработчик события для нового пункта меню... 

Прежде чем писать обработчик события для нового пункта меню, необходимо произвести еще одну замену: необходимо обычное текстовое поле заменить компонентом RichTextBox. Все дело в том, что обычное текстовое поле не позволяет изменять параметры шрифта для части текста, позволяет изменить только то как будет отображаться текст в текстовом поле. Для примера сравните стандартные программы Windows Блокнот и WordPad.

Это дополнительный элемент управления. Для того чтобы он появился на панели компонентов необходимо выполнить следующие действия:

Выбрать в VisualBasic Проект → Компоненты (или [Cntr+T] )и установить флажок у компонента Microsoft Rich Textbox 6.0.

Замените текстовое поле усовершенствованным текстовым полем.

Объект

Свойство

Значение

RichTextbox 

имя

txtNotepad

text

"" (пустая строка)

MiltiLine

True

Вот теперь создадим обработчик меню Формат → Шрифт...

Для вызова окна выбора шрифта используется метод ShowFont. Перед выводом окна зададим первоначальные значения в соответствии с выделенным текстом (название шрифта, размер, начертание: жирный, начертание: курсив).

Private Sub mnuFFont_Click() dlgMyDialоg.FontName = txtNotepad.SelFontName dlgMyDialоg.FontSize = txtNotepad.SelFontSize dlgMyDialоg.FontBold = txtNotepad.SelBold dlgMyDialоg.FontItalic = txtNotepad.SelItalic dlgMyDialоg.Color = txtNotepad.SelColor dlgMyDialоg.FontStrikethru = txtNotepad.SelStrikeThru dlgMyDialоg.FontUnderline = txtNotepad.SelUnderline dlgMyDialоg.ShowFont End Sub

После того как пользователь выбран нужные параметры присвоим их выделенному тексту.

Private Sub mnuFFont_Click() dlgMyDialоg.FontName = txtNotepad.SelFontName dlgMyDialоg.FontSize = txtNotepad.SelFontSize dlgMyDialоg.FontBold = txtNotepad.SelBold dlgMyDialоg.FontItalic = txtNotepad.SelItalic dlgMyDialоg.Color = txtNotepad.SelColor dlgMyDialоg.FontStrikethru = txtNotepad.SelStrikeThru dlgMyDialоg.FontUnderline = txtNotepad.SelUnderline dlgMyDialоg.ShowFont txtNotepad.SelFontName = dlgMyDialоg.FontName txtNotepad.SelFontSize = dlgMyDialоg.FontSize txtNotepad.SelBold = dlgMyDialоg.FontBold txtNotepad.SelItalic = dlgMyDialоg.FontItalic txtNotepad.SelColor = dlgMyDialоg.Color txtNotepad.SelStrikeThru = dlgMyDialоg.FontStrikethru txtNotepad.SelUnderline = dlgMyDialоg.FontUnderline End Sub

Теперь мы можем форматировать текст.

Если вы желаете, чтобы текст сохранялся как обычно, без форматирования, то можете оставить все как есть.

Для того чтобы сохранить (а также открыть) форматированный текст необходимо изменить свойства dlgMyDialоg: фильтр - Текстовые файлы(*.txt)|*.txt|Файлы RTF(*.rtf)|*.rtf, ФильтрИндекс - 2 (По-умолчанию показывать 2-й фильтр);

и функции mnuFSave_Click(), mnuFSaveAs_Click(), mnuFSave_Click().

Private Sub mnuFSave_Click() If dlgMyDialоg.FileName <> "" Then txtNotepad.SaveFile dlgMyDialоg.FileName Else mnuFSaveAs_Click End If End Sub Private Sub mnuFSaveAs_Click() dlgMyDialоg.ShowSave If dlgMyDialоg.FileName <> "" Then txtNotepad.SaveFile dlgMyDialоg.FileName End If End Sub

Private Sub mnuFOpen_Click() dlgMyDialоg.ShowOpen If dlgMyDialоg.FileName <> "" Then txtNotepad.LoadFile dlgMyDialоg.FileName End If End Sub

Готово!

Теперь для удобства работы пользователя давайте добавим стандартную панель инструментов.

Панель инструментов служит для быстрого ввода команд.  Этот элемент управления не входит в стандартный набор управляющих элементов. Для работы с ним необходимо воспользоваться дополнительным набором управляющих элементов Microsoft Windows Common Control 6.0.

Выберите в VisualBasic Проект → Компоненты (или [Cntr+T] )и установить флажок у компонента Microsoft Windows Common Control 6.0. Панель компонетнов дополнится новыми элементами. Поместите на форму элемент ToolBar.

Далее для создания панели инструментов можно воспользоваться мастером (а можно и не воспользоваться).

Выберем в левой  части те кнопки которые потребуются в нашем приложении.

Жмем [готово] и панель инструментов появится на форме.

Следует обратить внимание на то, что панель инструментов в любой момент можно отредактировать. Для этого щелкните по панели правой кнопкой мыши и выберите пункт "свойства". 

Есть еще один важный момент - обычно, панель инструментов связана с компонентом ImagesList (список изображений). При использовании ранних версий управляющих элементов Microsoft Windows Common Control, например, 5.0, приходилось ImagesList добавлять самостоятельно. В нашем случае компонент ImagesList добавляется и настраивается автоматически.

Найдете этот компонент на форме (для этого лучше воспользоваться  Окном свойств) и посмотрите его свойства.

Панель инструментов добавлена на форму, теперь создадим событийную процедуру обработки щелка по кнопкам этой панели. Сделайте двойной щелчок по панели в окне формы. Откроется окно кода, содержащая следующий текст:

Private Sub Toolbar1_ButtonClick(ByVal Button As MSComCtlLib.Button) On Error Resume Next Select Case Button.Key Case "New" 'ToDo: Add 'New' button code. MsgBox "Add 'New' button code." Case "Open" 'ToDo: Add 'Open' button code. MsgBox "Add 'Open' button code." Case "Save" 'ToDo: Add 'Save' button code. MsgBox "Add 'Save' button code." Case "Copy" 'ToDo: Add 'Copy' button code. MsgBox "Add 'Copy' button code." Case "Cut" 'ToDo: Add 'Cut' button code. MsgBox "Add 'Cut' button code." Case "Paste" 'ToDo: Add 'Paste' button code. MsgBox "Add 'Paste' button code." Case "Delete" 'ToDo: Add 'Delete' button code. MsgBox "Add 'Delete' button code." End Select End Sub

Для каждой кнопки назначим соответствующую процедуру уже созданную для пунктов меню.

Private Sub Toolbar1_ButtonClick(ByVal Button As MSComCtlLib.Button) On Error Resume Next Select Case Button.Key Case "New" mnuFNew_Click Case "Open" mnuFOpen_Click Case "Save" mnuFSave_Click Case "Copy" mnuECopy_Click Case "Cut" mnuECut_Click Case "Paste" mnuEPaste_Click Case "Delete" mnuEDel_Click End Select End Sub

Теперь исправим процедуры обработки изменения размера формы (Resize) так как панель инструментов теперь закрывает часть текстового поля.

Private Sub Form_Resize() txtNotepad.Top = Toolbar1.Height txtNotepad.Left = 0 txtNotepad.Width = frmNotepad.Width - 100 txtNotepad.Height = frmNotepad.Height - 800 End Sub

Программа почти готова. Почти? "Проиграйтесь" с программой и вы обнаружите ошибку: если выделить текст разного формата, то при выборе пункта Формат → Шрифт возникает ошибка при установки параметров окна выбора формата шрифта.

Для борьбы с этой неприятностью воспользуемся оператором перехвата ошибок On Error.

Оператор On Error не выполняет непосредственно никакой обработки ошибок, а лишь передает управление ответственному за обработку ошибок фрагменту программы.

Для определения типа ошибки можно использовать объект Err, свойство которого Number содержит код последней возникшей ошибки.

Итак, в начале процедуры помещается оператор On Error для перехвата возникающих ошибок. В нем указывается метка, к которой происходит переход при возникновении ошибки. Обычно эта метка находится в конце процедуры и перед ней помещается оператор Exit. Благодаря этому оператору, при безошибочном выполнении процедура в этом месте завершает свою работу, и фрагмент процедуры после метки выполняется только после возникновения ошибки.

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

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

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

Private Sub mnuFFont_Click() On Error GoTo ErrLabel 'Включает обработку ошибок dlgMyDialоg.FontName = txtNotepad.SelFontName dlgMyDialоg.FontSize = txtNotepad.SelFontSize dlgMyDialоg.FontBold = txtNotepad.SelBold dlgMyDialоg.FontItalic = txtNotepad.SelItalic dlgMyDialоg.ShowFont txtNotepad.SelFontName = dlgMyDialоg.FontName txtNotepad.SelFontSize = dlgMyDialоg.FontSize txtNotepad.SelBold = dlgMyDialоg.FontBold txtNotepad.SelItalic = dlgMyDialоg.FontItalic Exit Sub ErrLabel: 'обработка ошибки 'тут можно что-то сделать для обработки ошибки Resume Next End Sub

Теперь готово! Программа работает.