Код магнитолы

JS - телефон

Оппозиция в России ?

Россия и Украина

Мысли в слух...

JS - часы

Российская...власть ?

Skype

Создаём сайт

Любимые сериалы

Гостевая


На главную

Все кнопки в гости к нам

Арифмометр у нас будет не очень сложным, всего 16 кнопок. Для работы с кнопками мы создадим две переменные stroka и rezult.
Маленький нюанс - на нашем арифмометре (пока) не будет символа "точка". Как показало предварительное знакомство с математической частью, вещественные (читай - дробные) числа - это отдельный разговор.
Все кнопки можно разбить (условно) на три группы:
первая группа - это кнопки, отвечающие за добавление на дисплей цифр 0-1-2-3-4-5-6-7-8-9 , обязанности у них не очень сложные:
-- активировать механизм добавления на дисплей символа, находящегося на кнопке (имени кнопки) и формировании из них числа (строки)...это кнопки полного цикла;
вторая группа - это кнопка отвечающие за "независимую" арифметическую операцию - очистку дисплея С, это кнопка полного цикла;
третья группа - "зависимые" кнопки "+","-","*",":","="; первые четыре кнопки могут работать только в паре с пятой - будет использоватся механизм ветвления (swith)...это кнопки неполного цикла; каждая из кнопок арифметических действий будет отвечать за механизм:
-- добавления 1-го набранного числа в регистр ЕВХ;
-- перевода программы в процедуру очистки дисплея cancel;
необходимо помнить, что каждая кнопка арифмометра несёт специальную метку (hbut...), "опознав" которую, кнопка "=" запустит следующие операции:
-- очистка дисплея;
-- добавление 2-го набранного числа в регистр ЕВХ;
-- совершение действий, соответствующих символу на использованой кнопке;
-- добавления полученного числа-итога в буфер stroka и вывода его на дисплей;
Плюс - подключение процедур преобразования.
Программист с опытом может сказать, что приведённого перечня операций - недостаточно. Трудно с этим не согласится. Просто, не стоит забывать, что это будет простой арифмометр и пользователь не будет забывать о своевременной очистке дисплея. Вариант "на дурака" мы учитывать не будем. Вопрос обработки ошибок в ассемблере - очень и очень...тонкий. И код он усложняет - неимоверно. Если у кого-то возникнет желание добавить в код обработку возможных ошибок - флаг вам в руки и попутного ветра !
Обработку кнопок лучше вынести в отдельные процедуры...вам решать.
С кнопками, будем считать, разобрались - вернёмся к среде создания нашего арифмометра. Поскольку - это Win32, мы будем пользоватся API- функциями из файла windows.inc. Опустим функции создания окна-арифмометра и окон- компонентов. Выделим только те, что отвечают за работу:
GetWindowTextA(Wnd:hWnd,Str:PChar,MaxCount:Integer)
эта функция будет отвечать за "получение" с дисплея находящегося там символа, здесь:
Wnd - идентификатор окна или органа управления
Str - буфер принимающий строку
MaxCount - размер буфера Str
SetWindowTextA(Wnd:hWnd,Str:PChar)
эта функция будет отвечать за добавление символов на дисплей, здесь:
Wnd - идентификатор окна или органа управления
Str - строка (заканчивающаяся пустым символом)

Теперь мы можем подумать за код, обслуживающий операции арифмометра.
Главное - часть этого кода будет располагатся после метки wmcommand. Не исключено, что другую часть кода придётся (для читаемости) вынести в отделные процедуры.
Механизм ветвления в ассемблере выглядит как последовательное сравнение:
 
 ...
 wmcommand:
   mov   eax,hbut1           ;жмём на кнопку
   cmp   [ebp+14h],eax       ;смотрим на какую ("1") *
   je	 nabor               ;обрабатываем эту кнопку
   ...
   jmp   exit
   ...
;* data.inc: hbut1 dd  ? 
  
Мы добавляем хэндл кнопки в ЕАХ и сравниваем его с содержимым, находящимся по адресу [EBP+14h]. Если имеется совпадение параметров, мы переходим к обработке данной кнопки:
    
    ...
    nabor:                   ;формируем, на дисплее, строку из символов
     push  15                ;размер буфера (data.inc)     
     push  offset buf        ;всё, что там есть        
     push  [hedit]               
     call  GetWindowTextA@12 содержимое дисплея --> eax 
     add   eax,offset buf    ;buf -+-> eax   
     push  15
     push  eax               ;к содержимому eax (buf)...
     push  [EBP+14h]         ;...добавляем символ кнопки (lParam --> hbut)
     call  GetWindowTextA@12
     push  offset buf              
     push  [hedt]                  
     call  SetWindowTextA@8  ;выводим всё на дисплей	 
     jmp   exit 
    ...
	
Заметим, что приведённый код мы используем только для обработки цифровых кнопок. Оберегаем пользователя от искушения вывести на дисплей символы остальных кнопок.


дальше...
...назад