Інтерфейс віжуал

 

ЗМІСТ

 

Вступ……………………..…………………..…………………..………………3

Особливості використання класів. Методи, події…………………..…………4

Використання утиліту Class Builder…………………..…………………..……7

Редактор меню…………………..…………………..…………………..………8

Використання діалогових вікон…………………..…………………..………12

Нестандартні діалогові  вікна…………………..…………………..……………14

Особливості друкування даних…………………..…………………..…………14

Набір Printers…………………..…………………..…………………..…………16

Висновок…………………..…………………..…………………..……………18

Список використаної літератури…………………..…………………..………19

 

 

 

 

 

 

 

 

 

 

 

Вступ

Microsoft Visual Basic 5.0 Microsoft Visual Basic 5.0 - це потужна система програмування, що дозволяє швидко і ефективно створювати додатки для Microsoft Windows 95 і Microsoft Windows NT Народження та розвиток Basic. Оригінальна мова програмування Basic був створений Джоном Кемени і Томасом Курцем в 1963 г в Дартмурском коледжі. 
 
Він швидко завоював популярність в якості мови для навчання програмуванню в університетах і школах і був адаптований для використання на персональних комп'ютерах засновником і главою компанії Microsoft Біллом Гейтсом в середині 70-х рр.. З тих пір для ПК послідовно було випущено кілька версій Basic, включаючи Microsoft Quick Basic і MS-DOS Qbasic. Хоча програмна оболонка 
 
Visual Basic виконана повністю графічної, а сама мова програмування дуже далекий від мови, що застосовується для ранніх версій інтерпретаторів Basic, простота і елегантність Basic залишилася великою мірою властивою і нових версій.

 

 

 

 

 

 

 

 

 

 

 

 

 

Особливості використання класів. Методи, події

Клас – э узагальнення поняття типу даних і задає властивості та поведінку обєктів. Кожен об’єкт належить деякому класу. Відношення між об’єктом і його класом таке саме, як і між змінною і її типом. Клас – це обєднання змінних і процедур (підпрограм іфункцій) їхнього опрацювання. Обєднання і локалізація у рамках класу як єдиного цілого даних і процедур, які опрацьовують ці дані, у програмуванні називають інкапсуляцією.

Обєкти ствоорються з класів, кажуть, що об’єкт є екземпляром класу,тобто його конкретною реалізацією. Класи налічують поля, властивості, методи і події.

- Поле(field) – це змінна, що містить значення конкретної характеристики (властивості) об’єкта. Поле-змінна може належати до будь-якого типу. Множина значень полів визначає конкретний стан об’єкта.

- Метод (method)- це код ( процедура), в якій запрограмовано певну дію, яку об’єкт має здійснювати. Клас, зазвичай, містить кілька методів.

- Властивість (property) займає проміжне положення між полем і методом. Кожній властивості відповідає поле, що мітить її значення, ідва методи, що забезпечують доступ до цього поля (читання/запис значення)

- Подія (event)- це початок або завершення будь-якої дії у програмі, яка ініціюється самою програмою або середовищем ( операційною системою). Для конкретного об’єкта можна написати код (процедуру опрацювання події), який виконуватиметься у випадку виникнення певної події.

Кожен клас має визначений набір подій, які можуть виникати при роботізобєктами класу, найчастіше при визначених діях користувача, іноді як результат дії системи. При виникненні події, зв’язаної з тим чи іншим об’єктом, система посилає об’єкту повідомлення, яке аналізується процедурою опрацювання цієї події, спеціально створеною під час конструювання об’єкта.

Події забезпечують велику гнучкість при роботі з люєктами. Методи класу виконуються однаково для усіх об’єктів класу, а на події кожен об’єкт реагує індивідуально, оскільки має власні процедури опрацювання подій.

Оголошення  класу має вигляд:

[Public  I Private I Protected IFriend IShadows I  MustInherit I  NotInheritable]_Class name

[Inherits classname]

[Implements interfacenames]

[ statements ]

End class

  • Name – назва класу(ідентифікатор);
  • Classname – назва батьківського класу;
  • Interfacenames – назва інтерфейсів;
  • Statements- оператор класу, що визначають його поля, властивості, методи і події.
  • Public , Private ,Protected ,Friend IShadows , MustInherit , NotInheritable – специфікатори доступу, що задають область видимості класу;
  • Специфікатори Private і Protected можуть застосовуватися тільки до внутрішнього класу ( тобто класу, який перебуває всередині іншого класу – зовнішнього). Область видимості класу Privateобмежена рамками зовнішнього класу; класу Protected – рамками зовнішнього класу та його дочірніх класів;  класу Friend – рамками проекту або простору назв, в якому він перебуває; Protected Friend – рамками проекту/простору назв і дочірніх класів. Специфікатор Public задає доступ без обмежень ( у нашому проекті та у будь-якому проекті, що на нього посилається).
  • Shadows- зазначає, що внутрішній клас дочірнього класу перекриває деякий внутрішній клас батьківського класу.
  • MustInherit – т модифікатор класу,що визначає віртуальний клас, який обов’язково унаслідується.
  • NotInheritable –модифікатор класу, що визначає кінцевий клас, який не може наслідуватися.

Властивості та методи класу

Вважають, що розпочати код  класу доцільно з коментаря щоописуєпризначення класу, його властивості і поведінку Після коментаря розташовують опис змінних-полів, що задають характеристики ( властивості) касу. Пр. введені полів їх, зазвичай, оголошують закритими. Такоє є загальноприйнята практика об’єктна-орієнтованого програмування. Якщо поля оголошують відкритими,то під час роботи є об’єктом до них можна отримати прямий доступ як у випадку читаггя,так і у випадку запису.У деяких випадках поля оголошують з доступом Protected, щоб можливі нащадки цього класу мали доних доступ.

Доступ дозакритих полів забезпечується спеціальними процедурами Property, що мають синтаксис:

[Default ] [Public I Private I Protected I Friend I Protected Friend ] [[ReadOnly I WriteOnly ] [Overloads I Overrides ][Overridable I NotOverriable] I MustOverride IShadows I Shared] Property name ([ByVal param_list])_

  [As type]{Implements intefacemember }

     Get

            [block_Get]

     End Get

Set (ByVal value As type)

            [block_Set]

End Set

End Property

Приклад оголошення програми:

Class MyClass1

 Private Fw As Integer

 Property W() As Integer

      Get

         Return Fw

      End Get

      Set(ByVal Value As integer)

            Fw = Value

      End Set

 End Property

End Class

 

 

Використання утиліту  Class Builder

Class Builder Utility - майстер, який значно полегшить роботу зі створення колекцій і класів. 
Він входить в стандартну поставку VB. Для того, щоб скористатися ним, виберіть меню: Add-Ins \ Add-In Manager .

У діалоговому вікні виберіть: Class Builder Utility

 

Додаткові установки: Під фреймі Load Behavior виберіть одну з необхідних опцій - Loaded / Unloaded 
(для завантаження тільки на дану сесію VB) або Load on Startup (для кожного завантаження візарду при завантаженні VB). 
Натисніть кнопку ОК. 
 
Тепер в меню Add-Ins з'явилося нове підменю - Class Builder Utility

Виберіть його. З'явиться діалогове вікно, з яким ми й будемо працювати. 
Class Builder НЕ Є покроковим майстром. Тому порядок роботи в ньому визначається самим програмістом, щоб перейти до наступного вікна.

 

Панель інструментів у даної утиліти повністю дублює меню. Ліве вікно буде демонструвати нам ієрархічну структуру наших класів (колекцій), а праве - їх складові частини (властивості, методи, події, нумеровані константи).

 

Редактор меню

Перед тим, як звернутися до Редактору Меню (Menu Editor), необхідно активізувати форму, для якої ми збираємося створювати меню. Для цього досить клацнути по будь-якій вільній частині робочого поля форми. Потім потрібно перейти в розділ Tools головного меню і виконати команду Menu Editor. Трохи швидше все це можна виконати за допомогою клавішною команди <Ctrl> + <E>. У кожному разі перед нами виникає вікно редактора меню, представлене на рис. 5.16. У цьому вікні відбувається формування заголовків розділів головного меню і команд меню різних рівнів з притаманними їм атрибутами - виділеними (підкресленими) літерами, клавішними еквівалентами команд (Shortcut), наявністю відмітки (Checked), ознаками доступності (Enabled) і видимості (Visible).

Вікно Редактора Меню складається  з двох половинок. У верхній його частині знаходиться кілька полів  введення, логічних і командних кнопок, а нижня частина призначена для  відображення формованих елементів  меню та рівнів їх вкладеності. Домовимося називати цю частину вікна полем меню. 

Кожен рядок поля меню призначена для зберігання одного елемента меню - або заголовка (кореня меню), або  команди того або іншого рівня. Ім'я  заголовка завжди розташовується з 1-й позиції. Якщо в якійсь його позиції  знаходиться символ «&», то наступна за ним буква вважається гарячою. У створеному меню вона буде підкреслена, і комбінація цієї букви з керуючою клавішею <Alt> еквівалентна клацання по відповідному елементу меню. 
 
Командам з меню першого рівня в рядку поля меню передують чотири точки. Такий зсув створюється, якщо в процесі формування чергового елемента меню ми натиснули на кнопку з жирною правою стрілкою. Для наступного елемента того ж рівня автоматично зберігається зрушення від попередньої команди. Повторне натискання на кнопку з правою стрілкою викличе додатковий зсув ще на чотири позиції, що буде відповідати командам меню другого рівня і т.д. Будь-яке переміщення по рівнях вкладеності організовується за допомогою кнопок з горизонтальними стрілками. Якщо ім'я команди складається з єдиного знака «мінус», то в меню їй відповідає розділова лінія. Таким способом намагаються відокремити групу команд, що мають спільне функціональне призначення. 
 
Кнопки з вертикальними стрілками забезпечують вертикальні переміщення поточної (виділеної синім кольором) рядки по полю меню. Такі ж переміщення можна організувати за допомогою миші - клацніть по будь-рядку, і вона стане поточною. Це може знадобитися для модернізації раніше набраної інформації, відображеної в поточному рядку. Ви можете відредагувати поточний елемент меню або всі пов'язані з ним характеристики, видалити елемент або вставити перед ним новий. Дві останні операції виконуються за допомогою кнопок <Delete> і <Insert>, не мають нічого спільного з аналогічними клавішами на клавіатурі. 
 
Кнопку <Next> або клавішу <Enter> натискають після того, як завершено набір всіх характеристик чергового елемента меню. Після введення описів всіх елементів меню натискають кнопку <OK>, що призведе до завершення роботи Редактора Меню і приєднання побудованої нами схеми до активній формі. Не забувайте, що таким чином створюється тільки оболонка меню. Всі зовнішні атрибути меню на формі з'являться (рис. 5.17), кожне спадаюче меню після клацання по заголовку розділу буде відкриватися, але ніяких дій у відповідь на клацання по командам меню на стадії виконання не буде, тому що ми ще не передбачили набір відповідних подієвих процедур.

 

Для прикладу зробимо меню, яке (повинно ж меню щось робити), змінює властивості графічного об'єкта Shape, оскільки ми наплювали на нього в минулому розділі. Тому, натиснемо кнопку OK, чому наше вікно редактора меню закриється, покладемо на форму Form1 об'єкт Shape1.

Пишемо процедури, які включимо зміни властивостей об'єкта Shape (ну там заливку, і вид). Властивостей об'єкта Shape насправді більше, але ми використовуємо деякі з них:

Private Sub mmuHorizont_Click() 
Shape1.FillStyle = 2 
End Sub

Private Sub mnuKrugli_Click() 
Shape1.Shape = 3 
End Sub

Private Sub mnuKvadrat_Click() 
Shape1.Shape = 1 
End Sub

Private Sub mnuOval_Click() 
Shape1.Shape = 2 
End Sub

Private Sub mnuPramRound_Click() 
Shape1.Shape = 4 
End Sub

Private Sub mnuProstoi_Click() 
Shape1.Shape = 0 
End Sub

Private Sub mnuProzrachno_Click() 
Shape1.FillStyle = 1 
End Sub

Private Sub mnuVertical_Click() 
Shape1.FillStyle = 3 
End Sub

Private Sub mnuZalit_Click() 
Shape1.FillStyle = 0 
End Sub

Метод PopupMenu.

За допомогою цього  методу ми можемо створювати спливаючі  меню в будь-якому місці нашої  форми (одночасно відображатися  може тільки одне). 
Синтаксис його такий 
 
об'ект.PopupMenu ім’я меню, прапор, позіціяX, позіціяY, виделеннаястрока 
 
Об'єкт - необов'язковий параметр, якщо пропущено, то приймається форма, на якій фокус 
Імяменю - ім'я всплявающего меню. Обов'язковий параметр. 
Прапор - константа або значення, яке вказує розташування і поведінка меню. Список констант наведено в таблиці нижче. При використанні двох констант (по одній з кожної групи) необхідно між ними ставити логічний оператор Or. 
ПозіціяX, позіціяY - координати X і Y, які вказують, де відобразитися вікно. Якщо вони опущені, то приймаються координати миші. 
Виделеннаястрока - назва елемента спливаючого меню, що відобразиться жирним шрифтом.

Тепер, спираючись на метод  PopupMenu зробити контекстне меню дуже просто. Створимо процедуру, яка спрацьовує на клацання миші по формі Form_Click і вставимо в неї наш новий метод:

 

Private Sub Form_Click() 
Form1.PopupMenu mnuPaint, , , , mnuZalit 
End Sub

Використання  діалогових вікон

У проектах Visual Basic часто зустрічаються два різновиди діалогових вікон: вікно повідомлень і вікно введення. Вікно повідомлення (MsgBox) виводить найпростіше повідомлення для користувача, а вікно введення (InputBox), використовується служить для введення інформації.

Вікно повідомлення. Оператор для створення вікна повідомлення виглядає так (у скороченому варіанті):

MsgBox (повідомлення, атрибути, заголовок),

де повідомлення – текст, що відображається у діалоговому вікні; заголовок – рядок у заголовку вікна; параметр атрибути визначає особливості вікна – а саме різні кнопки і значки, які відображаються в ньому. Нижче перераховані значення цього параметра і константи, що використовуються для визначення вікна повідомлення.

Константа

Значення

Стиль

vbOKOnly

0

Відображається тільки кнопка ОК

vbOKCancel

1

Відображається кнопки ОК і Cancel

vbAbortRetryIgnore

2

 Відображається кнопки Abort, Retry  і Ignore

vbYesNoCancel

3

Відображається  кнопки Yes, No і Cancel

vbYesNo    

4

Відображається  кнопки Yes і No

vbRetryCancel 

5

Відображається  кнопки Retry і Cancel

vbCritical     

16

  Відображається значок критичного  повідомлення

vbQuestion      

32

  Відображається знак питання(попередження)

vbExclamation

48

  Відображається  знак оклику (попе-редження)

vblnformation  

64

 Відображається значок інформаційного

повідомлення


Значення констант можна складати, щоб досягти бажаного результату. Наприклад, щоб у вікні повідомлення були присутні кнопки ОК і Cancel, а також значок інформаційного повідомлення слід скористатися будь-яким з приведених варіантів:

DlgDef = vbOKCancel

DlgDef = 1 + 64

Потім значення змінної DlgDef використовується при виклику MsgBox.

Синтаксис функції MsgBox практично співпадає з синтаксисом однойменного оператора:

Dim rс As Integer  

rc= MsgВох(повідомлення, атрибути, заголовок)

Вікно введення, як і вікно повідомлення, може викликатися оператором або функцією. Скорочений синтаксис функції виглядає так:

Dim  rс  As String

rc = InputВох(повідомлення, заголовок, за замовчуванням)

Цього разу параметр атрибути відсутній, проте з’являється додатковий параметр за замовчуванням. В ньому можна задати рядок, який за замовчуванням знаходитиметься в текстовому полі. Коли користувач натискає кнопку ОК, вміст цього поля привласнюється змінній (у нашому випадку rс). Якщо користувач натиснув кнопку Cancel, повертається рядок нульової довжини. Зверніть увагу — функція InputBox повертає рядок, а функція MsgBox — значення цілого типу.

Наступний приклад показує, як користуватися функцією InputBox:

Private Sub Command1_Click()

Dim rс As String                                               

rс = InputBox("Введіть ім’я:")

MsgBox "Привіт, " & rс & "!"

End Sub

Запустити програму командою Run - Start. Натиснути кнопку, щоб викликати діалогове вікно InputBox. Ввести в текстовому полі своє ім’я і натиснути кнопку ОК. Цей маленький приклад у загальних рисах показує, як працюють діалогові вікна MsgBox і InputBox. Якщо все зроблено правильно, у вікні введення вам буде запропоновано ввести ім’я, після чого Visual Basic видає вікно повідомлення з рядком типа «Привіт, Стів!» (зрозуміло, у вашому випадку буде виведене ім’я, задане у вікно введення).

Нестандартні діалогові вікна

Іноді з’ясовується, що можливостей  діалогових вікон MsgBox і InputBox не вистачає, і тоді вам доводиться конструювати власні діалогові вікна. У своїх проектах прагніть використовувати одні і ті ж діалогові вікна, щоб всі додатки виглядали однаково.

Оболонкою називається функція, в якій викликаються інші функції і процедури. Оболонки спрощують програму і дозволяють створювати модулі, призначені для багаторазового використовування. Основна перевага оболонки полягає у тому, що ви можете всього один раз написати програмний код, а користуватися ним знову і знову.

 

Особливості друкування даних

Visual Basic використовує принтер, встановлений за замовчуванням в операційній системі. Він допомагає легко встановити його дозвіл, властивості шрифтів і т.п. 
    Спершу розглянемо команду PrintForm, що виводить на принтер графічний образ вікна форми. Якщо в додатку використовується кілька форм, то необхідно вказати необхідну ім'я як параметра: 
ІмяФорми.PrintForm 
 
    Оскільки дана команда виконує побітовий перенесення форми разом із заголовком і рамкою на принтер, вона не володіє достатньою гнучкістю. Більш того, більшість принтерів мають більшу роздільну здатність, ніж екран комп'ютера. 
    Більшість команд принтера в Visual Basic залежать від орієнтації сторінки. Це означає, що Visual Basic перераховує всі виведені символи (фактично точки) перед передачею інформації на принтер. Це дозволяє повністю управляти зовнішнім виглядом друкованої сторінки. 
    Звичайний спосіб для передачі інформації на принтер полягає у використанні методу Print, пов'язаного з об'єктом Printer. Наприклад, оскільки метод Print враховує орієнтацію сторінки, можна використовувати властивості CurrentX і CurrentY для точного позиціонування тексту і навіть точок на сторінці. 
Синтаксис команди для виведення тексту на друк дуже простий: 
 
Printer.Print текст 
 
    У даному контексті можна використовувати символи ";" і "," таким же чином, як у формах. Крапка з комою пригнічує автоматичний перехід на наступний рядок, а кома здійснює перехід до нової друкованої зоні (ті ж 14 колонок). Функції Tab і Spc працюють аналогічним чином. 
Управляти властивостями шрифту теж можна звичайним чином. Наприклад: 
 
Printer.Font.Name = "Script" 'Використовується індексний шрифт розміром 18 пунктів 
Printer.Font.Size = 18 
 
Корисні властивості і методи для об'єкта Printer 
 
     Якщо вивчити контекстну довідку, то можна переконатися в наявності в об'єкта Printer 40 властивостей і 12 методів. Більшість з них ще незнайомі читачеві, наприклад, DrawMode. Проте їх знання є дуже важливим у плані роботи не тільки з принтером, але і з формами. Нижче слід короткий опис деяких найбільш часто використовуваних властивостей і методів об'єкта Printer. (Див. електронну документацію по тим властивостям і методам, які не описані тут, а також документацію по символьним константам, що позначає різні установки принтерів.) 
 
ColorMode. Дозволяє визначити тип принтера - кольоровий він або монохромний.

Copies. Встановлює кількість друкуються копії. 
 
Height, Width. Повертають горизонтальний і вертикальний розміри паперу в принтері, встановленому в Windows. Вони вимірюються в твіпсах, якщо тільки не встановлена ​​інша одиниця виміру. Дані значення не можна змінити в період роботи програми; вони призначені тільки для читання. Вони використовуються, наприклад, для перевірки того, переключився користувач на інший розмір паперу, якщо виводиться інформація не вміщується на стандартному аркуші 8,5 х11 дюймів. (Для такої сторінки Visual Basic видає значення ширини 12288 твіпсов і висоти - 15 744 твіпсов.) 
 
EndDoc. Цей метод повідомляє Windows про закінчення роботи з документом. Його синтаксис наступний: 
 
Printer.EndDoc 
 
Цей рядок звільняє пам'ять від останніх сторінок тексту і посилає їх в Диспетчер Печатки Windows на друк. 
 
NewPage. Даний метод завершує поточну сторінку і посилає принтеру команду переходу на наступну сторінку. синтаксис: 
 
Printer.NewPage 
 
Page. Це властивість зберігає кількість надрукованих сторінок поточного документа. Лічильник починається з 1 і закінчується після виконання операції EndDoc. Він збільшується на 1 всякий раз при використанні методу NewPage, а також у випадках, коли виводиться інформація не вміщується на одну сторінку. зазвичай його 
використовують при виведенні верхнього колонтитула. 
 
PrintQuality. Використовується для установки якості друку, якщо це підтримує драйвер принтера. синтаксис: 
 
Printer. PrintQuality = значення де можна використовувати четьгое встпоенние константи.

 

Набір Printers

 
     За визначенням об'єкт Printer являє собою поточний принтер Windows. Набір Printers, з іншого боку, дозволяє отримати доступ до всіх встановленим драйверам принтерів в системі (наприклад, це може бути і драйвер факсу). Число встановлених принтерів можна отримати так: 
 
Printers.Count 
 
Доступ до елемента набору здійснюється наступним чином: 
 
Printers {індекс}, 
 
де індекс означає число від 0 до Printers.Count - 1.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Висновок

Інтерфейси визначають властивості, методи і події, які класи можуть реалізовувати. Інтерфейси дозволяють визначити зовнішні подання у  вигляді невеликих груп тісно  пов'язаних властивостей, методів і  подій; при цьому зменшується  кількість проблем сумісності, оскільки. можна створювати вдосконалені реалізації інтерфейсів без втручання в  існуючий код. Нові зовнішні подання  додаються в будь-який момент часу за допомогою розробки додаткових інтерфейсів  і реалізацій. 
 
Є ще кілька інших причин, за якими використання інтерфейсів краще використання успадкування класу. 
 
   - Інтерфейси більш зручні в тих випадках, коли додаткам потрібна велика кількість можливо незв'язаних типів об'єктів для надання певних функціональних можливостей. 
 
   - Інтерфейси гнучкіші в порівнянні з базовими класами через можливість визначення однієї реалізації, здатної реалізувати декілька інтерфейсів. 
 
  -  Інтерфейси переважно у випадках, коли немає необхідності у спадкуванні реалізації з базових класів. 
 
   - Інтерфейси корисні у випадках, коли неможливо використовувати успадкування класу. Наприклад, структури не здатні наслідувати у класів, але здатні реалізувати інтерфейси.

 

 

 

 

 

 

 

 

 

 

Список використаної літератури

1.Бухвалов А.В. и др. Финансовые вычисления для профессионалов.- СПб.:

БХВ-Петербург, 2001.-320с. ил.

 

2Гарнаев А.Ю. Excel, VBA, Internet в экономике и финансах.- СПб.:

БХВ-Петербург, 2001.- 816с.:ил.

 

3.Евдокимов В.В. и др. Экономическая информатика. Учебник  для вузов. Под

ред. Д.э.н., проф. В.В.Евдокимова. – СПб.: Питер, 1997. – 592с.

 

4Згуровський М.З., Коваленко  І.І., Міхайленко В.М. Вступ до комп’ютерних

інформаційних технологій: Навч.посіб. – К.: Вид-во Європ. ун-ту

(фінанси, інформ. системи, менеджм. і бізнес), 2000.- 265 с.

 

5.Информатика. Базовый  курс/ Симонович С.В. и др.- СПб.: Питер, 2000.-

640с.:ил.

 

6.Карлберг, Конрад. Бизнес-анализ  с помощью Excel.: Пер с англ.- К.:

Диалектика, 1997.- 448с.: ил.

 

7.Лук‘янова В.В. Комп‘ютерний аналіз даних: Посібник. – К.: Видавничий

центр „Академія”, 2003. – 344с. (Альма-матер)

Р. Дженнингс. Руководство  разработчика баз данных на Visual Basic. –

Москва: «Вильямс», 1999.

 

8.М. Райтингер, Г. Муч. Visual Basic 6: Полное руководство. – К.: «Ирина»,

2000.

 

9.Б. Сайлер, Дж. Споттс. Использование Visual Basic 6: Специальное

издание. – Москва: «Вильямс», 1999.

 


Інтерфейс віжуал