From: Alex Timkov <Alex.Timkov@p6.f206.n465.z2.fidonet.org>
Date: Tue, 25 Jul 2000 09:32:15 +0400
Area: fido7.ru.clarion
Разpешите пpедставить всему клаpионовскому сообществу, "пасущемуся" не лугах
телеконфеpенции RU.CLARION (fido7.ru.clarion) пеpвый pелиз FAQ по языку Clarion
(веpсии DOS и Windows). Мысль создать FAQ давно уже появлялась у многих
подписчиков телеконфеpенции и только сейчас она воплотилась в pеальность. ;) А
как же? В Интеpнете, есть и CLAFAQ от В.Смелика и Фоpум от Розалекса. Но
возможно не каждый может часто "залазить" в Интеpнет и пpоводить достаточное
вpемя для поиска необходимого ответа. Вот именно на таких людей (и не только
;-) ) pассчитан этот FAQ. В пpинципе данный FAQ - это есть не что иное, как
текстовая (твеpдая) копия части сайта В.Смелика CLAFAQ. Вы можете сохpанить это
письмо как файл, а затем, pаспечатав его на обычном матpичном пpинтеpе ;),
повесить у себя пеpед глазами, как календаpь и иногда полистывать его. А вдpуг
найдете что-то новое... ;)))
Пока пеpвая pедакция CLAFAQ(hard) содеpжит пеpвые 40 вопpосов, упоpядоченных в
поpядке поступления вопpосов в базу на сеpвеp CLAFAQ. Поэтому возpаст этих
вопpосов составляет около 2 лет... ;) "Новые" вопpосы будут пеpиодически
добавляться. Под словом "Новые" подpазумевается, как добавление вопpосов за
пpедыдущие годы, так и вопpосы, возникающие на данный момент. сpазу хочу
оговоpиться, что это не означает, что сюда будут попадать _ВСЕ_ вопpосы,
пpиходящие в телеконфеpенцию. Будут добавляться только те вопpосы, котоpые
действительно должны быть в FAQ'е (по опpеделению)... ну или по пpосьбе
кого-либо из читателей. ;-)
Итак, смотpите...
Да, кстати, заголовок pисовался как стpаница для ФИДО, так что возможно у
подписчиков, котоpые подписаны чеpез гейт (fido7.ru.clarion), а их скоpее всего
подавляющее большинство.. ;) заголовок будет выглядеть не в очень пpиличном
виде... ;) коpоче, я подумаю, что можно будет сделать...
Рецензии, пожелания и pугательства пpинимаются в pабочие дни с 9:00 до 18:00 по
адpесам:
FIDOnet : 2:465/206.6
Internet: athome@ukrpost.nettimkoff@siberlink.com
ICQuin : 62605472
Удачи!
_+----------++---+ +----------++----------++----------++----------+_
_| +---+ || | | +--+ || +--+ || +--+ || +--+ |_
_| | | || | | | | || | +---+| | | || | | |_
_| | +---+| | | | | || | | | | || | | |_
_| | | | | | | || | | | | || | | |_
_| | | | | +--+ || +---+ | +--+ || | | |_
_| | | | | +--+ || +---+ | +--+ || | | |_
_| | +---+| | +---+| | | || | | | | || |+-- |_
_| | | || | | || | | || | | | | || |+-+ |_
_| +---+ || +--+ || | | || | | | | || +--+ |_
_+----------++----------++---+ +---++---+ +---+ +---++------+ +-+_
НЕОФИЦИАЛЬНЫЙ FAQ ПО ЯЗЫКУ TOPSPEED CLARION (DOS/WINDOWS) _| +-+_
ИСПОЛЬЗОВАНА ИНФОРМФЦИЯ С САЙТА ВЛАДИМИРА СМЕЛИКА _+---+_
РЕДАКЦИЯ 1 ОТ 24 ИЮЛЯ 2000 ГОДА
+---------------+ +-------------------+
| Alex Timkov | /COPYRIGHT (C) 2000/ | Vladimir Smelik |
+-------------+ | | +-----------------+
+-------------+ +-----------++-----------------------+ +-----------------+
|FIDOnet: 2:465/206.6 ||eMail: vovs@bigfoot.com |
|eMail : athome@ukrpost.net||Yahoo: VovShmel |
|ICQuin : 62605472 ||HTTP : www.dvgu.ru/lemoi/clafaq/faqcgi.cgi?|
+---------------------------++-------------------------------------------+
1. Как во время выполнения программы менять размеры Control элементов? (CW)
2. Как заставить выводить сообщение Tip по-русски? (CW)
3. Как ввести минус (-) в Entry поле формата @N-10.2? (CW)
4. Как сделать в окне с двума ListBox интерфейс а-ля Win95 Explorer и
чтобы можно было красиво менять размер ListBox? (CW)
5. При работе с MS SQL и Clarion 2.0 с ODBC драйвером при каждом обращении
к таблицам требуется вводить пароль (иногда несколько раз).
Как стандартными путями побороть это? (CW)
6. Есть ли драйверы ODBC для кларионовских файлов (драйвера Clarion и
TopSpeed, .dat и .tps соответственно)? (CW)
7. Как присваивать из MEMO в STRING в соответствии с переносами строк
в MEMO? Или как найти сам код переноса строки в MEMO? (CW)
8. Как избежать следующего сообщения при линковке? (CW)
Making ProgName.exe
Link error: Group, or Segclass exceed 64 k.
9. Как в ListBox Tree, построенному по QUEUE, сворачивать-разворачивать
ветви? (CW)
10. Почему в ListBox с деревом не работает скролинг по горизонтали? (CW)
11. Как читать числа из dbf? (CDD)
12. Хотелось бы знать, влияет ли на надежность, то что все таблицы (кроме
справочников) я храню в одном физическом файле? А также, влияет ли
шифрование? (CW/CDD)
13. Как заставить REPORT не ограничивать размеры бумаги, если принтер этот
формат не поддерживает? (CW)
14. Как удалить файл, зная только его имя? (CDD)
15. Где взять русифицированные темплейты для CW2003? (CW)
16. Где взять русские темплейты для C4? (CW)
17. Для чего в Clarion используется вид связи между файлами INNER-JOIN? (CW)
18. А можно ли где галочек понаставить, чтобы мне пpога одним .exe вылезала,
а не пpиходилось к ней кучку .dll пpилагать? (CW)
19. Как передать событие из одного thread в другой? (CW)
20. Как отдать квант времени другим задачам из LOOP? (CW)
21. В отчете необходимо вывести подсчеты сумм по некоторым признакам. (CW)
22. Как построить сложный фильтр данных для БД? (CW)
23. Как отследить попытку ввода в BYTE по формату @N3 числа больше 255? (CW)
24. Как синхронизировать два Browse в одном окне? (CW)
25. А можно подpобнее о виpтуальных listbox'ах? (CW)
26. Как сделать, чтобы некоторый элемент (например, прямоугольник) изменял
свой цвет в зависимости от выбранной в "Свойствах экрана" цветовой
схемы Windows? (CW)
27. Возможно ли в Menu под пункты выбора выводить символьную строку,
текст которой формируется и меняется в процесе работы? (CW)
28. Существует ли способ перевода русских символов в базах данных из
DOS в Windows? (CW/CDD)
29. Какой embed нужно использовать для установки фильтра для browse в CW4?
30. Как заставить работать программы, скомпиленные под CDD 3.0 на
Pentium II-300? (CDD)
31. Каковы ограничения для передавемых и получаемых строк в функциях
GETINI/PUTINI? (CW20)
32. Существует ли в CW, возможность управлять классами пользователя? (CW)
33. Как поместить иконку в ITEM/MENU и менять её во время выполнения
программы? (CW)
34. Возможноли получить "Стандарты Кларион" по почте? (CW)
35. Как сконвертировать БД из одно формата в другой? (CW/CDD)
36. Как конвертировать массивы в DAT файле из OEM в ANSI? (CW)
37. Что нужно сделать для того, что бы поле поиска активизировалось
при нажатии русских букв и работало? (CDD)
38. Что такое MS SQL Accelerator? А так же SQL Anywhere Accelerator? (CW)
39. Как сделать связь One-To-One от одного файла к нескольким? (CW)
40. Можно ли сделать опциональный HIDE пунктов в PopUp меню в RunTime? (CW)
41. Можно ли находясь в окне на ListBox по нажатию MouseRight вызвать
всплывающее меню? (CW)
=============================================================================
>1. Как во время выполнения программы менять размеры Control
> элементов? (CW)
(АМ) Отлавливай события EVENT:Size и/или EVENT:Sized и используй свойства
элементов {PROP:XPos}, {PROP:YPos}, {PROP:Width}, {PROP:Height}. В
CW2002 и далее данные операции поддерживаются на уровне темплейтов.
>2. Как заставить выводить сообщение Tip по-русски? (CW)
(ВС) Убить все нерусские шрифты (какие возможно). Изменить файл WIN.INI
примерно (хотя бы только Arial) следующим образом:
[FontSubstitutes]
Tms Rmn=Time Roman
Times=Time Roman
Times New Roman=TimesDL
Times New Roman,0=TimesDL,204
Times New Roman,204=TimesDL,204
Arial=Arial Cyr
Arial,0=Arial Cyr,204
System,0=System,204
Fixedsys,0=Fixedsys,204
Small Fonts,0=Small Fonts,204
MS Sans Serif,0=MS Sans Serif,204
Аналогичные действия для WinNT, только в Registry. На моей странице
есть еще рекомендации.
(АТ) В C5b появилось свойство SYSTEM{PROP:CharSet}, которое позволяет
избежать всего выше описанного.
>3. Как ввести минус (-) в Entry поле формата @N-10.2? (CW)
(БИ) Сначала набираешь цифры, затем жмешь минус. Он же работает как Enter.
>4. Как сделать в окне с двума ListBox интерфейс а-ля Win95 Explorer и
> чтобы можно было красиво менять размер ListBox? (CW)
(АМ) Вешаешь на границу Listbox'ов REGION (невидимый ). У него есть
интересные события:
EVENT:MousIn ! Мышь попала в область региона
EVENT:MouseOut ! Мышь ушла из область региона
EVENT:MouseMove ! Нажата Left button и пошло движение
EVENT:MouseDown ! Событие движения
EVENT:MouseUp ! Left Button отжата
Еще для красоты движения границы на регион накладывается LINE Control
Ну, а дальше
EVENT:MouseIn - меняем курсор на стрелочки лево & право
EVENT:MouseOut - восстанавливаем курсор
EVENT:MouseMove - UNHIDE(LINE Control)
EVENT:MouseDown - ?Line{PROP:Xpos} = MouseX()
?Region{PROP:XPos} = MOUSEX()
EVENT:MouseUp - ?Line{PROP:Hide} = TRUE
?List1{PROP:Width} = ?Region{PROP:XPos} - ?List1{PROP:XPos}
I# = ?List2{PROP:XPos}
?List2{PROP:Xpos} = ?Region{PROP:XPos} + ?Region{PROP:Width}
?List2{PROP:Width} = ?List2{PROP:Width} - I# + ?List2{PROP:XPos}
У региона должен быть арибут IMM и TRN.
>5. При работе с MS SQL и Clarion 2.0 с ODBC драйвером при каждом
> обращении к таблицам требуется вводить пароль (иногда несколько
> раз). Как стандартными путями побороть это? (CW)
(АС) Путей по меньшей мере два:
1) Использовать PROP:ConnectString - см. раздел "Undeclared Properties"
в документации.
2) Если существует открытая таблица, то данные для login'а лишний раз
не запрашиваются. Соответственно, решение в том, чтобы в начале
исполнения программы открыть на сервере какую-либо левую таблицу и
держать ее открытой до выхода из программы.
>6. Есть ли драйверы ODBC для кларионовских файлов (драйвера Clarion и
> TopSpeed, .dat и .tps соответственно)? (CW)
(БИ) Есть только для драйвера TopSpeed.
>7. Как присваивать из MEMO в STRING в соответствии с переносами строк в
> MEMO? Или как найти сам код переноса строки в MEMO? (CW)
(ВС) Перенос строки в MEMO - это код <13,10>. Отсюда делай выводы как и что
можно отловить.
>8. Как избежать следующего сообщения при линковке? (CW)
> Making ProgName.exe
> Link error: Group, or Segclass exceed 64 k.
(БИ) Clarion тут ни при чем. Для 16-битовых моделей размер сегмента не
может превосходить 64К. Код, полученный компиляцией одного исходного
модуля, попадает в один сегмент. Если пытаться всю программу с парой
сотен процедур засунуть в один исходник, то результат будет
соответствующим. Как видно из вопроса, в одном исходном модуле
находятся тексты методов нескольких классов. Поэтому, первый шаг в
решении проблемы 64К, - это разнесение методов разных классов по
разным исходным модулям. Если класс настолько развесистый, что даже
один он приводит к превышению ограничения 64К, то следует длинные
логически законченные фрагменты текста выделять в процедуры (не методы)
и определить их в других исходных модулях. Хотя с моей точки зрения,
просто не надо так писать программы.
>9. Как в ListBox Tree, построенному по QUEUE, сворачивать-разворачивать
> ветви? (CW)
(БИ) Примерная структура Queue:
Queue QUEUE,PRE(QKB)
NameOfBranch STRING(60) ! Что показываем
NormalFG LONG ! Цветовое
NormalBG LONG ! решение
SelectedFG LONG ! строк
SelectedBG LONG ! дерева
Icon SHORT ! Номера иконок
Level SHORT ! Уровень ветви
END
Изменяя знак (+/-) Queue.Indent можно сворачивать/разворачивать
ветви дерева. ListBox реагирует после выполнения ADD(Queue). Не
забывайте отслеживать "листья" дерева - при изменении знака боксики
с (+/-) могут появляться и у "листьев".
>10. Почему в ListBox с деревом не работает скролинг по горизонтали? (CW)
(НС) Чтобы заработал скроллинг надо в ListBox-formatter-е в Properties...
выбрать закладку Field, установить флажок Scroll Bar и поставить
нужный Size поля прокрутки.
>11. Как читать числа из dbf? (CDD)
(ЛМ) Пример: Number - это Numeric 4 0
Описываешь так:
NumberEMPLOYERS STRING(4),NAME(Number=N(4))
В Dictonary это прописывается в External Name.
(АТ) ИМХО достаточно описать так:
Number STRING(@n_4.0), где 0 - количество десятичных знаков.
>12. Хотелось бы знать, влияет ли на надежность, то что все таблицы
> (кроме справочников) я храню в одном физическом файле? А также,
> влияет ли шифрование? (CW/CDD)
(АС) Если грохнется, то грохнется вся база - поддержание целостности :)
Шифрование не влияет.
>13. Как заставить REPORT не ограничивать размеры бумаги, если принтер
> этот формат не поддерживает? (CW)
(БИ) Купить другой принтер... ;)
>14. Как удалить файл, зная только его имя? (CDD)
(ЮФ) Можно воспользоваться сишной процедурой:
MODULE('C Standard Library')
RemoveFile(*CSTRING),SHORT,RAW,NAME('_remove')
END
А можно и описать временный файл в EMBED'ах. Поскольку его никто
открывать не собирается, REMOVE замечательно сработает.
Например, так (в Global...)
FileName CSTRING(65),STATIC
Tmp FILE,DRIVER('DOS'),NAME(FileName) ! Или любой другой драйвер
Record RECORD
S1 STRING(1)
END
END
В коде процедуры:
CODE
FileName = имя файла
REMOVE(Tmp)
>15. Где взять русифицированные темплейты для CW2003? (CW)
(ВС) На моем FAQ-сервере находится последняя версия темплейтов от
Вадима Синявского для CW2003. Для того, чтобы их получить,
перейдите на страницу "Интересные места".
http://www.dvgu.ru/lemoi/clafaq/faqcgi.cgi?
>16. Где взять русские темплейты для C4? (CW)
(ВС) На моем FAQ-сервере имеется русифицированная версия шаблонов
для C4 класс Clarion от Вадима Синявского. Для класса ABC -
на страницах Кирилла Щербы.
http://www.dvgu.ru/lemoi/clafaq/faqcgi.cgi?
http://www.dol.ru/ (уточняется)...
>17. Для чего в Clarion используется вид связи между файлами
> INNER-JOIN? (CW)
(ШБ) Если у потомка нет записи, соответствующей родительской, то при
OUTER JOIN запись потомка появится, но будет обнуленной, а при
INNER JOIN не появится даже родительская запись.
>18. А можно ли где галочек понаставить, чтобы мне пpога одним .exe
> вылезала, а не пpиходилось к ней кучку .dll пpилагать? (CW)
(ВС) Project -> Propertis -> Run-time Library -> Local
>19. Как передать событие из одного thread в другой? (CW)
(ДА) Делаешь глобальную пеpеменную, напpимеp с именем Process.
Далее, на EVENT:OpenWindow, EVENT:GainFocus и т.п. в окне
пpописываешь Process = THREAD(). После этого, по нажатию кнопочки
в твоем Source делаешь так:
POST(400h,,Process) ! 400h - номеp твоего собственного события.
Таким обpазом, пpоизойдет событие под номеpом 400h в твоем
_конкpетном_ окне. А там уж его отлавливаешь и делаешь,
что нужно.
(АТ) Дополнительно, пользовательские события определяются, начиная с
номера 400h. В файле equates.clw определены две полезные
макроподстановки:
EVENT:User EQUATE(400h) - самое первое пользовательское событие
EVENT:Last EQUATE(0FFFh) - самое последнее событие.
>20. Как отдать квант времени другим задачам из LOOP? (CW)
(ЮФ) Используй оператор YIELD.
>21. В отчете необходимо вывести подсчеты сумм по некоторым
> признакам. (CW)
(ВС) Для решения подобной проблемы лично я делаю ряд магических
телодвижений: :)
1. Завести новую DETAIL.
2. Всем элементам Report присвоить имена для USE(?detail ets.).
3. В параметрах отчета -> DETAIL_фильтр для основной detail
создать фильтр XXX# = XXX# и поставить галочку
"Исключить нефильтруемые Detail".
4. В Embeds "После печати Detail структур" выполняем суммирование.
5. В Embeds "Перед печатью препросмотра" печатаем detail с
результатами.
>22. Как построить сложный фильтр данных для БД? (CW)
(ВС) В Embed "Validate record-Filter checking" пишешь:
IF условие не верно THEN EXIT.
И можно использовать любые переменные
(ЮФ) Я делаю несколько по другому. Пишу функцию, которая возвращает 1/0
и вставляю ее в фильтр. Функция должна возвращать STRING. Для
использования в фильтре ее нужно сначала BIND. Вернее, здесь
нужно заглянуть в HELP и посмотреть соглашения для использования
функций в BIND. В таком случае получается фильтр, который можно
использовать в различных поцедурах без переделки.
>23. Как отследить попытку ввода в BYTE по формату @N3 числа
> больше 255? (CW)
(ВС) Объявляем локальную переменную типа SHORT, к ней формат @N3 и
верхнюю границу 255. Перед записью на диск:
ПеременнаяБазы = Локальная переменная. Все должно быть ОК.
>24. Как синхронизировать два Browse в одном окне? (CW)
(ВС) Объяви одно из полей (желательно уникальное) одного броузера,
как "Сторожевое поле" ("Reset Field") для второго броузера.
>25. А можно подpобнее о виpтуальных listbox'ах? (CW)
(АС) Смотрите описание PROP:VLBproc и PROP:VLBval в Language Reference.
>26. Как сделать, чтобы некоторый элемент (например, прямоугольник)
> изменял свой цвет в зависимости от выбранной в "Свойствах экрана"
> цветовой схемы Windows? (CW)
(ВЭС) При выборе цвета надо указать не "Basic Colors", а
"Standard Colors". Например, для случая цвета фона активного
окна выбираем в DropBox "Standard Colors" элемент "Active Caption".
>27. Возможно ли в Menu под пункты выбора выводить символьную строку,
> текст которой формируется и меняется в процесе работы? (CW)
(ВЭС) Изменять текст в пунктах меню можно традиционно:
<?Item>{PROP:Text} = 'Что-то другое'
DO RefreshWindow
где Item - метка пункта меню, т.е. то, что в форматоре окна
называется "Use Variable".
>28. Существует ли способ перевода русских символов в базах данных из
> DOS в Windows? (CW)
(ВС) При описании файла под Windows необходимо поставить галочку в поле
"Use OEM Collation". База будет храниться в кодировке 866 (ДОС),
а показываться в 1251 (Windows).
>29. Какой embed нужно использовать для установки фильтра для browse
в CW4? (CW)
(КЩ) Для шаблонов Legacy - ValidateRecord ROUTINE,
для ABC - метод ApplyFilter.
>30. Как заставить работать программы, скомпиленные под CDD 3.0 на
> Pentium II-300? (CDD)
(АС) Надо либо использовать DOS Extender, либо обрубать калибровку
таймера для DELAY. Где это делается - зависит от версии CFD.
>31. Каковы ограничения для передавемых и получаемых строк в функциях
GETINI/PUTINI? (CW20)
(АС) Максимальные значения длин для элементов INI файлов,
поддерживаемые в CW, следующие:
- заголовок секции - 63 символа
- имя ключа - 63 символа
- значение ключа - 1023 символа
32-разрядные приложения должны использовать Registry.
>32. Существует ли в CW, возможность управлять классами пользователя?
> (CW)
(ЮФ) На www.capesoft.com есть абсолютно халявный шаблон Object Writer.
>33. Как поместить иконку в ITEM/MENU и менять её во время выполнения
> программы? (CW)
(АМ) В C5 Элемент меню ITEM имеет почти все свойства, что и ОКНО, и в
динамике любое свойство можно менять. Используй свойства
PROP:Text, PROP:Icon...
>34. Возможноли получить "Стандарты Кларион" по почте? (CW)
(ВС) Конечно можно. Пишите письма на vovs@bigfoot.com
>35. Как сконвертировать БД из одно формата в другой? (CW/CDD)
(ВС) Утилиты ccvt, cscn, csrt и описание структуры файла *.dat
выложены. Ссылка на них в разделе "Интересные места" и в "Download".
>36. Как конвертировать массивы в DAT файле из OEM в ANSI? (CW)
(ВС) Конвертировать вручную. Использовать для этих целей строковую
переменную размером с массив и атрибутом OVER. К ней
применять функции CONVERTANSITOOEM и CONVERTOEMTOANSI.
Рекомендую вообще отказаться от массивов, тем более строковых.
Лучше сделать дочерний файл или использовать Slicing.
>37. Что нужно сделать для того, что бы поле поиска активизировалось
> при нажатии русских букв и работало? (CDD)
(ВС) Необходимо в BROWSE.CLA посмотреть имена переменных,
ограничивающих диапазон символов локатора и увеличить верхнюю
границу. По умолчанию - 127. Необходимо - 256. После этого
откомпилировать BROWSE.CLA для всех моделей памяти и пересобрать
свое приложение.
>38. Что такое MS SQL Accelerator? А так же SQL Anywhere Accelerator?
> (CW)
(АМ) Это прямые драйвера для CW для доступа к базам данных на данных
платформах, без использования ODBC. Плюс ряд дополнительных
возможностей, что приводит к ускорению работы Ваших программ.
>39. Как сделать связь One-To-One от одного файла к нескольким? (CW)
(АС) Такая связь не является реляционной и должна поддерживаться руками.
>40. Можно ли сделать опциональный HIDE пунктов в PopUp меню в
RunTime? (CW)
(АМ) Используйте DESTROY(?Item).
>41. Можно ли находясь в окне на ListBox по нажатию MouseRight вызвать
> всплывающее меню? (CW)
(АТ) Можно. Повесить на нужный листбокс Alert по кнопке MouseRight, а
затем отработать событие EVENT:AlertKey, отловив
KEYCODE() = MouseRight:
OF ?List
CASE EVENT()
OF EVENT:AlertKey
IF KEYCODE() = MouseRight
EXECUTE POPUP('One|Two')
DO OneRoutine
DO TwoRoutine
END
END
END
Второй способ: отловить KEYCODE() = RightMouse в обработке события
EVENT:NewSelection, причем в этом случае заносить MouseRight в список
Alert'ов не нужно.
-----------------------------------------------------------------------------
На вопросы отвечали:
+------+-------------------+------------------------+
| Сокр | Имя, фамилия | e-mail |
+------+-------------------+------------------------+
| АМ: | Андрей Мялин | andrew@arsis.ru |
| ВС: | Владимир Смелик | vovs@bigfoot.com |
| ВЭС: | Вадим Синявский | root@jrcn.donetsk.ua |
| АС: | Алексей Соловьев | |
| НС: | Николай Сироткин | |
| ЛМ: | Леонид Мартюшов | |
| АТ: | Алексей Тимков | athome@ukrpost.net |
| ЮФ: | Юрий Философов | yufil@overta.ru |
| ШБ: | Шамиль Бикинеев | |
| ДА: | Дмитрий Анохин | |
| КЩ: | Кирилл Щерба | |
| БИ: | Без имени | |
+------+-------------------+------------------------+
Знаете ли Вы, что событийно-управляемое программирование - это объектно-ориентированное программирование, при котором задаются реакции программы на различные события.