Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 999 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00
Самостоятельная работа 13:

Простой текстовый редактор в среде программирования Borland C++Builder 6.0

Написание кода приложения

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

Обработчики категории File

Заготовки обработчиков всех команд меню создаются оболочкой при нажатии соответствующего пункта меню в режиме дизайнера форм.

Для вызова стандартных диалоговых окон открытия и сохранения файла существуют невизуальные компоненты OpenDialog и SaveDialog, которые находятся во вкладке Dialogs палитры компонентов.

  • Добавьте в любое место формы компоненты OpenDialog и SaveDialog из вкладки Dialogs палитры компонентов
  • Измените свойство Name этих компонентов на OpenDialog и SaveDialog соответственно
  • Измените свойство Filter этих компонентов OpenDialog и SaveDialog через редактор фильтра так, чтобы они могли работать с текстовыми файлами

  • Добавьте в описание класса TMainForm объявление закрытой переменной nameForm, в которой будем хранить неизменяемую часть заголовка главного окна. Для этого откройте вкладку UScratchPad.h редактора кода и добавьте код
    Объявление переменной в классе TMainForm
    class TMainForm : public TForm
    {
    __published:	// IDE-managed Components
            TBevel *Bevel;
            TPanel *SpeedBar;
            TSpeedButton *FileOpenBtn;
            TSpeedButton *FileSaveBtn;
            TStatusBar *StatusBar;
            TMemo *MemoEdit;
            TMainMenu *MainMenu;
            TMenuItem *File;
            TMenuItem *FileExit;
            TMenuItem *N1;
            TMenuItem *FilePrintSetup;
            TMenuItem *FilePrint;
            TMenuItem *N2;
            TMenuItem *FileSaveAs;
            TMenuItem *FileSave;
            TMenuItem *FileOpen;
            TMenuItem *FileNew;
            TMenuItem *Help;
            TMenuItem *HelpAbout;
            TMenuItem *HelpContents;
            TMenuItem *Edit;
            TMenuItem *EditReplace;
            TMenuItem *EditFind;
            TMenuItem *N4;
            TMenuItem *EditPaste;
            TMenuItem *EditCopy;
            TMenuItem *EditCut;
            TMenuItem *N5;
            TMenuItem *EditUndo;
            TMenuItem *N3;
            TMenuItem *EditWordWrap;
            TMenuItem *EditSelectAll;
            TOpenDialog *OpenDialog;
            TSaveDialog *SaveDialog;
            void __fastcall FileSaveAsClick(TObject *Sender);
            void __fastcall FileSaveClick(TObject *Sender);
            void __fastcall FileExitClick(TObject *Sender);
            void __fastcall FileOpenClick(TObject *Sender);
            void __fastcall FileNewClick(TObject *Sender);
    private:	// User declarations
            AnsiString nameForm;
    public:		// User declarations
            __fastcall TMainForm(TComponent* Owner);
    };
  • Добавьте в конструктор класса TMainForm инициализацию переменных
    Инициализация в конструкторе класса TMainForm
    __fastcall TMainForm::TMainForm(TComponent* Owner)
            : TForm(Owner)
    {
     nameForm = "Блокнот 1.0";
     Caption = nameForm + "  ";
    }

Обработчики работы с файлами создадим не в том порядке, в котором они следуют в меню Файл, потому что в некоторых новых обработчиках будем использовать вызовы уже созданных ранее.

Обработчик команды Сохранить как...
  • Раскройте категорию File и щелкните на пункте меню Сохранить как... . Оболочка создаст обработчик, который заполните так
    Обработчик команды Сохранить как... категории Файл
    void __fastcall TMainForm::FileSaveAsClick(TObject *Sender)
    {
      if(!MemoEdit->Lines->Count) {
       int result = Application->MessageBox(
         "Нечего сохранять! Сохранить пустой файл?",
         "Сообщение блокнота",
         MB_YESNOCANCEL | MB_ICONSTOP);
       if(result != IDYES)
         return;
     }
    	
     SaveDialog->Title = "Сохранение своего файла как ...";
     if(SaveDialog->Execute()) {
       MemoEdit->Lines->SaveToFile(SaveDialog->FileName);
       MemoEdit->Modified = false;
     }
    	
     AnsiString name = SaveDialog->FileName;
     int pos = LastDelimiter("\\", name);
     if(IsPathDelimiter(name, pos)){
       name = name.Delete(1, pos);
     }
    	
     Caption = nameForm + "  <" + name + ">";
    }
Обработчик команды Сохранить
  • Раскройте категорию File и щелкните на пункте меню Сохранить. Оболочка создаст обработчик, который заполните так
    Обработчик команды Сохранить категории Файл
    void __fastcall TMainForm::FileSaveClick(TObject *Sender)
    {
    // Если нет имени, вызвать SaveDialog
     if(SaveDialog->FileName == "")
       FileSaveAsClick(Sender);
     else {
       MemoEdit->Lines->SaveToFile(SaveDialog->FileName);
       MemoEdit->Modified = false;
     }
    }
Обработчик команды Выход
  • Раскройте категорию File и щелкните на пункте меню Выход. Оболочка создаст обработчик, который заполните так
    Обработчик команды Выход категории Файл
    void __fastcall TMainForm::FileExitClick(TObject *Sender)
    {
     if(MemoEdit->Modified){
       int result = Application->MessageBox(
         "Сохранить изменения?",
         "Сообщение блокнота",
         MB_YESNOCANCEL | MB_ICONWARNING);
       if(result == IDYES)
         FileSaveClick(Sender);
       else if(result == IDCANCEL)
         return;
     }
     Close();
    }
Обработчик команды Открыть...
  • Раскройте категорию File и щелкните на пункте меню Открыть... . Оболочка создаст обработчик, который заполните так
    Обработчик команды Открыть... категории Файл
    void __fastcall TMainForm::FileOpenClick(TObject *Sender)
    {
    // Проверяем необходимость сохранения данных
     if(MemoEdit->Modified) {
       int result = Application->MessageBox(
         "Данные изменены! Сохранить изменения?",
         "Сообщение блокнота",
         MB_YESNOCANCEL | MB_ICONWARNING);
    
       if(result == IDYES)
         FileSaveClick(Sender);
       else if(result == IDCANCEL)
         return;
     }
    	
    // Вызов диалога для выбора имени файла
     OpenDialog->Title = "Свое окно диалога открытия файла";
     OpenDialog->FileName = "";// на случай отказа
     if(OpenDialog->Execute()) {
       if(MemoEdit->Lines->Count > 0)
         MemoEdit->Clear();
       MemoEdit->Lines->LoadFromFile(OpenDialog->FileName);
       SaveDialog->FileName = OpenDialog->FileName;
    	
       AnsiString name = SaveDialog->FileName;
       int pos = LastDelimiter("\\", name);
       if(IsPathDelimiter(name, pos)){
         name = name.Delete(1, pos);
       }
    	
       Caption = nameForm + "  <" + name + ">";
     }
    }
Обработчик команды Создать
  • Раскройте категорию File и щелкните на пункте меню Создать. Оболочка создаст обработчик, который заполните так
    Обработчик команды Создать категории Файл
    void __fastcall TMainForm::FileNewClick(TObject *Sender)
    {
    // Проверяем необходимость сохранения данных
     if(MemoEdit->Modified) {
       int result = Application->MessageBox(
         "Данные изменены! Сохранить изменения?",
         "Сообщение блокнота",
         MB_YESNOCANCEL | MB_ICONWARNING);
    	
       if(result == IDYES)
         FileSaveClick(Sender);
       else if(result == IDCANCEL)
         return;
     }
    	
    // Очищаем компонент Memo
     if(MemoEdit->Lines->Count > 0)
       MemoEdit->Clear();
    	
    // Установим имя нового файла пустым
     SaveDialog->FileName = "";
     Caption = nameForm + "  ";
    }
Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .