21 мая 2015 г.

VB .Net: Создание своего блокнота (часть 2)

Как я уже писал, статья разбита на части:
В предыдущих частях я описывал:
  • как создать проект в Visual Studio (часть 1).
В этой, я хочу рассказать:
  • как открыть текстовый файл или RTF файл.

Как открыть текстовый файл и файл RTF

Значит, мы создали новый проект, добавили на форму RichTextBox1, OpenFileDialog1, SaveFileDialog1, Button1 и Button2.
Для удобства, понятности и красоты кода дадим им новые имена:
RTB, OFD, SFD, butOpen, butSave
Чтобы присвоить новое имя любому элементу управления нужно в режиме Конструктора нажать на элемент и зайти в его свойства или нажать F4 (другие способы описаны в части 1) и свойству Name присвоить другое значение. На Рис.1. элементу управления RichTextBox1 я даю имя RTB.
Рис. 1. Изменение свойства Name у элемента управления
По аналогии с RichTextBox1 сделать то же самое с OpenFileDialog1, SaveFileDialog1, Button1 и Button2.

Дальше продолжим то, что начали в первой части статьи, а именно, кликнули 2 раза по кнопке butOpen. Тем самым вошли в модуль формы, чтобы написать процедуру обработки события Click этой самой кнопки. Это означает, что если пользователь нажмет на эту кнопку, то начнет выполняться эта процедура.
Это кнопка открытия файла, а значит код процедуры должен открывать текстовый файл.  

Существует несколько способов это сделать:
Private Sub butOpen_Click(sender As Object, e As EventArgsHandles butOpen.Click
    Dim FilePath As String

    If OFD.ShowDialog() = DialogResult.OK Then 'если пользователь выбирает файл для открытия
        FilePath = OFD.FileName 'путь к файлу

        'вариант 1
        RTB.Text = My.Computer.FileSystem.ReadAllText(FilePath)

        'вариант 2
        RTB.Lines = IO.File.ReadAllLines(FilePath)

        'вариант 3
        RTB.Text = IO.File.ReadAllText(FilePath)

        'вариант 4
        Dim SR As New IO.StreamReader(FilePath)
        RTB.Text = SR.ReadToEnd
    End If
End Sub
Здесь я навел 4 варианта. Понятно, что оставить нужно только 1 из них, какой душе угодно.
Я обычно использую вариант 3. Он универсален и самый краткий в плане количества символов кода.
Это то, что касается обычных текстовых файлов. Под текстовыми файлами я подразумеваю не файлы с расширением *.txt, а все файлы, которые содержат в себе только текст, без картинок, выделений цветом, фона, выравниваний и т.д.
В коде наше открытие файла мы заключили в условие:
If OFD.ShowDialog() = DialogResult.OK Then
Это нужно для того, чтобы в том случае, если пользователь в открывшемся OFD нажмет отмена или закроет OFD - не словить ошибку. То же самое будем делать c SFD при сохранении файла, т.к. там ошибка возникает, если имя файла пустое, а если заполненое, даже если пользователь нажмет отмена, то SFD все равно сохранит файл, что вообще противоречит логике работы программы.

О RTF файлах. Это формат "богатого" текста. С точки зрения пользователя - это может быть обычный текстовый документ, где текст красиво оформлен: есть выравнивания, выделение цветом, присутствуют изображения и т.д. Как это выглядит с точки зрения программиста можно убедиться, создав любой RTF документ в стандартной программе WordPad или MS Word, затем запустить наш блокнот, нажать кнопку Open и увидеть что-то такое (Рис. 2): 
Рис.2. RTF-файл открыт как обычный текст
Бред какой-то, да? Нет, не бред, а мета-теги. Они служат для того, чтобы рассказать программе, как нужно расположить текст, выделить его, разукрасить. 
Программе то хорошо, а если не хорошо, то все равно, что там открывается и как оно показывается. Как нам увидеть наш файл с точки зрения пользователя? Как преобразовать эти чудные мета-теги нормальный, человеческий вид? Очень просто, даже проще, чем вы думаете. У RTB есть один хороший метод LoadFile(). Приведу сначала весь текст программы, а потом объясню.
Imports System.IO

Public Class Form1
    Private Sub butOpen_Click(sender As Object, e As EventArgs) Handles butOpen.Click
        Dim FilePath As String

        If OFD.ShowDialog() = DialogResult.OK Then 'если пользователь выбирает файл для открытия
            FilePath = OFD.FileName 'путь к файлу
            Dim FileExt = LCase(Path.GetExtension(FilePath)) 'расширение файла

            If FileExt = ".txt" Then
                RTB.Text = File.ReadAllText(FilePath)
            ElseIf FileExt = ".rtf" Then
                RTB.LoadFile(FilePath)
            End If
        End If
    End Sub
End Class
Пояснения: 
Первой строкой я импортирую пространство имен System.IO. Это делается для того, чтобы сократить и улучшить читаемость кода. 
Теперь вместо:
System.IO.Path.GetExtension(FilePath) и System.IO.File.ReadAllText(FilePath)
Я могу написать:
Path.GetExtension(FilePath) и File.ReadAllText(FilePath)
Дальше я получаю путь к файлу благодаря OFD. И так, как расширений при открытии теперь у меня может быть несколько, я должен узнать это расширение и в зависимости от того, какой тип файла - открыть его, как обычный текст или как RTF.
Пробуем открыть текстовый файл. Открылся. Теперь пробуем открыть файл RTF. Теперь то, что открывалось, как набор мета-тегов (Рис.2), стало нормальным, оформленным текстом (Рис.3):

Комментариев нет:

Отправить комментарий

Спрашивайте, критикуйте, оставьте свое мнение