Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование от Чертенка.ру Выпуск 3. Блокнот своими руками под .NET


Информационный Канал Subscribe.Ru

Доброго времени суток, уважаемые подписчики!

За прошедшую неделю в сети были замечены следующие интерсные новости:

  1. Презентация Borland Developer Studio 2006. Конференция разработчиков, на которой была представлена Borland Developer Studio 2006(Внимание! Большой траффик.)
  2. Отчет о Firebird Conference 2005.
  3. Отчет о семинаре Borland в Киеве 24.11.2005

В сегодняшнем выпуске мы продолжим цикл статей, посвященных .NET. Автором данного цикла статей является Albert.

Перед тем как погрузиться в скучные разговоры про линейное и объектное программирование, давайте напишем простой текстовый редактор. А почему бы и нет? Заодно и посмотрим, на что годится эта хваленная .net :-)

Для начала определимся - чего нам хотелось бы увидеть в конечном итоге? В душе хотелось бы написать самый крутой редактор, чтоб и для HTML, и для C#, и бинарник подправить… Но это лишь мечты, да и других повседневных задач предостаточно. А вот написать для пробы пера редактор типа NotePad это всегда можно. Тем паче, пишется он – как будет видно - очень даже элементарно. Но обо всем по порядку.

Итак, запускаем Visual C# 2005 (о том, что это такое и где взять – читайте в нашем прошлом выпуске). Идем в меню File > New > Project. В появившемся окне выбираем Windows Application, вводим название в поле Name (например, MyNotepad). Жмем ОК. После небольшого промежутка времени мы должны увидеть форму – пустое окошко с заголовком Form1. Это будет главным окном нашей программы. Давайте попробуем запустить наше приложение. Для этого делаем – Debug > Start Debuging (либо зеленый треугольник на панели инструментов, либо F5). Немного потарахтев винчестером, Windows запустит нам наше приложение – пустое окошко.

Вдоволь наигравшись (закрывать его как обычное приложение – крестиком), переходим к следующему шагу. Находим где-то справа окошко Properties. В выпадающем списке (сверху) выбираем Form1 (либо один раз кликнем на нашу заготовку мышкой). Находим свойство (Name). Это название компонента. По этому названию мы будем обращаться к компоненту из программного кода. Давайте поменяем его с Form1 на MainForm.

Теперь ищем ToolBox. Для людей пришедших с Delphi – это тоже самое, что и Component Palete. Для работы нам нужны следующие компоненты – MenuStrip (меню программы), StatusStrip (строка состояния), TextBox (сам редактор), OpenFileDialog (диалог открытия файла), SaveFileDialog (сохранение файла). Перетащите эти компоненты из ToolBox на форму (Drag&Drop – как файлы в проводнике). Далее по аналогии с формой, изменим им всем названия – уберем у каждого цифру 1 в конце.

Настало время проектировать меню. Один раз нажмем на полоску в верху формы. Должны увидеть прямоугольник с Type Here. Вводим туда слово Файл. Появились прямоугольники справа и снизу. Как видим – это крайне похоже на меню приложения. Так оно и есть. Давайте его заполним следующим образом:

1.      Файл
    1.1.    Новый
    1.2.    Открыть…
    1.3.    Сохранить
    1.4.    Сохранить как…
    1.5.    -
    1.6.    Выход
2.      Правка
    2.1.    Отменить
    2.2.    -
    2.3.    Вырезать
    2.4.    Копировать
    2.5.    Вставить
    2.6.    Удалить
    2.7.    -
    2.8.    Выделить все
3.      Справка
    3.1.    О программе…

Меню готово! Займемся редактором. Находим в его свойствах Multiline – устанавливаем true. Свойство Dock устанавливаем в Fill. ScrollBars – Both. Уже на что-то похоже.

Теперь будем наполнять этот интерфейс функциональностью. Для начала займемся меню Правка. Как можно заметить, названия пунктов меню было дано с использованием русских символов (например, отменить ToolStripMenuItem). Лично мне это не совсем нравится (хотя, C# допускает использование русских именований). Давайте пункты меню Правка переименуем в – miCancel, miCut, miCopy, miPaste, miDelete, miSelectAll (пункты-линии пропускаем). Надо заметить, что на ряду с поддержкой русских названий, C# различает регистр букв – так, пыво и пЫво для него разные слова.

Переименовали? Замечательно. Давайте дважды кликнем по пункту Отмена (ближе к левому краю). Должен открыться редактор кода. Напишем там следующее:

private void miCancel_Click(object sender, EventArgs e)
{
    textBox.Undo();
}

Это значит, что при нажатии на кнопку будет выполнена функция miCancel_Click. Функция выполняет всего один метод – вызывает «Отменить» и нашего элемента «Редактор текста».

Так же поступаем с последующими пунктами:

private void miCut_Click(object sender, EventArgs e)
{
    textBox.Cut();
}

private void miCopy_Click(object sender, EventArgs e)
{
    textBox.Copy();
}

private void miPaste_Click(object sender, EventArgs e)
{
    textBox.Paste();
}

private void miDelete_Click(object sender, EventArgs e)
{
    textBox.SelectedText = "";
}

private void miSelectAll_Click(object sender, EventArgs e)
{
    textBox.SelectAll();
}

Можно запустить программу и поиграться с меню Правка.

Теперь сделаем так, чтобы программа у нас открывала и сохраняла файлы. Для начала переименуем пункты меню Файл: miNew, miOpen, miSave, miSaveAs, miClose. Далее нам нужен сам функционал. Для этого надо написать пару-тройку функций. Как их писать, мы поговорим позже, а пока напишите следующий код (сразу после последней функции):

private String fileName;

private void UpdateCaption()
{
    const String appName = "Блок.нет";
    Text = String.Format("{0}{1} - {2}",
        appName, ((textBox.Modified)?"*":""),
         ((fileName == "")?"безимени":fileName));
}

private void CreateDocument()
{
    if (!CanDoAction()) return;
    fileName = "";
    UpdateCaption();
    textBox.Modified = false;
}

private void OpenDocument(String newFileName)
{
    try
    {
        using (FileStream fs = File.OpenRead(newFileName))
        {
            Encoding en = Encoding.GetEncoding(1251);
            Byte[] buff = new Byte[textBox.MaxLength];
            Int32 len = 0;
            textBox.Text = "";

            len = fs.Read(buff, 0, buff.Length);
            if (len > 0)
                textBox.Text += en.GetString(buff, 0, len);

            textBox.Modified = false;
            fileName = newFileName;
            UpdateCaption();
        }
    }
    catch
    {
        MessageBox.Show("Во время открытия произошла ошибка!", "Ошибка",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

private void SaveDocument(String newFileName)
{
    try
    {
        using (FileStream fs = File.Create(newFileName))
        {
            Encoding en = Encoding.GetEncoding(1251);
            Byte[] buff = en.GetBytes(textBox.Text);

            fs.Write(buff, 0, buff.Length);

            textBox.Modified = false;
            fileName = newFileName;
            UpdateCaption();
        }
    }
    catch
    {
        MessageBox.Show("Во время сохранения произошла ошибка!", "Ошибка",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

private Boolean SaveDocument(Boolean changeFileName)
{
    if (fileName == "" || changeFileName)
    {
        if (saveFileDialog.ShowDialog() != DialogResult.OK)
            return false;
        SaveDocument(saveFileDialog.FileName);
    }
    else
        SaveDocument(fileName);

    return true;
}

private Boolean CanDoAction()
{
    if (!textBox.Modified) return true;
    switch (MessageBox.Show("Сохранить изменения?", "Подтверждение",
        MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question))
    {
        case (DialogResult.Yes):
            return SaveDocument(false);
        case (DialogResult.No):
            return true;
        case (DialogResult.Cancel):
            return false;
    }
    return true;
}

Теперь попробуем разобраться, что делает этот код. Начнем с UpdateCaption. Эта функция формируем заголовок окна. Здесь я использовал конструкцию (<условие>)?<истина>:<ложь>. Если условие в скобках принимает значение истина, то выполняется оператор между вопросом и двоеточием. В противном случае, тот, что после двоеточия. В нашем примере, таким способом пишем название файла и ставим звездочку, если файл был изменен.

Далее идут функции по работе с документом – создание документа, открытие и сохранение. Стоит отметить, что сейчас программа работает только с текстом в кодировке ANSI 1251. Тексты Unicode она не поддерживает. Заметим, что каждая функция в конце вызывает UpdateCaption.

В самом начале файла надо добавить строчку в конструктор:

public MainForm()
{
    InitializeComponent();

    CreateDocument(); // добавляем ее
}

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

private void miNew_Click(object sender, EventArgs e)
{
    CreateDocument();
}

private void miOpen_Click(object sender, EventArgs e)
{
    if (openFileDialog.ShowDialog() == DialogResult.OK)
        OpenDocument(openFileDialog.FileName);
}

private void miSave_Click(object sender, EventArgs e)
{
    SaveDocument(false);
}

private void miSaveAs_Click(object sender, EventArgs e)
{
    SaveDocument(true);
}

private void miClose_Click(object sender, EventArgs e)
{
    Close();
}

Чтобы наша форма реагировала на закрытие, находим ее событие (на панельке свойств – значок молнии; нажимаем его и перед нами список событий компонента) FormClosing. Дважды кликнем на поле справа от названия. В редакторе пишем:

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = !CanDoAction();
}

Теперь у нас при попытке закрытия формы будет спрашиваться – стоит ли сохранять документ? Логика проверки в функции CanDoAction (см. выше).

Теперь сделаем так, чтобы при изменении текста появлялась звездочка. Формирование заголовка, как мы помним, реализуется в UpdateCaption. Вот и вызовем его при изменении текста. Для этого находим у TextBox свойство TextChanged. Дважды кликнем на поле и пишем:

private void textBox_TextChanged(object sender, EventArgs e)
{
    UpdateCaption();
}

И напоследок. Выбираем Project > Add New Item… В списке находим AboutBox. Меняем его Name на AboutBox.cs. Жмем ОК. Возвращаемся к нашей главной форме и дважды кликнем по меню «О программе». Пишем там следующий код:

private void miAbout_Click(object sender, EventArgs e)
{
    using (AboutBox ab = new AboutBox())
        ab.ShowDialog();
}

Эта функция покажет диалог о программе. Все. Приложение готово. Если что-то непонятно – не стоит отчаиваться. Эта статья - просто вводная в создание приложений для Windows на .NET. В следующей статье я расскажу про линейное программирование (чему учат в школе). Потом мы узнаем, что такое объектно-ориентированное программирование (ООП), и какие у него плюсы перед «классическим» линейным. Оставайтесь с нами :-). исходные тексты примера можно взять здесь.

В следующих выпусках мы продолжим цикл статей по .Net Framework, поделимся накопленным опытом в области Делфи (использование системных ловушек, автоматическое обновление программы по локальной сети, упрощение работы с репортами FastReport и XLReport, автоматизация работы с СУБД, работа с Excel), расскажем о продуктах фирмы Devrace, а также будут авторские статьи по Делфи

Ждем Ваших откликов на емайл 5781-author@subscribe.ru или subscr@chertenok.ru


Приглашаем авторов в рассылку!


С уважением,
координатор рассылки Алексей aka Gelios.

Наши координаты:

сайт - www.delphi.chertenok.ru
форум - www.forum.chertenok.ru
контактный email - 5781-author@subscribe.ru

Другие проекты:

www.travel.chertenok.ru - сайт о путешествиях!


//

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.allofdelphi
Архив рассылки
Отписаться
Вспомнить пароль

В избранное