Печатать книгуПечатать книгу

§ 20. Стварэнне дадаткаў

Сайт: Профильное обучение
Курс: Інфарматыка. 11 клас (Павышаны ўзровень)
Книга: § 20. Стварэнне дадаткаў
Напечатано:: Гость
Дата: Четверг, 2 Май 2024, 06:00

20.1. Распрацоўка аконных дадаткаў

Стварэнне любога аконнага дадатку ажыццяўляецца, як правіла, у тры этапы:

  1. Стварэнне інтэрфейса дадатку, г. зн. сродкаў узаемадзеяння карыстальніка з праграмай.
  2. Распрацоўка сцэнарыя работы будучага дадатку. На гэтым этапе вызначаюць, якая інфармацыя будзе выводзіцца на экран, якія падзеі будуць адбывацца пры выкарыстанні розных кампанентаў, як дадатак павінен завяршыць работу, якія вынікі і ў якім выглядзе захаваць і г. д.
  3. Распрацоўка алгарытму рашэння пастаўленай задачы.

Большасць дадаткаў у аперацыйнай сістэме Windows выглядаюць і паводзяць сябе падобным чынам. Кампанія Microsoft прапанавала рэкамендацыі для распрацоўкі праграмнага забеспячэння, накіраваныя на тое, каб карыстальнік не марнаваў час на засваенне нюансаў карыстальніцкага інтэрфейса новай праграмы, а адразу пачаў прадуктыўна яе выкарыстоўваць. Гэтыя рэкамендацыі заснаваныя на псіхафізіялагічных асаблівасцях чалавека і істотна палегчаць жыццё будучым карыстальнікам вашай праграмы.

Прывядзём некаторыя рэкамендацыі па распрацоўцы графічнага інтэрфейса аконных дадаткаў (прыклад 20.1)

Прыклад 20.1. Рэкамендацыі па стварэнні аконных дадаткаў.

  1. У дадатку рэкамендуецца размясціць галоўнае меню і інструментальную панэль хуткіх кнопак, дублiруючых асноўныя раздзелы меню.
  2. Пажадана, каб аб'екты дадатку валодалі кантэкстнымі меню, якія з'яўляюцца пры націску правай клавішай мышы па аб'екце.
  3. Для аб'ектаў рэкамендуецца прапісаць падказкі, якія усплываюць пры навядзенні паказальніка мышы на аб'ект.
  4. Рэкамендуецца рэалізаваць радок стану, які выкарыстоўваецца для выдавання рознай інфармацыі.
  5. Пры націску клавішы F1 павінен загружацца файл даведкі.
  6. У праграме пажадана рэалізаваць магчымасць налады і захавання налад, каб пры наступным сеансе працы іх не прыйшлося ўстанаўліваць нанова.
  7. Калі вынік працы дадатку залежыць ад якіх-небудзь параметраў, абавязкова пакажыце значэнні па змоўчанні. Яны дазволяць паскорыць узаемадзеянне карыстальніка з праграмай, а таксама з'яўляюцца прыкладам таго, у якім фармаце даныя варта ўводзіць.
Магутным уздзеяннем на псіхіку чалавека з'яўляецца колер, таму з ім трэба абыходзіцца вельмі асцярожна. Трэба імкнуцца выкарыстоўваць абмежаваны набор колераў і надаваць увагу іх правільнаму спалучэнню. Успрыманне колеру ў чалавека вельмі індывідуальна, таму не варта навязваць усім сваё бачанне колеру. Пажадана, каб асноўны колер формы быў нейтральным (напрыклад, у большасці дадаткаў Microsoft гэта светла-шэры колер).

20.2. Стварэнне меню

Практычна любы дадатак павінен мець меню, якое дае зручны доступ да функцый праграмы. Існуе некалькі тыпаў меню:

  • галоўнае меню з выпадальнымі спісамі раздзелаў;
  • каскадныя меню, у якіх раздзелу першаснага меню ставіцца ў адпаведнасць спіс падраздзелаў;
  • кантэкстныя меню, якія з'яўляюцца пры націску правай клавішай мышы па аб'екце.

 У Delphi меню ствараюцца кампанентамі MainMenu алоўнае меню) і PopupMenu  (кантэкстнае меню), размешчанымі на панэлі Standard. На форме кампаненты можна размяшчаць у любым месцы, падчас выканання праграмы самі кампаненты нябачныя (прыклад 20.2).  На этапе выканання праграмы галоўнае меню будзе змешчана на сваё стандартнае месца  наверсе формы, кантэкстнае меню з'явіцца толькі пасля націску правай кнопкі мышы па тым кампаненце, да якога яно адносіцца.

Для дадання новых пунктаў меню трэба зрабіць двайную пстрычку па MainMenu1 або націснуць на кнопку    каля ўласцівасці Items у акне інспектара аб'ектаў. Адкрыецца акно рэдактара меню (прыклад 20.3). Кожны пункт меню з'яўляецца асобным аб'ектам. Назвы пунктаў меню прапісваюцца ва ўласцівасці Caption у акне інспектара аб'ектаў. Стварэннем пунктаў меню можна кіраваць з кантэкстнага меню (прыклад 20.4). Пункт Create Submenu дазваляе ствараць каскадныя меню. Структуру меню можна ўбачыць у акне Structure (прыклад 20.5).

Для кожнага пункта меню асноўнай падзеяй з'яўляецца OnClick.

Стварэнне кантэкстных меню аналагічна стварэнню галоўнага меню. Пункты меню дадаюцца ў акне рэдактара меню. Для таго каб пры пстрычцы правай кнопкай мышы на некаторым кампаненце з'яўлялася кантэкстнае меню, трэба напісаць імя кантэкстнага меню ва ўласцівасці PopupMenu для вылучанага кампанента (прыклад 20.6)

Прыклад 20.2. Меню на форме:

Прыклад 20.3. Рэдактар меню:

Калі ў якасці значэння ўласцівасці Caption увесці «–», то замест пункта меню з'явіцца раздзяляльнік.

Прыклад 20.4. Кантэкстнае меню рэдактара:

Прыклад 20.5. Структура меню:

Прыклад 20.6. Кантэкстнае меню для кампанента Button1:

Напісанне апрацоўшчыкаў для меню і дыялогаў будзе разгледжана ў наступных пунктах.

20.3. Стварэнне дадатку «Блакнот»

Размясціць на форме (прыклад 20.7) наступныя кампаненты:

  • рабочая вобласць для тэксту — Memo1;
  • дыялогі работы з файламі  — OpenDialog1, SaveDialog1;
  • дыялогі для налады знешняга выгляду дадатку — FontDialog1, ColorDialog1;
  • галоўнае меню — MainMenu.

Кампанент Мемо прызначаны для набору і рэдагавання тэксту. Для таго каб кампанент займаў усю кліенцкую частку формы, неабходна ўстанавіць ва ўласцівасці Align значэнне asClient (прыклад 20.8)Дадаць вертыкальную паласу пракруткі, выбраўшы значэнне ssVertical для ўласцівасці ScrollBars.

Для таго каб ачысціць рабочую вобласць кампанента, неабходна выклікаць рэдактар радкоў (String List Editor) і выдаліць тэкст Memo1. Рэдактар радкоў выклікаецца націскам кнопкі  ва ўласцівасці кампанента Lines (прыклад 20.9).

Структура меню прадстаўлена ў прыкладзе 20.10. Для напісання апрацоўшчыкаў пунктаў меню трэба ў інспектары аб'ектаў выбраць адпаведны пункт меню, перайсці на ўкладку Events і выбраць падзею OnClick. Паколькі падзея OnClick з'яўляецца падзеяй па змоўчанні, то двайны клік па пункце ў рэдактары меню або па адпаведным радку ў раздзеле Structure створыць працэдуру апрацоўшчык.

Апрацоўшчыкі падзей для кожнага з пунктаў меню прадстаўлены ў прыкладзе 20.11.

Для захавання і загрузкі файлаў апішам глабальную пераменную FileName:

String FileName;

Апрацоўшчык пункта меню «Новый» (N3) ачышчае радкі кампанента Memo ад уведзенага раней тэксту.

Апрацоўшчыкі пунктаў меню «Открыть» (N4) і «Сохранить» (N5) працуюць з файлам. Імя файла дадаецца да загалоўка акна.

Апрацоўшчык пункта меню «Выход» (N7) закрывае галоўную форму праекта.

Апрацоўшчык пункта меню «Шрифт» (N8) прыпісвае шрыфту, звязанаму з кампанентам Memo, уласцівасці, выбраныя карыстальнікам.

Апрацоўшчык пункта меню «Цвет фона» (N9) устанаўлівае для Memo колер фону, абраны карыстальнікам.

Акно дадатку падчас работы паказана ў прыкладзе 20.12.

Для кампанента Memo вызначаны наступныя дзеянні: Капіраваць (Ctrl + C), Выразаць (Ctrl + X), Уставіць (Ctrl + V), Адмяніць (Ctrl + Z).

Прыклад 20.7. Форма на этапе канструявання:

Прыклад 20.8. Налада кліенцкай вобласці:

Прыклад 20.9. Рэдактар радкоў:

Прыклад 20.10. Структура меню:

Прыклад 20.11. Апрацоўшчыкі падзей:

void __fastcall TForm1::FormCreate
              (TObject *Sender) {

  OpenDialog1->InitialDir =

    ExtractFilePath(ParamStr(0));

  SaveDialog1->InitialDir = 

    OpenDialog1->InitialDir;

}

 

void __fastcall TForm1::N3Click
(TObject *Sender) {

  Memo1->Lines->Clear();

}

 

void __fastcall TForm1::N4Click
(TObject *Sender) {

  if (OpenDialog1->Execute()) {

    FileName = OpenDialog1->FileName;

    Memo1->Lines->LoadFromFile(FileName);

    Form1->Caption = "Блокнот " + FileName;

  }

}

 

void __fastcall TForm1::N5Click
(TObject *Sender) {

  if (SaveDialog1->Execute()) {

    FileName = SaveDialog1->FileName;

    Memo1->Lines->SaveToFile(FileName);

    Form1->Caption = "Блокнот " + FileName;

  }

}

 

void __fastcall TForm1::N7Click
(TObject *Sender)

{

   Form1->Close();

}

 

void __fastcall TForm1::N8Click

(TObject *Sender) {

  if (FontDialog1->Execute())

    Memo1->Font->Assign(FontDialog1->Font);

}

 

void __fastcall TForm1::N9Click

(TObject *Sender) {

  if (ColorDialog1->Execute())

    Memo1->Color = ColorDialog1->Color;

}

 Прыклад 20.12. Дадатак у час працы:

20.4. Стварэнне дадатку «Графічны рэдактар»

Праграма павінна даваць магчымасць адкрыць і захаваць файл, выбраць колер лініі і колер фону, устанавіць таўшчыню лініі. Маляванне выконваецца вылучаным колерам лініі пры націснутай левай клавішы мышы. Пры націску правай клавішы мышы адбываецца перафарбоўка колерам фону абмежаванай вобласці.

Спачатку спраектуем форму, размясціўшы на ёй наступныя кампаненты (прыклад 20.13):

  • вобласць для малявання — Image1;
  • палітру асноўных 16 колераў — ColorGrid1 (панэль кампанентаў Samples);
  • кампаненты, якія адлюстроўваюць абраны колер для малявання і колер фону — Panel1, Panel2;
  • кампанент выбару колеру — ColorDialog1;
  • кампанент для выбару таўшчыні лініі — SpinEdit1 (панэль кампанентаў Samples);
  • галоўнае меню — MainMenu1 і кампаненты для работы з файламі — OpenPictureDialog1, SavePictureDialog1.

Ва ўласцівасці GridOrdening для кампанента ColorGrid1 устанавіць значэнне go8x2, якое дазволіць размясціць кампанент гарызантальна.

На этапе канструявання ўстанавіць значэнне ўласцівасці Color у кампанентаў Panel1 і Panel2 — clBlack і clWhite адпаведна.

Ва ўласцівасцях Value і MinValue для кампанента SpinEdit1 устанавіць значэнне 1.

Структура меню паказана ў прыкладзе 20.14. Апрацоўшчыкі падзей прыведзены ў прыкладзе 20.15.

Для таго каб праграма загружалася з бачнай вобласцю для малявання, трэба пры стварэнні формы выканаць які-небудзь зварот да Image1, напрыклад зафарбаваць белым колерам піксель з каардынатамі (0; 0).

Для праверкі націснутай клавішы мышы апішам апрацоўшчык падзеі OnMouseDown для кампанента Image1. Параметр Button у гэтага апрацоўшчыка можа прымаць значэнні mbLeft або mbRight у залежнасці ад націснутай левай ці правай клавішы мышы.

Для адсочвання траекторыі руху мышы па кампаненце Image1 ствараем апрацоўшчык падзеі OnMouseMove. Параметр Shift у апрацоўшчыка дазваляе вызначыць, якая з клавіш мышы была націснутая, а параметры x, y вяртаюць каардынаты пункту, у якім адбыўся націск кнопкі.

Для перамяшчэння мышы трэба выкарыстоўваць метады Canvas: LineTo(x, y) — перамяшчэнне са следам і MoveTo(x, y) — перамяшчэнне без следу.

Апрацоўшчык падзеі OnChange для кампанента ColorGrid1 дазволіць вызначыць вылучаны колер. Уласцівасці ForegroundColor і BackgroundColor у гэтага кампанента, якія адказваюць за асноўны і фонавы колеры, змяняюцца пры націску левай і правай кнопак адпаведна. Паралельна змяняецца колер панэляў.

Таўшчыня лініі вызначаецца значэннем уласцівасці Value для кампанента SpinEdit1. Апрацоўшчык падзеі — OnChange.

Апрацоўшчыкі падзей для кампанентаў OpenPictureDialog1, SavePictureDialog1 выклікаюцца з адпаведных пунктаў меню і з'яўляюцца аналагічнымі апрацоўшчыкам, апісаным для праграмы Блакнот. Для захавання і загрузкі файлаў трэба апісаць глабальную радковую пераменную FileName. Дадатак можа захоўваць і загружаць файлы фармату bmp.

З дапамогай кампанента ColorDialog1 можна выбраць колер лініі або заліўкі, адсутныя на панэлі ColorGrid1. Пункты меню Цвет дазваляюць выбраць колер лініі або заліўкі адпаведна. Пры выбары колеру на панэлі ColorGrid1 даступныя толькі 16 базавых колераў, пры выбары колеру з меню — стандартная RGB палітра.

Стварэнне малюнка і загрузка файла ў дадатак прыведзены ў прыкладзе 20.16.

Прыклад 20.13. Форма на этапе канструявання:

Прыклад 20.14. Структура меню:

Прыклад 20.15. Апрацоўшчыкі падзей:

void __fastcall TForm1::FormCreate
               (TObject *Sender)

{

  OpenPictureDialog1->InitialDir = 

    ExtractFilePath(ParamStr(0));

  SavePictureDialog1->InitialDir = 

    OpenPictureDialog1->InitialDir;

  Image1->Canvas->Pixels[0][0] = clWhite;

}

 

void __fastcall TForm1::
Image1MouseDown(TObject *Sender, 
TMouseButton Button, TShiftState Shift, 
int X, int Y)

{

  //націснута левая клавіша мышы

  if (Button == mbLeft)

  Image1->Canvas->MoveTo(X,Y);

  //націснута правая клавіша мышы

  if (Button == mbRight)

  Image1->Canvas->FloodFill

    (X, Y, Image1->Canvas->

    Pixels[X][Y],fsSurface);

}

 

void __fastcall TForm1::

Image1MouseMove(TObject *Sender, 
TShiftState Shift, int X, int Y)

{

  //перамяшчэнне з націснутай левай

  //кнопкай мышы

  if (Shift.Contains(ssLeft))

  Image1->Canvas->LineTo(X,Y);

}

 

void __fastcall TForm1::

ColorGrid1Change(TObject *Sender)

{

  //выбар асноўнага колеру

  //левай клавішай мышы

  Image1->Canvas->Pen->Color = 

    ColorGrid1->ForegroundColor;

  Panel1->Color = 

    ColorGrid1->ForegroundColor;

  //выбар фонавага колеру

  //правай клавішай мышы

  Image1->Canvas->Brush->Color = 

    ColorGrid1->BackgroundColor;

  Panel2->Color = 

    ColorGrid1->BackgroundColor;

}

 

void __fastcall TForm1::

SpinEdit1Change(TObject *Sender)

{

  Image1->Canvas->Pen->Width = 

    SpinEdit1->Value;

}

 

void __fastcall TForm1::N2Click

(TObject *Sender)

{

  Image1->Picture = NULL;

  Image1->Canvas->Pixels[0][0] = clWhite;

  SpinEdit1->Value = 1;

  Panel1->Color = clWhite;

  Panel2->Color = clBlack;

}

 

void __fastcall TForm1::N3Click

(TObject *Sender)

{

  if (OpenPictureDialog1->Execute()) {

  FileName = OpenPictureDialog1->FileName;

  Image1->Picture->LoadFromFile(FileName);

  Form1->Caption = "MyPaint " + FileName;

  }

}

 

void __fastcall TForm1::N4Click

(TObject *Sender)

{

  if (SavePictureDialog1->Execute()) {

  FileName = SavePictureDialog1->FileName;

  Image1->Picture->SaveToFile(FileName);

  Form1->Caption = "MyPaint " + FileName;

  }

}

 

void __fastcall TForm1::N6Click

(TObject *Sender)

{

  Form1->Close();

}

 

void __fastcall TForm1::N8Click

(TObject *Sender)

{

  if (ColorDialog1->Execute()) {

    Panel1->Color = ColorDialog1->Color;

    Image1->Canvas->Pen->Color = 

      ColorDialog1->Color;

  }

}

 

void __fastcall TForm1::N9Click

(TObject *Sender)

{

  if (ColorDialog1->Execute()) {

    Panel2->Color = ColorDialog1->Color;

    Image1->Canvas->Brush->Color = 

      ColorDialog1->Color;

  }

}

Прыклад 20.16. Дадатак у час працы:

20.5. Стварэнне дадатку «Калькулятар»

Стварэнне калькулятара пачнём з канструявання формы. На ёй трэба размясціць: поле Edit для ўводу/вываду лікаў, 10 кнопак з лічбамі, 4 кнопкі з арыфметычнымі дзеяннямі, кнопку «=» і кнопку «С» — ачысціць (прыклад 20.17).

Пры націску на кнопку з лічбай праграма павінна дапісаць гэтую лічбу да ліку ў поле Edit. Пры націску на кнопку з арыфметычным дзеяннем трэба запомніць лік, які ў дадзены момант знаходзіцца ў полі Edit, і ачысціць поле для уводу другога ліку. Лікі будзем захоўваць у дзвюх пераменных n1, n2 тыпу integer. Знак аперацыі будзем захоўваць у пераменнай znak тыпу char. Пераменныя апісваюцца як глабальныя. Пры націску на кнопку «=» выконваецца арыфметычнае дзеянне і выводзіцца вынік.

Для адлюстравання кнопак можна выкарыстоўваць кампанент BitBtn, тады кнопкі могуць змяшчаць малюнак на паверхні (напрыклад, малюнкі з лічбамі). Уласцівасць для размяшчэння малюнка — Glyph.

Устанавіць значэнне bsDialog для ўласцівасці BorderStyle формы. У гэтым выпадку мяжа формы не дазволіць мяняць яе памеры.

Коды функцый апрацоўшчыкаў прыведзены ў прыкладзе 20.18.

Для кожнай кнопкі на форме трэба стварыць апрацоўшчык падзеі OnClick.

Апрацоўшчыкі падзей для ўсіх лічбавых кнопак будуць ідэнтычныя.

Апрацоўшчыкі для кнопак арыфметычных дзеянняў будуць адрознівацца толькі значэннем запамінальнай аперацыі.

Асноўныя вылічэнні адбываюцца ў апрацоўшчыка кнопкі «=». Пераўтворым у лік n2 значэнне поля Edit і выконваем арыфметычную аперацыю ў залежнасці ад значэння пераменнай znak. Пасля гэтага абнуляем пераменныя.

У апрацоўшчыка кнопкі «С» (от англ. clear — ачысціць) адбываецца абнуленне пераменных і ачыстка поля Edit.

Створаны калькулятар мае вялікую колькасць абмежаванняў у сваёй працы, паколькі разлічаны на вылічэнні толькі з натуральнымі лікамі.

Прыклад 20.17. Форма на этапе канструявання:

Прыклад 20.18. Апрацоўшчыкі падзей:

//апісанне глабальных пераменных

int n1, n2;

char znak;

 

void __fastcall TForm1::

Button10Click(TObject *Sender)

{

  //прыпісванне лічбы да ліку

  Edit1->Text = Edit1->Text + '0';

}

 

void __fastcall TForm1::

Button1Click(TObject *Sender)

{

  Edit1->Text = Edit1->Text + '1';

}

Для астатніх лічбавых кнопак трэба змяніць толькі '1' на адпаведную лічбу.

void __fastcall TForm1::

Button12Click(TObject *Sender)

{

  n1 = StrToInt(Edit1->Text);

  //запамінанне знака аперацыі

  znak = '+';

  Edit1->Clear();

}

Для астатніх кнопак са знакамі арыфметычных дзеянняў трэба змяніць толькі '+' на адпаведны знак.

void __fastcall TForm1::

Button16Click(TObject *Sender)

{

  n2 = StrToInt(Edit1->Text);

  switch (znak){

  case '+': {

    Edit1->Text = IntToStr(n1 + n2);

    break;

  }

  case '-': {

    Edit1->Text = IntToStr(n1 - n2);

    break;

  }

  case '*': {

    Edit1->Text = IntToStr(n1 * n2);

    break;

  }

  case '/': {

    Edit1->Text = IntToStr(n1 / n2);

      break;

  }

  }

  n1 = 0;

  n2 = 0;

  znak = ' ';

}

 

void __fastcall TForm1::

Button11Click(TObject *Sender)

{

  Edit1->Clear();

  n1 = 0;

  n2 = 0;

  znak = ' ';

} 

 

Практыкаванні

1. Дапоўніце праект Блакнот наступнымі магчымасцямі.

  1. Пункт меню Захаваць файл замяніць двума: «Захаваць» і «Захаваць як…».
  2. Дадаць пункт меню «Пераносіць па словах».
  3. Дадайце магчымасць кіравання палосамі пракруткі: усталяваць гарызантальную, вертыкальную, абедзве.
  4. *Дадайце наступныя дыялогі: Параметры старонкі, Друк, Пошук, Замена і адпаведныя пункты ў меню.
  5. Дадайце кантэкстнае меню для кіравання кампанентам Memo. Каманды кантэкстнага меню, каманды асноўнага меню, якія дубліруюць, павінны выклікаць тыя ж апрацоўшчыкі.
  6. Прапануйце свае магчымасці.

2. Для праекта Графічны рэдактар дадайце наступныя магчымасці:

  1.  Маляваць адрэзкі, авалы і прамавугольнікі.
  2.  Выбіраць спосаб заліўкі: перафарбоўванне колеру або да контуру.
  3.  Прапануйце свае магчымасці.

3. Для праекта Калькулятар дадайце наступныя магчымасці:

  1.  Магчымасць работы з рэчавымі лікамі.
  2.  Магчымасць вылічаць значэннi функцый: здабыванне квадратнага кораня, узвядзенне ў квадрат, трыганаметрычныя функцыі (для градусаў і радыян) і інш.
  3. *Магчымасць пераводу лікаў у іншыя сістэмы злічэння.
  4.  Прапануйце свае магчымасці.

4*. Стварыце праект гульні на клеткавым полі. Магчымыя варыянты:

  1. Сапёр.
  2. Пятнашкі (Гульня 15).
  3. Парныя малюнкі.
  4. Марскі бой.
  5. Свой варыянт гульні.