Е завдання, 1-й варіант
Перегляд та редагування текстових файлів. Створення та використання меню.
Завдання:
1. Створити програму з назвою “My Viewer and Editor” для створення, перегляду та редагування текстових файлів. Розробіть три варіанти програми: 1) лише для перегляду існуючих текстових файлів; 2) для перегляду, редагування та збереження змінених файлів; 3) до попереднього варіанту добавте функції запису в інший файл (Save as) та створення нових текстових файлів.
2. Створити програму з аналогічними до попереднього завдання функціями, в якій всі команди будуть виконуватися із пунктів меню форми.
Мета:Навчитися використовувати стандартні діалоги Windows для розробки прикладних програм. Навчитися розробляти програми, керування в яких здійснюється за допомогою меню.
Хід роботи:
е завдання, 1-й варіант
1. Створіть форму із такими компонентами: Memo1, Button1, BitBtn1 (сторінка Additional), OpenDialog1 (сторінка Dialogs). Для властивості Kind кнопки BitBtn1 встановіть значення bkClose. Ця кнопка буде мати таке функціональне призначення — закриття форми.
Компонент OpenDialog1 можна розташовувати у будь-якому місці форми тому, що цей компонент є невидимим під час виконання програми. При його активізації (звертанні до його методу OpenDialog1->Execute) з’явиться стандартне для Windows вікно діалогу ‘Открытие файла’. Компонент Memo1 є багаторядковим редактором, в якому можна переглядати та редагувати тексти. Рядки символів, які відображаються в компоненті Memo1, зберігаються у його властивості Lines.
2. Для властивостей компоненти Memo1 встановіть такі значення: ReadOnly — True (тексти у Memo1 можна буде лише переглядати), ScrollBars — ssBoth (поле Memo1 буде містити обидві смуги прокрутки: горизонтальну та вертикальну). Вилучіть значення із поля Lines компонента Memo1. Заповніть поля Caption для компонент Button1 і Form1 так, щоб форма мала наступний вигляд:
3. Запрограмуємо подію OnClick для Button1. При натискуванні на кнопку з написом ‘Load File’ має відкриватися стандартне вікно діалогу ‘Открытие файла’, в якому потрібно буде вибрати папку та ім’я файлу. Ім’я вибраного файлу зберігається у властивості FileName компоненти OpenDialog1. Оформіть метод Button1Click таким чином:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (OpenDialog1->Execute() && FileExists(OpenDialog1->FileName))
{
s=OpenDialog1->FileName;
Form1->Caption=s;
Memo1->Lines->LoadFromFile(s);
}
}
Функція FileExists перевіряє, чи файл з іменем OpenDialog1->FileName існує.
Для запам’ятовування імені відкритого файлу в розділі private класу TForm1опишіть рядок символів s:
class TForm1 : public TForm
{
__published: // IDE-managed Components
TMemo *Memo1;
TButton *Button1;
TBitBtn *BitBtn1;
TOpenDialog *OpenDialog1;
void __fastcall Button1Click(TObject *Sender);
private:
// User declarations
AnsiString s;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
Оператор
Form1->Caption=s;
дозволяє відобразити адресу файлу у заголовку форми.
Метод LoadFromFile властивості Memo1.Lines читає із файлу з адресою s рядки символів та записує їх у властивість Memo1.Lines (значенням цієї властивості є масив рядків символів). Записані рядки автоматично відображаються у компоненті Memo1 під час виконання програми.
4. Виконайте прогонку програми. Для перегляду виберіть один із текстових файлів попередніх програмних проектів.
5. Під час виконання програми у вікні діалогу ‘Открытие файла’ будуть відображатися всі типи файлів. Для того, щоб можна було бачити лише файли окремих типів налаштуємо властивість Filter компоненти OpenDialog1. Відкриємо вікно Filter Editor для заповнення властивості Filter і відзначимо в ньому (для прикладу) наступні типи файлів:
Вказані типи файлів будуть відображатися в списку ‘Тип файлов’ у вікні діалогу з назвою ‘Открытие файла’ під час виконання програми.
Для того, щоб у вікні діалогу ‘Открытие файла’ зразу ж відкривалася потрібна папка вкажіть її адресу (наприклад, D:\students) у властивості InitialDir компоненти OpenDialog1.
6. Виконайте прогонку програми та проекспериментуйте із різними типами файлів. Для перегляду всіх рядків вибраного файлу скористайтеся смугою прокрутки.
7. Передбачимо пропорційну зміну розмірів компонент форми при зміні розмірів самої форми під час виконання програми. Для цього потрібно запрограмувати подію OnResize форми:
void __fastcall TForm1::FormResize(TObject *Sender)
{
Memo1->Height=Form1->ClientHeight;
Memo1->Width=Form1->ClientWidth-20-Button1->Width;
Button1->Left=Form1->ClientWidth-10-Button1->Width;
Button1->Top=Form1->ClientHeight-4*Button1->Height;
BitBtn1->Left=Form1->ClientWidth-10-Button1->Width;
BitBtn1->Top=Form1->ClientHeight-2*Button1->Height;
}
8. У властивостях Form1->ClientHeight та Form1->ClientWidth зберігається висота та ширина клієнтської (тобто внутрішньої робочої області форми). Властивості Height і Width завжди зберігають висоту та ширину візуальних компонент, властивості Left і Top — координати верхнього лівого кута відносно клієнтської області форми. Домовимося, що всі кнопки, які будемо розташовувати справа від поля Memo1 матимуть висоту в 25 точок (властивість Height), віддаль по горизонталі між Memo1 і кнопками та кнопками і рамкою форми складатиме 10 точок, а віддаль по горизонталі між кнопками дорівнюватиме висоті однієї кнопки.
З точки зору цих домовленостей проаналізуйте зміст операторів присвоєння в методі
TForm1->FormResize. В процедурі TForm1->FormResize передбачено, що поле Memo1 займе по висоті всю клієнтську область, а справа від неї залишиться вертикальна смуга, ширина якої дорівнюватиме ширині однієї кнопки плюс по 10 точок зліва і справа від кнопок. Вважаємо, що всі кнопки матимуть завжди однакову фіксовану ширину, вибрану вами під час перенесення компонент на форму.
9. Виконайте програму та дослідіть автоматичну зміну розмірів поля Memo1 під час зміни розмірів вікна програми.
1-е завдання, 2-й варіант
1. Командами File/Save as та File/Save Project as запишіть файли Unit1.cpp та Project1.bpr у папку для ІІ-го варіанта програми. Разом з ними будуть записані і інші файли, які мають відношення до програмного проекту.
2. Для того, щоб відкритий у полі Memo1 файл можна було редагувати змінимо його властивість ReadOnly поля Memo1 на False. Для збереження відредагованих файлів у праву частину форми помістимо компоненти SaveDialog (сторінка Dialogs) та Button2. У властивості Caption кнопки Button2 вкажемо значення ‘Save File’.
3. Змінимо метод TForm1->.FormResize так, щоб можна правильно розташовувати всі три кнопки справа від поля Memo1 в одну колонку при довільних змінах розмірів форми:
void __fastcall TForm1::FormResize(TObject *Sender)
{
Memo1->Height=Form1->ClientHeight;
Memo1->Width=Form1->ClientWidth-20-Button1->Width;
Button1->Left=Form1->ClientWidth-10-Button1->Width;
Button1->Top=Form1->ClientHeight-6*Button1->Height;
Button2->Left=Form1->ClientWidth-10-Button1->Width;
Button2->Top=Form1->ClientHeight-4*Button1->Height;
BitBtn1->Left=Form1->ClientWidth-10-Button1->Width;
BitBtn1->Top=Form1->ClientHeight-2*Button1->Height;
}
4. Здійсніть прогонку форми і переконайтеся в тому, що метод FormResize працює вірно.
5. Для фіксації того, що певний файл в полі Memo1 є відкритим, опишемо в розділі private класу TForm поле FileIsOpen логічного типу:
private:
// User declarations
AnsiString s;
Boolean FileIsOpen;
6. Опишіть у файлі Unit1.cpp константу ProgramName, яка буде містити ім’я програми:
const char *ProgramName="My Viewer and Editor";
7. Для форми Form1 опишемо метод Form1Create для опрацювання події OnCreate (яка спрацьовує зразу ж після запуску програми і служить для виконання початкових дій при створенні форми):
void __fastcall TForm1::FormCreate(TObject *Sender)
{
FileIsOpen=False; //Не відкрито жодного файлу
Caption=ProgramName;
}
Оператор
Caption=ProgramName;
у заголовок форми помістить назву програми.
8. Змінимо метод опрацювання події OnClick для кнопки Button1 з написом ‘Load File’ так, щоб перед завантаженням нового файлу здійснювалося перепитування про те, чи потрібно зберегти зміни у відкритому на даний момент файлі:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (FileIsOpen)
if (Application->MessageBox("×è çàïèñàòè çì³íè ó ôàéë?",
"Çðîá³òü ï³äòâåðäæåííÿ",MB_YESNO)==IDYES)
Memo1->Lines->SaveToFile(s);
if (OpenDialog1->Execute() && FileExists(OpenDialog1->FileName))
{ FileIsOpen=True;
s=OpenDialog1->FileName;
Form1->Caption=s;
Memo1->Lines->LoadFromFile(s);}
else
FileIsOpen=False;
}
В цій процедурі ми перевіряємо чи є відкритим певний файл і, якщо це так, звертаємося до методу Application.MessageBox, який виводить таке діалогове вікно:
У методі Application->MessageBox через перший параметр передається запитання, через другий — назва вікна, а третій параметр за допомогою стандартних констант фіксує окремі елементи вікна та прийоми роботи з ним. Так, константа MB_YESNO означає, що у вікні буде дві кнопки ’Да’ і ’Нет’ з варіантами відповіді. Константа IDYES відповідає ситуації, коли буде дана позитивна відповідь на питання. Детальну інформацію про метод MessageBox можна отримати із довідкової системи (наприклад, помістити курсор імені методу або виділити його та натиснути F1).
9. Запрограмуємо подію OnClick для кнопки Button2 з написом ‘Save File’ так, щоб у випадку, коли записується відредагований існуючий на диску файл, здійснювалося перепитування про те, чи потрібно зберігати внесені зміни, а у випадку, коли записуємо заново створений файл, то буде відкриватися стандартний діалог SaveDialog1 (це нам пригодиться у третьому варіанті програми, коли будемо програмувати кнопку із написом ’New’).
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (FileExists(s))
{ if (Application->MessageBox("×è çàïèñàòè çì³íè ó ôàéë?",
"Çðîá³òü ï³äòâåðäæåííÿ",MB_YESNO)==IDYES)
Memo1->Lines->SaveToFile(s);
}
else
if (SaveDialog1->Execute())
{ s=SaveDialog1->FileName;
Form1->Caption=s;
Memo1->Lines->SaveToFile(s);
}
}
Метод SaveToFile для властивості Memo1->Lines дозволяє записати у файл з адресою s вміст компоненти Memo1.
10. Виконайте програму та проекспериментуйте із кнопками з написами ‘Load File’ та ‘Save File’. Дослідіть різні ситуації: 1) коли ви завантажуєте файл у чисте поле Memo1 та коли — у поле з відкритим файлом; 2) коли ви записуєте текст, який був набраний у чистому полі Memo1 (файл ще не має імені) та коли ви записуєте відредагований файл.
1-е завдання, 3-й варіант
1. Відкрийте програмний проект для попереднього варіанту. Командами File/Save as та File/Save Project as запишіть файли Unit1.cpp та Project1.bpr у папку для 3-го варіанту програми.
2. Добавте у форму кнопки Button3 та Button4 з написами ’Save as’ та ’New’ відповідно. Розташуйте усі кнопки в такому порядку слідування написів на них: ’New’, ‘Load File’, ‘Save File’, ’Save as’, ’Close’.
3. Внесіть зміни у метод TForm1.FormResize:
void __fastcall TForm1::FormResize(TObject *Sender)
{
Memo1->Height=Form1->ClientHeight;
Memo1->Width=Form1->ClientWidth-20-Button1->Width;
Button4->Left=Form1->ClientWidth-10-Button1->Width;
Button4->Top=Form1->ClientHeight-10*Button1->Height;
Button1->Left=Form1->ClientWidth-10-Button1->Width;
Button1->Top=Form1->ClientHeight-8*Button1->Height;
Button2->Left=Form1->ClientWidth-10-Button1->Width;
Button2->Top=Form1->ClientHeight-6*Button1->Height;
Button3->Left=Form1->ClientWidth-10-Button1->Width;
Button3->Top=Form1->ClientHeight-4*Button1->Height;
BitBtn1->Left=Form1->ClientWidth-10-Button1->Width;
BitBtn1->Top=Form1->ClientHeight-2*Button1->Height;
}
4. Виконайте прогонку програми та переконайтеся в тому, що розташування кнопок є вірним і подія OnResize опрацьовується.
5. Запрограмуємо подію OnClick для Button4 (кнопка з написом ’New’):
void __fastcall TForm1::Button4Click(TObject *Sender)
{
if (FileIsOpen)
{ if (Application->MessageBox("×è çàïèñàòè çì³íè ó ôàéë?",
"Çðîá³òü ï³äòâåðäæåííÿ",MB_YESNO)==IDYES)
Memo1->Lines->SaveToFile(s);
}
Memo1->Lines->Clear();
FileIsOpen=False;
s="";
Caption=ProgramName;
}
У цій процедурі ми перевіряємо, чи відображається у полі Memo1 на час виконання команди ’New’ певний файл. Якщо це так, то ми, аналогічно до попереднього, робимо перепитування про те, чи потрібно його зберегти.
Метод Clear для властивості Memo1->Lines вилучає рядки символів, які в ній зберігалися, і відповідно очищає робоче поле компоненти Memo1.
Оператор
Caption=ProgramName;
дозволить у заголовку форми відображати назву програми у ситуації, коли ви набираєте новий текст, який ще не був записаний на диск.
6. Запрограмуємо подію OnClick для Button3 (кнопка з написом ’Save as’):
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if (SaveDialog1->Execute())
{ s=SaveDialog1->FileName;
Form1->Caption=s;
Memo1->Lines->SaveToFile(s);
}
}
Тут відкривається стандартний діалог для запису тексту із поля Memo1 у файл на диск.
7. Виконайте та протестуйте програму. Завантажте відповідний exe-файл із середовища ОС Widows.
Домашнє завдання:
1. У стандартному діалозі SaveDialog1, який використовувався у завданні 1, залишилося не заповненим поле Тип файлів (властивість Filter компоненти SaveDialog1). Заповніть його самостійно, аналогічно до того, як це було зроблено для діалогу OpenDialog1.
2. Підправте програмні проекти 1-го завдання таким чином, щоб у заголовку форми завжди відображалася назва програми (значення константи ProgramName), а через дефіс — ім’я файлу, який опрацьовується. Під час набору нового тексту (зразу після завантаження програми чи після виконання команди ’New’) у заголовку форми має відображатися назва програми, а через дефіс — повідомлення ’New file’.
2-е завдання
1. На нову форму помістіть наступні компоненти: поле Memo1 так, щоб воно займало всю клієнтську область вікна (властивість Align повинна мати значення alClient, а властивість ScrollBars — ssBoth), діалоги OpenDialog1 та SaveDialog1, компоненту формування меню MainMenu1.
Розташування останніх трьох компонент на формі не має значення, оскільки під час виконання програми їх піктограми є невидимими.
2. Формувати меню форми зручно за допомогою відповідного конструктора. Для цього розкриємо діалогове вікно для властивості Items компоненти MainMenu1. Це буде вікно конструктора меню. У ньому потрібно мишею виділяти курсорну рамку, де має бути розташований пункт меню (опція) чи команда певного пункту (підопція), а у вікні інспектора об’єктів справа від властивості Caption вказувати назву пункту чи команди. Сформуйте структуру меню як показано нижче.
У вікні редактора коду для файлу Unit1.h сформується наступний текст:
class TForm1 : public TForm
{
__published: // IDE-managed Components
TMemo *Memo1;
TOpenDialog *OpenDialog1;
TSaveDialog *SaveDialog1;
TMainMenu *MainMenu1;
TMenuItem *File1;
TMenuItem *About1;
TMenuItem *New1;
TMenuItem *LoadFile1;
TMenuItem *SaveFile1;
TMenuItem *Saveas1;
TMenuItem *Quit1;
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
У цьому модулі для класу TForm1 будуть сформовані об’єкти класу TMenuItem, які відповідатимуть опціям і під опціям меню форми. Для того, щоб опції чи підопції виконували відповідні команди, потрібно для кожної з них запрограмувати подію OnClick. Зробіть це самостійно. Тексти аналогічних методів можна запозичити із програмного проекту для попереднього завдання.
3. Пункт меню About повинен вивести вікно з повідомленням про авторські права:
void __fastcall TForm1::About1Click(TObject *Sender)
{
ShowMessage("Copyright by Лукасевич Тарас,"
"student of TDTU, Ukraine, 2006");
}
Процедура ShowMessage виводить на екран інформаційне вікно з текстом повідомлення та кнопкою Ok.
4. Під опцію Quit можна реалізувати таким методом:
void __fastcall TForm1::Quit1Click(TObject *Sender)
{
Close();
}
5. Завершіть розробку проекту та протестуйте його.