Как сделана компьютерная программа

  Рассматривая компьютеры как источники информации, люди часто путают одно с другим. И, соответственно, путают понятия компьютерной культуры с культурой информационной.
  Покопавшись в интернете, находим следующее:
//Компьютерная грамотность — это система навыков работы с компьютерами и другими устройствами, содержащими микропроцессоры. Навыки эти довольно сложны и не являются полностью механическими, как, например, умение водить автомобиль. Они скорее относятся к мыслительным навыкам...//
  А также: //владение навыками работы с компьютером для решения задач с заданиями, умение планировать действия и предвидеть их последствия, понимание основных идей информатики, понимание роли информационных технологий в обществе.//
  Я всё же склонен разделять эти понятия, и связываю компьютерную грамотность, прежде всего с умением программировать. И в самом деле - уметь водить автомобиль и не знать как он устроен, это во первых, отказывать себе в удовольствии покопаться в моторе, а во вторых, нести дополнительные расходы по его обслуживанию. Кроме того, по специальности автомеханика и заработать можно больше, чем занимаясь частным извозом.
  Может я и неправ, но умение программировать это шаг в сторону IT-технологий, а неумение - препятствие на пути к ним.

  Впрочем, это преамбула. Я же хочу рассказать о своей программе. О том, как там всё устроено, и как легко и просто быть с компьютером на ты. Софт бывает разного сорта, но практически всегда он устроен именно так.
  Я работаю в среде Визуал Бейсик 6, и для приобретения навыков инженерного программирования рекомендую именно её.

     СОБЫТИЯ

  Работа всякой программы основана на обработке событий.
  Что такое «событие» с точки зрения компьютера? Вот он стоит, вы ровно ничего не делаете и думаете, что и он бездельничает тоже.
  Вовсе нет. Он, так же, как и человек, к которому не пристают, занят своими внутренними делами – проверяет файлы, следит за временем, а если по его мнению времени прошло слишком много, он гасит экран и перестаёт крутить винчестер. Однако стоит вам нажать клавишу или подвигать мышью, или опустить стилус на планшет, он воспринимает это как произошедшее событие. Тогда он просыпается, или прерывает свои внутренние дела и принимается обрабатывать событие.
  Текст компьютерной программы по сути своей является изложенным в письменном виде руководством по обработке возникающих событий.
  События обрабатываются по мере их поступления – чаще всего поочерёдно, иногда экстренно и вне очереди, а иногда и пропускаются, это если вы нажимаете на кнопочки очень часто или двигаете стилус слишком быстро – компьютер хоть и скор, но за скоростью ваших рук ему не угнаться.

     ИСТОЧНИКИ СОБЫТИЙ

  Источником события может быть нажатая, удерживаемая или отпущенная клавиша клавиатуры. Эти события называются событиями клавиатуры.
  Если ваша программа управляет технологическим процессом, то сигналы о событиях могут приходить от многочисленных датчиков, следящих за ним.
  Если же вы сидите у себя дома и рисуете, двигая мышью, стилусом, или используя тач-панель и клавиши под ней, тогда сигналы о событиях могут подавать эти источники.
 
  Взгляните на иллюстрацию – клик по нарисованной на экране кнопке с большой буквой «О», и клик по этикетке с цифрой «0» создадут соответствующие события. Но вот будут ли эти события обрабатываться, и как именно они будут обрабатываться, зависит от вас.

     КАК СОБЫТИЯ ОБРАБАТЫВАЮТСЯ

  Среда Визуал Бейсик 6 немного помогает вам в этом. Если, создавая программу, вы дважды кликните по кнопке большое «О», то в тексте программы появятся такие строки:

Private Sub Command21_Click()

End Sub

Обратите внимание, между этими строками ничего пока нет. Однако, если вы туда что-нибудь запишете, придерживаясь, разумеется, синтаксиса программирования, тогда то, что вы записали, то и будет исполняться –

Private Sub Command21_Click()
  Select Case FC21
    Case 0:
      FC21 = 1: Command21.Caption = "G": Picture4.Cls:
      Label1.ToolTipText = " модификатор "
      Text2 = " расширенный режим  работы с графикой"
    Case 1:
      FC21 = 0: Command21.Caption = "O":
      FL1 = 0: Label1.Caption = FL1:
      Text2 = " обычный режим работы ":
  End Select
End Sub

     ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ

  Сразу скажу, что это за такие FC21, FL1 и откуда они взялись.
  Это – обозначения двух глобальных переменных, флаги кнопки Command21 и этикетки Label1. Эти флаги я сделал, записав в основном блоке программы такую строку –

Public FC21 As Integer, FL1 As Integer

Глобальными такие переменные называются потому что они публичны (Public), они читаются во всех блоках и внутри всех подпрограмм, хотя и не имеют внутри подпрограмм приоритет.

     ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ

  Приоритет внутри подпрограммы отдаётся локальным переменным. Переменные эти не могут быть глобальными. Они могут быть двух типов – динамические и статические. Динамические переменные после выхода из подпрограммы не сохраняются, а статические сохраняют своё значение.
  Пример объявления динамической и статической переменных –

Dim Co as Long
Static F as Integer

     ОБРАБОТКА СОБЫТИЯ Command21_Click()

  Вернёмся к нашей подпрограмме и посмотрим, что в ней происходит –

Private Sub Command21_Click()
  Select Case FC21
    Case 0:
      FC21 = 1: Command21.Caption = "G": Picture4.Cls:
      Label1.ToolTipText = " модификатор "
      Text2 = " расширенный режим  работы с графикой"
    Case 1:
      FC21 = 0: Command21.Caption = "O":
      FL1 = 0: Label1.Caption = FL1:
      Text2 = " обычный режим работы ":
  End Select
End Sub

Если флаг FC21 равен нулю, то он устанавливается в единицу, на кнопке 21 пишется буква "G", поле_4 очищается от накинутой сверху сетки, показывая тем самым, что можно работать с инструментами, находящимися на нём, подсказка для этикетки_1 начинает объяснять, что это «модификатор», а в верхнем информационном поле появляется надпись " расширенный режим  работы с графикой".

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

     ОБРАБОТКА СОБЫТИЯ Label1_Click

  Текст подпрограммы для обработки этого события следующий - 

Private Sub Label1_Click() 'модификатор инструмента
  If FC21 <> 1 Then Exit Sub
  FL1 = FL1 + 1: If FL1 > 3 Then FL1 = 0:
  Label1.Caption = FL1:
End Sub

В ином режиме чем FC21 = 1 ровно ничего не делается. А в режиме расширенной графики флаг FL1 меняет своё значение. Программой это значение будет интерпретироваться в дальнейшем и как модификатор выбираемого на поле_4 инструмента, и как указатель на режим показа векторной графики.

    СОБЫТИЯ ВЫБОРА ЦВЕТА

  В программе есть два поля, с которых можно брать цвет кликами мыши. Это поле_3, оно находится в левом верхнем углу окна, и поле_1, это то поле, на котором мы рисуем и на которое выводим векторную графику.
  Следующая подпрограмма реализует событие клика по полю_3 и устанавливает желаемый цвет:

Private Sub Picture3_MouseDown(Button As Integer, X As Single, Y As Single) 'Палитра
Dim Co As Long
  Co = Picture3.Point(X, Y) 'читаем цвет в точке клика мыши
  If Button = 2 Or Button = 4 Then OldC = Co:
  If Button = 1 Then OldC = ccRGB(Co, OldC, 0.2)
  Command5.BackColor = OldC: Command5.Caption = "":
  Call Lico 'печать цвета
End Sub

Здесь OldC – глобальная переменная содержащая установленный цвет,
ccRGB – подпрограмма-функция, подмешивающая к цвету 20% нового,
BackColor и Caption – цвет и надпись на кнопке_5 (кнопка цвета),
Lico – эта подпрограмма показывает численные характеристики цвета.

  Аналогично обрабатывается клик правой кнопкой мыши по полю_1:

Private Sub Picture1_MouseDown(Button As Integer, X As Single, Y As Single)
Dim Co As Long
   Co = Picture1.Point(X, Y):
   If Button = 1 And FC21 = 0 Then 'берём цвет
   If Co >= 0 Then OldC = Co: Command5.BackColor = OldC:
      Command5.Caption = "": Call Lico:
   Exit Sub: End If:

End Sub

После клика по синему видим на кнопке_5 синий цвет,
а в текстовом информационном окне появляется запись - color  255 0 0 Hex FF  00  00,
после клика по зелёному - color  0 255 0 Hex 00  FF  00,
после клика по красному - color  0 0 255 Hex 00  00  FF.

  Несколько по другому обрабатывается событие Sub Picture1_MouseUp – кликнув правой кнопкой по красному цвету, передвинув мышь и отпустив кнопку на белом цвете, мы смешаем эти цвета:

color  84 84 255 Hex 54  54  FF

и это очень удобно, если мы во время рисования хотим делать плавные переходы от одного цвета к другому.

     ОБРАБОТКА ДВИЖЕНИЯ МЫШИ

  Рисуем ли мы кистью, или выбираем один из инструментов на поле_4, или совершаем какие-нибудь иные активные действия, связанные с движением мыши, всегда, перед началом этих действий мы указываем программе на то, какое именно действие мы хотим осуществить. Сделать это легче всего путём установки флага - если мы рисуем кистью, то флаг Fbra=1 будет указывать нам на это, если выбрали инструмент на поле_4, то придадим флагу FP4 соответствующее значение.
  При наличии таких флагов программа сможет легко определять характер своих действий при нажатии и отпускании кнопок мыши, а также при передвижениях мыши с нажатой кнопкой.
  Вот так, например, обрабатывается движение мыши по рисунку, если выбран один из инструментов находящийся на поле_4:

Private Sub Picture1_MouseMove(Button As Integer, X As Single, Y As Single)
   If Button = 1 And FP4 > 0 Then Call Gmove(2, X, Y): Exit Sub:

End Sub

Здесь Gmove(2, X, Y) это обращение к подпрограмме, организующей работу инструментами. Строки, подобные приведённой, имеются также и в подпрограммах MouseDown и MouseUp, в них они формируют обращения Gmove(1, X, Y) и Gmove(3, X, Y).
  Получив такое обращение, подпрограмма Gmove переправляет его дальше – отправка делается в соответствии со значением флага FP4. В результате обращение получает тот инструмент, номер которого указан во флаге.
  Таким нехитрым способом можно выбирать разнообразные инструменты в различных их модификациях (вспоминаем, что флаг-модификатор FL1 у нас тоже имеется) и работать этими инструментами вполне однотипно. Вся их работа связана с событиями мыши, передаваемыми через строку параметров (M, X, Y), где M = 1, 2 или 3 в зависимости оттого, какое именно событие мыши произошло.

  Иногда инструмент надо предварительно настроить. Настройка обычно заключается в установлении статических переменных в их начальное значение. Для этого я использую обращение с параметром M = 0.
  Можно также организовать окончание работы с фиксацией полученного результата, или прерывание работы с отказом от её продолжения. Выглядит это примерно так:

 If M = 10 Then Form1.Text2 = " отмена": FP4 = 0: Exit Sub 'кнопка cls
 If M = 11 Then FP4 = 0: Form1.Text2 = " Ok": Exit Sub

Вот так организована подпрограмма, которая вводит кривую Безье в качестве элемента графики и одновременно редактирует её при вводе:

Public Sub FLoB(M As Integer, XX As Single, YY As Single) 'вводится кривая Безье
Static F As Integer

  If M = 0 Then 'приготовиться
    Form1.Picture1.Picture = Form1.Picture1.Image:
    F = 1: Form1.Text2 = " вводим кривую Безье": Exit Sub
  End If ‘==================

  Select Case M:
    Case 1: If F = 1 Then 'начинаем рисовать
    Case 2: ‘…
    Case 3: F = 0:
9 End Select
End Sub

  Я поделился с вами некоторым опытом в сфере прикладного программирования. Обращаю, в частности, ваше внимание на использование флагов. Умение правильно организовать свою программу составляет часть общей культуры, и не только в области компьютерных расчётов. Жить с умом и быть дальновидными приходится всем в наше непростое время.

_________
7.12.2022

Тексты программы «Стереометрия и Анимация» можно просмотреть и скачать из этой папки – https://disk.yandex.ru/d/HfTVVsHw-0jQlQ
Программу скачиваем отсюда – https://disk.yandex.ru/d/pT6LoBWUGOBfiw
она работает в системе Виндос, имеет подробный раздел Help, в котором даны исчерпывающие пояснения, касающиеся работы с ней.


Рецензии
Для меня работа компьютера - какое-то непостижимое волшебство. Когда я училась в школе, у нас даже предмета "информатика" не было, а сейчас школьники начальных классов уже что-то программируют. Я не имею представления, как какие-то буквы, цифры и значки двигают курсор по экрану, создают цвета и т.д. Живу как в каменном веке, не имея ни малейшего представления о том, с чем ежедневно работаю. Единственное, что может с этим всем соперничать - электричество. Сегодня только работу сдала - погас свет в доме, и как же я была счастлива, что всё сохранила и успела отправить).
Вообще, если понимать то, о чём вы пишете, читать легко и приятно (это я, ничего не понимая, чувствую и вижу).
В целом - понравилось!
:)

Жолтая Кошка   09.12.2022 23:52     Заявить о нарушении
Спасибо за интерес к теме. Для практической жизни не обязательно всё знать.
Я тоже о компьютерах знаю далеко не всё. Знаю достаточно хорошо о том, что мне нужно или может пригодиться, но и имею представление о том, какие знания не нужны.
Например, язык программирования Питон я считаю дурным языком и никогда его изучать не буду ))

Дмитрий Маштаков   11.12.2022 09:43   Заявить о нарушении