Zemskov_my_sppo1
.pdfЮ. В. Земсков. Системное и прикладное программное обеспечение. Конспект лекций, варианты заданий и методические указания в лабораторным работам. ВГИ ВолГУ, 2002 г.
Листинг 11.3. Программа для определения кодов клавиш
Uses Crt;
Const Ofst = $1E;
{смещение начала буфера клавиатуры относительно начала сегмента}
var |
|
ch |
: Char; |
i, c0, c1 : Byte; |
|
BufferHead : word absolute $40:$1A; |
|
BufferTail : word absolute $40:$1C; |
BufferKeyb : array[0..31] of Byte absolute $0:$41E;
KeybFlags : word absolute $40:$17;
Procedure ShowKeyb(n1,n2:byte);
{показать содержимое буфера клавиатуры с n1 по n2} var i, c1, c0 : Byte;
begin
for i:=n1 to n2 do begin c1 := BufferKeyb[2*i]; c0 := BufferKeyb[2*i+1];
Write(c1:3,’:’,c0:3,’; ’); end;
end;
Begin repeat
if KeyPressed then begin {если нажата клавиша} Writeln(’================================================’); Writeln(’Порт клавиатуры 60H = ’,port[$60]);
Writeln(’Флаги клавиатуры = ’, KeybFlags); Writeln(’BufferHead = ’,BufferHead); Writeln(’BufferTail = ’,BufferTail); Writeln(’Содержимое буфера клавиатуры:’); ShowKeyb(0,7); Writeln;
ShowKeyb(8,15); Writeln;
c1 := BufferKeyb[BufferHead-Ofst];
c0 := BufferKeyb[BufferHead-Ofst+1];
Writeln(’В буфере клавиатуры двухбайтовый код ’, c1,’:’,c0); ch := ReadKey;
if ch=#0 then begin
Writeln(’Нажата функц.клавиша, код ReadKey = 0:’, Ord(ReadKey)); end else
Writeln(’Нажата обычная клавиша "’, ch, ’" код ReadKey = ’, Ord(ch));
end;
until ch = #27; {код клавиши ESC} End.
83
Ю. В. Земсков. Системное и прикладное программное обеспечение. Конспект лекций, варианты заданий и методические указания в лабораторным работам. ВГИ ВолГУ, 2002 г.
Листинг 11.4. Программа на языке Си — обработчик прерывания 05H
#include<dos.h>
#include<stdio.h>
//Определим структуру, единственное поле p которой // ссылается на процедуру оработки прерываний: struct intaddr {void interrupt (far * p) (void); };
//Указатель на старый обработчик прерывания 05: void interrupt (far * old_int05)(void);
//Новый обработчик |
прерывания 05: |
|
void interrupt far ISR_int05(void){ |
||
unsigned int i; |
|
|
unsigned char (far |
* vmem)[]; //указатель на массив байтов |
|
(void far*)vmem = MK_FP(0x0b800,0); // начало видеопамяти |
||
for (i=0; i<80*25; |
i++) { //весь экран запонится символами |
|
(*vmem)[2*i] |
= |
i % 255; // код символа |
(*vmem)[2*i+1] |
= |
0x7; // атрибут (белый символ на чёрном фоне) |
}
old_int05(); // вызвали старый обработчик
}
void TSR(char, unsigned); // предварительное описание процедуры
extern |
unsigned |
_heaplen = 1024; // |
размер |
хипа |
extern |
unsigned |
_stklen = 512; // |
размер |
стека |
int main(void){ // главная программа - установщик нового обработчика //Объявим новую переменную типа "указатель на обработчик прерывания" // и присвоим ему адрес обработчика прерывания 05:
struct intaddr far * int05 = (struct intaddr far *)MK_FP(0, 0x05<<2); old_int05 = int05 -> p; //запомнили адрес старого обработчика disable(); // запретили прерывания
int05 -> p = ISR_int05; // установили вектор на новый обработчик enable(); // разрешили прерывания
printf("\nУстановлен обработчик прерывания int05\n"); printf(" нажмите Shift+PrintScreen ... "); unsigned size = _SS + (_SP + 15) / 16 - _psp;
TSR(0, size); // завершили и остались резидентным return 0;
}
//Процедура "завершить и остаться резидентным": void TSR(char status, unsigned size) {
_AH = 0x31; // номер функции "завершиться, но остаться резидентным" _AL = status; // код возврата
_DX = size; // количество 16-байтных параграфов, оставляемых в памяти geninterrupt(0x21); // вызвали прерывание 21H
}
84
Ю. В. Земсков. Системное и прикладное программное обеспечение. Конспект лекций, варианты заданий и методические указания в лабораторным работам. ВГИ ВолГУ, 2002 г.
Листинг 11.5. Программа на ассемблере — обработчик прерывания 00H (деление на 0)
name intzdiv
title Divide-by-zero interrupt Handler
.model |
small |
|
|
|
|
|
|
cr |
equ |
0dh |
|
|
|
|
|
lf |
equ |
0ah |
|
|
|
|
|
beep |
equ |
07h |
|
|
|
|
|
backsp |
equ |
08h |
|
|
|
|
|
.code |
org |
100h ; Это будет COM-программа |
|||||
|
|||||||
init |
proc |
near ; Процедура инициализации вектора |
|||||
|
mov |
dx, |
offset zdiv ; DS:DX - адрес дескриптора |
||||
|
mov |
ax, |
2500h ; Фунция 25h - установить вектор |
||||
|
int |
21h |
|
|
|
|
|
|
mov |
dx, |
offset msg1 ; DS:DX - адрес начала сообщения |
||||
|
mov |
ah, |
9 ; Функция 09 - вывод строки на экран |
||||
|
int |
21h |
|
|
|
|
|
|
mov |
dx, |
((offset pgm_len+15)/16)+10h ; Число параграфов |
||||
|
mov |
ax, |
3100h ; функция 31h - завершить и остаться |
||||
|
int |
21h |
|
; резидентным, al - код возврата |
|||
|
|
|
|
|
|||
init |
endp ; Конец процедуры инициализации |
||||||
zdiv |
proc far ; Сам обработчик прерывания по делению на 0 |
||||||
|
sti ; Разрешаем прерывания |
|
|||||
|
push |
ax ; Сохраним регистры в стеке |
|||||
|
push |
bx |
|
|
|
|
|
|
push |
cx |
|
|
|
|
|
|
push |
dx |
|
|
|
|
|
|
push |
si |
|
|
|
|
|
|
push |
di |
|
|
|
|
|
|
push |
bp |
|
|
|
|
|
|
push |
ds |
|
|
|
|
|
|
push |
es |
|
|
|
|
|
|
mov |
ax, |
cs ; Данные в кодовом сегменте |
||||
|
mov |
ds, |
ax |
|
|
|
|
|
mov |
dx, |
offset msg2 |
|
|||
|
mov |
ah, |
9 |
|
|
|
|
|
int |
21h |
|
; Вывели сообщение |
|||
zdiv1: |
mov |
ah, |
1 ; Функция 01 - чтение с клавиатуры |
||||
|
int |
21h |
|
|
|
|
|
|
or |
al, |
20h ; Перевели символ в нижний регистр |
||||
|
cmp |
al, |
’c’ |
|
|
||
|
je |
zdiv3 ; Перешли, если нажата ’C’ или ’c’ |
|||||
|
cmp |
al, |
’q’ |
|
|
||
|
je |
zdiv2 ; Перешли, если нажата ’Q’ или ’q’ |
|||||
|
mov |
dx, |
offset msg3 |
|
|||
|
mov |
ah, |
9 |
|
|
|
|
|
int |
21h |
|
; Вывели сообщение |
|||
zdiv2: |
jmp |
zdiv1 |
|
|
|
||
mov |
ax, |
4cffh ; Закончим текущую программу |
|||||
|
|||||||
zdiv3: |
int |
21h |
|
; |
с кодом возврата ffh |
||
mov |
dx, |
offset msg4 |
|
||||
|
|
||||||
|
mov |
ah, |
9 |
|
|
|
|
|
int |
21h |
|
; Вывели сообщение |
|||
|
xor |
ax, |
ax ; Обнулили регистр ax |
||||
|
push |
ax |
|
; Запишем его в стек, а потом |
|||
|
popf |
|
|
; |
прочитаем во флаговый регистр, |
||
|
pushf |
|
|
; если это процессор 8086/8088, то |
|||
|
pop |
ax |
|
; он установит биты с 12 по 15 |
|||
|
and |
ax, |
0f000h |
|
|
||
|
cmp |
ax, |
0f000h |
|
|
||
|
je |
zdiv5 |
; Перейдём, если это 8086/8088 |
||||
|
|
|
|
; в противном случае подправим адрес возврата, |
|||
|
mov |
bp, |
sp |
; чтобы обойти команду деления |
|||
|
|
|
|
||||
|
lds |
bx, |
[bp+18] ; Это адрес команды, давшей ошибку |
||||
|
mov |
bl, |
[bx+1] |
; Получили адресуемый байт |
|||
|
and |
bx, |
0c7h |
; это поля mod и r/m кода команды |
|||
|
cmp |
bl, |
6 ; если mod=0, r/m=6, то это прямая адресация |
||||
|
jne |
zdiv4 ; Если непрямая, то переход |
|||||
|
add |
word ptr [bp+18], 4 |
|
||||
zdiv4: |
jmp |
zdiv5 |
|
|
|
||
mov |
cl, |
6 |
; Для непрямой адресации получим |
||||
|
|||||||
|
shr |
bx, |
cl ; по значению поля mod |
||||
|
mov |
bl, |
cs:[bx+itab] ; |
определим длину команды |
|||
zdiv5: |
add |
[bp+18], bx |
; |
из таблицы |
|||
pop |
es ; Восстановим регистры из стека |
||||||
|
|||||||
|
pop |
ds |
|
|
|
|
|
|
pop |
bp |
|
|
|
|
|
|
pop |
di |
|
|
|
|
|
|
pop |
si |
|
|
|
|
|
|
pop |
dx |
|
|
|
|
|
|
pop |
cx |
|
|
|
|
|
|
pop |
bx |
|
|
|
|
|
|
pop |
ax |
|
|
|
|
|
|
iret |
; Возврат из процедуры обработки прерывания |
|||||
zdiv |
endp ; Конец процедуры обработки прерывания |
||||||
msg1 |
db |
cr, |
lf ; Сообщение во время инициализации вектора |
||||
|
db |
’Прерывание по делению на 0’, cr, lf |
|||||
|
db |
’$’ |
; Терминатор строки |
||||
msg2 |
db |
cr, |
lf ; Сообщение во время обработки прерывания |
||||
|
db |
’Обнаружено деление на 0:’, cr, lf |
|||||
|
db |
’продолжать или закончить (Continue/Quit)?’, cr, lf |
|||||
|
db |
’$’ |
; Терминатор строки |
||||
msg3 |
db |
beep ; Сообщение при недопустимом вводе |
|||||
|
db |
backsp, ’ ’, backsp, ’$’ |
|||||
msg4 |
db |
cr, |
lf, ’$’ ; Возврат каретки, перевод строки |
||||
|
|
; |
Таблица размеров кодов команд: |
||||
itab |
db |
2 ; |
mod = 0 |
|
|
||
|
db |
3 ; |
mod = 1 |
|
|
||
|
db |
4 ; |
mod = 2 |
|
|
||
|
db |
2 ; |
mod = 3 |
|
|
||
pgm_len |
equ |
$ - |
init ; Длина программы |
||||
|
end |
init |
|
|
|
|
|
|
|
|
|
|
|
|
85
Ю. В. Земсков. Системное и прикладное программное обеспечение. Конспект лекций, варианты заданий и методические указания в лабораторным работам. ВГИ ВолГУ, 2002 г.
Листинг 11.6. Программа на ассемблере — обработчик прерывания 21H (запрещает удаление файлов с указанного диска)
title |
Резидент, не позволяющий удалять файлы с указанного диска |
||||
|
.model |
tiny |
|
|
|
|
.code |
|
|
|
|
|
org |
|
2ch |
|
|
envseg |
dw |
|
? ; Адрес копии окружения DOS |
||
|
org |
|
80h |
|
|
cmdlen |
db |
|
? ; Длина командной строки |
||
cmdline |
db |
|
? ; Начало командной строки |
||
start: |
org |
|
100h ; Начало COM-программы |
||
|
|
|
|
|
|
old_int21h: |
|
|
|
|
|
|
jmp |
|
short initialize |
|
|
|
dw |
|
0 ; Вместе с предыдущей командой перехода |
||
|
; получается 4 байта для хранения старого вектора |
||||
int21h_handler |
proc far |
; Обработчик прерывания 21h |
|||
|
pushf |
; сохранили флаги |
|
||
|
cmp |
|
ah, 41h ; если вызвали функцию 41h (удаление файла) |
||
|
je |
|
fn41h |
|
|
|
cmp |
|
ax, 7141h ; или 7141h (удаление файла с длинным именем) |
||
|
je |
|
fn41h |
|
|
fn41h: |
jmp |
|
short not_fn41h ; не "наша" функция |
||
push |
|
ax |
|
|
|
|
|
|
|
||
|
push |
|
bx |
|
|
|
mov |
|
bx, dx |
|
|
|
cmp |
|
byte ptr ds:[bx+1], ’:’ ; если второй символ - ’:’, |
||
|
je |
|
full_spec |
|
; то первый символ - имя диска |
|
mov |
|
ah, 19h ; иначе определим текущий диск |
||
|
int |
|
21h |
|
|
|
add |
|
al, ’A’ ; преобразовать номер диска к заглавной букве |
||
|
jmp |
|
short compare ; перейти к сравнению |
||
full_spec: |
|
|
|
|
|
|
mov |
|
al, byte ptr [bx] ; AL - имя диска |
||
compare: |
and |
|
al, 11011111b ; преобразовать к заглавной букве |
||
cmp |
|
al, byte ptr cs:cmdline[1] ; если это "наш" диск, |
|||
|
|
||||
|
je |
|
access_denied |
; то запрещаем доступ |
|
|
pop |
|
bx |
|
|
|
pop |
|
ax |
|
|
not_fn41h: |
|
|
|
|
|
|
popf |
|
|
|
|
|
jmp |
|
dword ptr cs:old_int21h ; вызываем старый обработчик |
||
access_denied: |
|
|
|
||
|
pop |
|
bx |
|
|
|
pop |
|
ax |
|
|
|
popf |
|
|
|
|
|
push |
|
bp |
|
|
|
mov |
|
bp, sp |
|
|
|
or |
|
word ptr [bp+6], 1 ; установим флаг переноса (бит 0) |
||
; в регистре флагов, сохранённом по команде INT (это признак ошибки) |
|||||
|
pop |
|
bp |
|
|
|
mov |
|
ax, 5 ; код ошибки "доступ запрещён" |
||
|
iret |
|
; выход из обработчика прерывания |
||
int21h_handler |
endp |
|
|
||
initialize |
proc near |
|
|
||
|
cmp |
|
byte ptr cmdlen, 3 ; длина командной строки должна |
||
|
jne |
|
not_install ; быть = 3 (пробел, имя диска, двоеточие) |
||
|
cmp |
|
byte ptr cmdline[2], ’:’ ; если третий символ |
||
|
jne |
|
not_install |
; неправильный |
|
|
mov |
|
al, byte ptr cmdline[1] ; преобразуем второй символ |
||
|
and |
|
al, 11011111b |
; к заглавной букве |
|
|
cmp |
|
al, ’A’ |
|
|
|
jb |
|
not_install ; код имени диска меньше ’A’ |
||
|
cmp |
|
al, ’Z’ |
|
|
|
ja |
|
not_install ; код имени диска больше ’Z’ |
||
|
mov |
|
ax, 3521h ; AH-номер функции; AL-номер прерывания |
||
|
int |
|
21h |
; получили адрес текущего обработчика |
|
|
mov |
|
word ptr old_int21h, bx |
|
|
|
mov |
|
word ptr old_int21h+2, es ; сохранили его |
||
|
mov |
|
ax, 2521h ; AH-номер функции; AL-номер прерывания |
||
|
mov |
|
dx, offset int21h_handler ; DS:DX-адрес нашего обработчика |
||
|
int |
|
21h ; установили вектор на свой обработчик |
||
|
mov |
|
ah, 49h ; номер функции |
|
|
|
mov |
|
es, word ptr envseg ; адрес блока с нашей копией |
||
|
|
|
|
; окружения DOS |
|
|
int |
|
21h ; освободили память из-под окружения |
||
|
mov |
|
dx, offset initialize ; DX-адрес первого байта за концом |
||
|
|
|
|
; резидентной части программы |
|
|
int |
|
27h ; завершить и остаться резидентным |
||
not_install: |
|
|
|
|
|
|
mov |
|
ah, 9 ;номер функции вывода строки на экран |
||
|
mov |
|
dx, offset usage ; адрес строки |
||
|
int |
|
21h ; вывели сообщение о формате командной строки |
||
|
ret |
; закончили |
|
|
|
usage |
db |
|
’Использование: isr21del c:’, 0dh, 0ah |
||
|
db |
|
’Запрещает удаление файлов на указанном диске’, 0dh, 0ah |
||
|
db |
|
’$’ ; терминатор строки |
|
|
initialize |
|
endp |
|
|
|
|
end |
|
start |
|
|
86
Ю.В. Земсков. Системное и прикладное программное обеспечение. Конспект лекций, варианты заданий и методические указания в лабораторным работам. ВГИ ВолГУ, 2002 г.
12.Работа с Visual Basic for Applications
12.1. Использование VBA в редакторе MS Word
Общий алгоритм работы:
1. Открыть MS Word ( Пуск í Программы í Microsoft Word ).
2.Вызвать панель “Visual Basic” ( í Вид í Панели ).
3.Войти в режим конструктора (одноимённая кнопка на панели “Visual Basic”).
4.Вызвать панель “Элементы управления” (одноимённая кнопка на панели “Visual Basic”).
5.Разместить на странице документа нужные элементы управления (флажок, поле ввода, кнопка, переключатель, список, поле со списком, выключатель, счётчик, полоса прокрутки, надпись, рисунок, другие элементы — любые элементы ActiveX, зарегистрированные в системе).
6.Изменить, если нужно, свойства каждого элемента управления ( Свойства на панели “Элементы управления” или правая кнопка мыши). По каждому свойству доступна подсказка (F1).
7.Задать действия для нужных элементов управления ( Исходный текст ) на языке Visual Basic.
8.Выйти из режима конструктора (отжать одноимённую кнопку) и проверить, как всё работает.
9.Сохранить документ.
Пример 12.1 Разместить на листе два поля ввода (TextBox), две надписи (Label) и одну кнопку (Button), как показано на рис. 12.1.
|
|
TextBox1 |
|
Label2 |
|
|
TextBox2 |
|
|
Label1 |
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
CommandButton1 |
|
|||||||||||
|
|
|
|
|
|
|||||||||||
|
Рис. 12.1. Элементы управления для примера 12.1 |
|||||||||||||||
Задать свойства элементов: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Label1.Caption |
:= |
= |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Label2.Caption |
:= |
+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CommandButton1.Caption := |
Сложить |
|||||||||||||||
ÚÚ CommandButton1 |
и написать процедуру, выполняемую при нажатии на кнопку: |
Private Sub CommandButton1_Click() ’ моя первая процедура на VBA
Label1.Caption = " = " + Str(Val(TextBox1.Text) + Val(TextBox2.Text)) End Sub
Проверьте, как всё работает. Что происходит при вводе “неправильных” чисел?
Добавьте кнопки для остальных арифметических действий и для возведения в квадрат; для каждой задайте нужный текст процедуры обработки нажатия.
Замените Label2 на поле со списком, элементы которого задают арифметические действия. Напишите необходимый обработчик.
Пример 12.2 Вывод на экран сообщения в отдельном окне.
Разместим на пустом листе надпись и кнопку. Напишем следующий текст обработчика нажатия на кнопку:
Dim Msg, Style, Title, Help, Ctxt, Response Msg = " Будем продолжать? "
Style = vbYesNo Title = " Вопрос "
Help = "demo.hlp" ’ имя файла справки (если есть) Ctxt = 10000 ’ номер раздела справки
Response = MsgBox(Msg, Style, Title, Help, Ctxt) If Response = vbYes then
Label1.Caption = "Yes" Else
Label1.Caption = "No" End If
Что происходит при нажатии на кнопку? Изменяется ли текст надписи в соответствии с вашим ответом? Если в конце процедуры вставить оператор
SendKeys "%{F4}", True
то приложение закроется, как будто нажали Alt+F4. Проверьте. Вообще, данный оператор позволяет имитировать любые нажатия на клавиатуру (знак процента соответствует клавише Alt).
В вышеприведённом примере диалоговое окно не позволяет ввести какой-либо текст или число. Для этого служит функция
InputBox(Message, Title, DefaultValue)
Проверьте, как работает следующий фрагмент:
87
Ю. В. Земсков. Системное и прикладное программное обеспечение. Конспект лекций, варианты заданий и методические указания в лабораторным работам. ВГИ ВолГУ, 2002 г.
CommandButton1.Capture = InputBox( "Введите название для кнопки", "Ввод названия", "Нажми меня")
Пример 12.3 Диалоговая форма.
Запустите редактор Visual Basic (одноимённая кнопка на панели “Visual Basic”). В главном меню выполните í Insert í UserForm . Разместите на появившейся пустой форме три элемента управления: TextBox1, Label1
и ComandButton1. Обработчик для кнопки:
Label1.Caption = TextBox1.Text
Вернитесь в редактор Word и разместите на пустом листе кнопку, для которой введите следующий текст обработчика:
Dim UserForm1 As New UserForm1 ’ можно создавать сколько угодно одинаковых форм Load UserForm1 ’ данная строка обычно лишняя
UserForm1.Show ’ показать форму CommandButton1.Caption = UserForm1.Label1.Caption
Проверьте, как всё работает.
Если надо, чтобы форма появлялась автоматически, например, при открытии документа, то в редакторе MS Word необходимо создать макрос ( í Сервис í Макрос í Макросы Создать ) с именем AutoOpen и в нём вызвать форму. Сделайте это.
Если получилось, добавьте в текст макроса следующий фрагмент:
ActiveDocument.Contetn.MoveEnd ActiveDocument.Contetn.InsertAfter( UserForm1.Label1.Caption )
Для последовательного ввода текста в документ можно также использовать
Selection.TypeText( " ... " ) Selection.TypeParagraph ’ новый абзац
Проверьте и этот вариант.
12.2. Использование VBA в MS Excel
Общий алгоритм работы:
1. Открыть MS Excel ( Пуск í Программы í Microsoft Excel ).
2.Вызвать панель “Visual Basic” ( í Вид í Панели ).
3.Войти в режим конструктора (одноимённая кнопка на панели “Visual Basic”).
4.Вызвать панель “Элементы управления” (одноимённая кнопка на панели “Visual Basic”).
5.Разместить на странице документа нужные элементы управления (флажок, поле ввода, кнопка, переключатель, список, поле со списком, выключатель, счётчик, полоса прокрутки, надпись, рисунок, другие элементы — любые элементы ActiveX, зарегистрированные в системе).
6.Изменить, если нужно, свойства каждого элемента управления ( Свойства на панели “Элементы управления” или правая кнопка мыши). По каждому свойству доступна подсказка (F1).
7.Задать действия для нужных элементов управления ( Исходный текст ) на языке Visual Basic.
8.Создать при необходимости пользовательские формы (как и в Word’е).
9.Создать макросы (процедуры) для выполнения необходимых действий (Alt+F8 или í Сервис
íМакрос í Макросы ).
10.Разместить при необходимости новые кнопки на панели инструментов или новые команды меню,
вызывающие созданные макросы на выполнение ( í Вид í Панели í Настройка Команды Категории: Ú Макросы и перетащить настраиваемую кнопку на панель или в меню, после чего через правую кнопку мыши настроить её внешний вид и назначить ей нужный макрос).
11.Выйти из режима конструктора (отжать одноимённую кнопку) и проверить, как всё работает.
12.Сохранить документ.
Примечание: Не все перечисленные пункты обязательны.
При программировании в VBA используется объектная модель. Как и в Object Pascal, имя объекта от имени поля или метода отделяется точкой. Так, запись Application.ActiveWorkbook.Name означает, что мы обращаемся к объекту «Приложение», к его полю «Активная рабочая книга», к её полю «Имя».
Главный объект — Application (приложение); приложение может работать с несколькими рабочими книгами (Workbook), перед использованием рабочую книгу надо активизировать с помощью вызова Workbooks(book).Activate, где book — имя книги (т. е. файла *.xls). Книга содержит несколько рабочих листов (Worksheets), перед использованием каждый лист также нуждается в активизации: Worksheets(sheet).Activate, где sheet — имя листа (оно написано в левом нижнем углу листа). Только одна книга и только один лист могут быть активны в каждый момент времени. Каждый лист — это множество ячеек (cell), с которыми можно работать по отдельности или в группе. Обращение к ячейке осуществляется с помощью объекта Range("имя ячейки").
88
Ю. В. Земсков. Системное и прикладное программное обеспечение. Конспект лекций, варианты заданий и методические указания в лабораторным работам. ВГИ ВолГУ, 2002 г.
Пример 12.4 Создайте макрос (Alt+F8) с именем Test01, при выполнении которого в ячейку A1 будет записываться имя текущего файла (рабочей книги Excel), в ячейку B1 — имя текущего листа, а в ячейки с C1 по Cx — числа от 1 до x, где x — число листов в текущей рабочей книге. Соответствующий текст на языке Visual Basic:
Sub Test01()
’Описания переменных: Dim book As String Dim sheet As String Dim addr As String
’Узнаем имя рабочей книги:
book = Application.ActiveWorkbook.Name
’ Узнаем имя рабочего листа:
sheet = Application.ActiveSheet.Name
’Запишем эти имена в нужные ячейки
’текущего листа текущей рабочей книги: Workbooks(book).Activate Worksheets(sheet).Activate
Range("A1") = book Range("B1") = sheet
’А теперь числа от 1 до x:
Dim s As String
Dim xList As Integer
’ Узнаем, сколько есть листов: xList = Application.Sheets.Count
addr = "C" ’ выводить будем в столбец C For x = 1 To xList
s = addr + LTrim(Str(x))
’ Функция LTrim удаляет пробелы в начале строки Range(s) = x
Next x
End Sub
Пример 12.5 Теперь создадим набор рабочих книг (набор объектов, в общем случае разнотипных, называют коллекцией). Объект «коллекция» имеет два метода: Add (добавить новый элемент в коллекцию) и Remove (удалить элемент из коллекции). Доступ к каждому элементу производится по его номеру: Item(номер), количество элементов в коллекции можно узнать, обратившись к полю Count.
Создайте новый макрос Text02:
Sub Test02()
Dim MyCollection As New Collection
’Добавим новые книги в коллекцию: MyCollection.Add ("Книга 1") MyCollection.Add ("Книга 2") MyCollection.Add ("Книга 3")
’Выведем сообщение о количестве книг: MsgBox (Str(MyCollection.Count))
’Сообщим имя первой книги:
MsgBox (MyCollection.Item(1))
’Удалим её из коллекции: MyCollection.Remove (1)
’Как называется вторая книга, которая теперь уже первая? MsgBox (MyCollection.Item(1))
End Sub
Чтобы всё время не писать MyCollection, как и в Паскале, можно использовать оператор with:
With MyCollection
.Add ("Книга 1")
.Add ("Книга 2")
..................
End With
Пример 12.6 Создайте новый макрос Text03 и попытайтесь разобраться, что он делает:
Application.WindowState = xlMinimized
Application.WindowState = xlNormal
Workbooks.Add
ActiveCell.FormulaR1C1 = "12"
89
Ю. В. Земсков. Системное и прикладное программное обеспечение. Конспект лекций, варианты заданий и методические указания в лабораторным работам. ВГИ ВолГУ, 2002 г.
Range("A2").Select ActiveCell.FormulaR1C1 = "23" Range("A3").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)" Range("A4").Select
ChDir "C:\WINDOWS\Рабочий стол"
ActiveWorkbook.SaveAs FileName:="C:\WINDOWS\Рабочий стол\Книга2.xls", _ FileFormat:=xlNormal, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=False
90
Ю. В. Земсков. Системное и прикладное программное обеспечение. Конспект лекций, варианты заданий и методические указания в лабораторным работам. ВГИ ВолГУ, 2002 г.
Список литературы
[1]Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение. — СПб.: Питер, 2001. — 736 с.
[2]Иртегов Д.В. Введение в операционные системы. — СПб.: БХВ-Петербург, 2002. — 624 с.
[3]Олифер В.Г., Олифер Н.А. Сетевые операционные системы. — СПб.: Питер, 2002. — 544 с.
[4]Бородич Ю.С., Вальвачев А.Н., Кузьмич А.И. Паскаль для персональных компьютеров: Справочное пособие. — Минск.: Вышейшая школа, 1991. — 365 с.
[5]Касаткин А.И. Профессиональное програмирование на языке Си. Книга 3. Системное программирование. — Минск.: Вышейшая школа, 1993. — 301 с.
[6]Зубков В.С. Assembler для DOS, Windows и Unix. — М.: ДМК Пресс, 2000. — 608 с.
[7]Юров В. Assembler. — СПб.: Питер, 2000. — 624 с.
[8]Пустоваров В.И. Язык Ассемблера в программировании информационных и управляющих систем. — М.: Энтроп, Киев: «Век», 1998. — 304 с.
[9]Харт Дж.М. Системное программирование в среде Win32, 2-е изд.: Пер. с англ. — М.: Издательский дом «Вильямс», 2001. — 464 с.
[10]Данкан Р. Профессиональная работа в MS–DOS: Пер. с англ. — М.: Мир, 1993. — 509 с.
[11]Бек Л. Введение в системное программирование: Пер. с англ. — М.: Мир, 1988. —448 с.
[12]Браун Р., Кайл Дж. Справочник по прерываниям для IBM PC: В 2-х ч. — СПб: Ассоциация OILCO, 1992. — Ч.1. — 357 с. Ч.2. — 378 с.
[13]Нортон Д. Написание драйверов для Windows: Пер. с англ. — М.: Мир, 1994. — 560 с.
91
Ю. В. Земсков. Системное и прикладное программное обеспечение. Конспект лекций, варианты заданий и методические указания в лабораторным работам. ВГИ ВолГУ, 2002 г.
Материалы к экзамену по дисциплине “Системное и прикладное программное обеспечение”
|
|
Вопросы экзаменационных билетов |
|
|
|
|
|
|||
1. Операционная система. Классификация ОС. |
17. Методы синхронизации потоков. Критиче- |
|||||||||
Операционная среда. Вычислительный процесс. Си- |
ские секции, мьютексы, семафоры. Примеры. |
|
|
|||||||
стемные ресурсы. Основные принципы построения |
18. Моделирование |
параллельных |
взаимодей- |
|||||||
операционных систем. |
|
ствующих процессов на сетях Петри. Классические |
||||||||
2. Процессы, потоки, нити. Повторно использу- |
модели параллельного программирования. |
|
|
|||||||
емые программные модули. Реентерабельные и по- |
19. Использование блокирующих сокетов при со- |
|||||||||
вторно входимые модули. |
|
|||||||||
|
здании распределённых приложений. Взаимодей- |
|||||||||
3. Современные |
системы программирования. |
|||||||||
ствие с установлением соединения и без установле- |
||||||||||
Состав и функционирование. Четыре этапа развития. |
ния соединения. Примеры. |
|
|
|
|
|||||
Обзор инструментальных средств. |
|
20. Использование |
асинхронных |
сокетов |
в |
|||||
4. Стандартные компоненты среды визуально- |
||||||||||
Delphi. Клиент-серверные и одноранговые прило- |
||||||||||
го программирования. Программирование диалого- |
жения. Примеры. |
|
|
|
|
|
||||
вых программ в Delphi. Примеры. |
|
21. Поэлементная обработка изображений. Одно- |
||||||||
5. Загрузка программ. Абсолютная и относи- |
||||||||||
родная и неоднородная обработка. Линейное контра- |
||||||||||
тельная загрузка. Базовая адресация. Позиционно- |
стирование и соляризация. Препарирование. Филь- |
|||||||||
независимый код. Оверлеи. |
|
трация. Работа с растровыми изображениями в |
||||||||
6. Сборка программ. Объектные модули. Биб- |
||||||||||
Delphi. Примеры. |
|
|
|
|
|
|||||
лиотеки объектных модулей. Сборка в момент за- |
22. Средства DOS (int 21h) для ввода и вывода |
|||||||||
грузки. Динамические библиотеки. |
|
|||||||||
|
символьной информации. Примеры. |
|
|
|
||||||
7. Динамические библиотеки в системе Win32. |
|
|
|
|||||||
23. Средства BIOS (int 10h) для ввода и вывода |
||||||||||
Предпочтительный базовый адрес. Явная и неявная |
||||||||||
символьной информации. Примеры. |
|
|
|
|||||||
загрузка DLL. Хранение ресурсов в DLL. Примеры. |
24. Организация прямого ввода-вывода |
в про- |
||||||||
8. Управление оперативной памятью. Открытая |
||||||||||
граммах на ассемблере. Примеры. |
|
|
|
|
||||||
память. Динамическое выделение памяти. Диспет- |
|
|
|
|
||||||
чер памяти и алгоритм его работы. Сборка мусора. |
25. Организация |
устройств |
ввода-вывода |
в |
||||||
ПЭВМ. Параллельный порт. Примеры программи- |
||||||||||
Базовая виртуальная адресация. |
|
|||||||||
|
рования. |
|
|
|
|
|
||||
9. Сегменты и страницы. Управление памятью в |
|
|
|
|
|
|||||
системах MS-DOS, MacOS, Win16, Win32. Реализа- |
26. Ввод-вывод числовой информации в програм- |
|||||||||
ция системных вызовов. Кольца защиты. |
|
мах на ассемблере. Примеры. |
|
|
|
|
||||
10. Функции ОС по управлению задачами. Пла- |
27. Архитектура и программирование арифмети- |
|||||||||
нирование и диспетчеризация. Вытесняющая и ко- |
ческого сопроцессора. Примеры. |
|
|
|
|
|||||
оперативная многозадачность. Приоритетное и бес- |
28. Ассемблерные вставки в программах на Пас- |
|||||||||
приоритетное планирование. Граф состояний задачи. |
кале. Примеры. |
|
|
|
|
|
||||
Планирование в порядке очереди. Циклические пла- |
29. Использование графических видеорежимов в |
|||||||||
нировщики. Примеры. |
|
|||||||||
|
программах на ассемблере. Примеры. |
|
|
|
||||||
11. Функции ОС по управлению задачами. Пла- |
|
|
|
|||||||
30. Использование сервисов DOS для работы с |
||||||||||
нирование с динамическими приоритетами. Абсо- |
||||||||||
файлами. Основные операции. Примеры. |
|
|
|
|||||||
лютные и |
относительные приоритеты. Смешанные |
31. Обработка прерываний в |
системе |
Turbo |
||||||
алгоритмы |
планирования. Приоритетная |
очередь с |
||||||||
Pascal. Примеры. |
|
|
|
|
|
|||||
обратной связью. Примеры. |
|
|
|
|
|
|
||||
|
32. Программирование процедур обработки пре- |
|||||||||
12. Реализация кооперативной многозадачности |
||||||||||
рываний на ассемблере. Примеры. |
|
|
|
|
||||||
в сетевой ОС Novel Net Ware. |
|
|
|
|
|
|||||
|
33. Организация ОС Unix. Основные операции |
|||||||||
13. Реализация |
многозадачности в |
системе |
||||||||
при работе с файлами. |
|
|
|
|
|
|||||
Windows NT/2000/XP. |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
||||
14. Реализация многозадачности в Unix System V |
34. Основные сведения о языках программирова- |
|||||||||
Release 4. |
|
|
|
ния Си и Си++. Примеры. |
|
|
|
|
||
15. Использование функций Win32 API при со- |
35. Набор и вёрстка документов в системе LTEX. |
|||||||||
|
|
|
|
|
|
|
|
A |
|
|
здании многопоточных приложений. Примеры. |
|
|
|
|
A |
|
||||
|
|
|
|
36. Расширение возможностей системы LTEX. |
||||||
16. Работа с потоками в Delphi. Примеры. |
Примеры. |
|
|
|
|
|
92