• Авторизация


Без заголовка 10-09-2009 17:06


Порядок вызова наследуемого метода

Большая часть объектов Turbo Vision спроектирована в расчете на их дальнейшее перекрытие в прикладных программах. Типичным примером такого рода объектов является TView, метод Draw которого создает на экране пустой прямоугольник и, следовательно, не может отображать никакой полезной информации. Поскольку все видимые элементы порождены от TView, Вам необходимо перекрыть метод Draw в собственном объекте-потомке. Более того, поскольку TView.Draw не делает никакой полезной работы, его не нужно вызывать в перекрытом методе. Однако полностью перекрываемые методы, подобные TView.Draw, скорее исключение из общего правила. Обычно в перекрытом методе вызывается соответствующий метод, наследуемый от родителя, т.к. в нем реализуются некоторые необходимые для потомка действия. В такого рода ситуациях важна последовательность вызова наследуемого метода: вызывать ли его до реализации специфичных действий или после? Ниже приводятся практические рекомендации на этот счет.
комментарии: 0 понравилось! вверх^ к полной версии
Без заголовка 10-09-2009 17:05


Использование оверлея

Модули Turbo Vision разработаны с учетом возможного использования их в оверлейных программах. Все они могут быть оверлейными за исключением модуля Drivers, который содержит процедуры обработки прерываний и другой системный интерфейс низкого уровня.

При разработке оверлейных программ старайтесь спроектировать логические последовательности вызовов тех или иных модулей так, чтобы по возможности уменьшить свопинг (динамический обмен оверлеев). Поскольку программы Turbo Vision рассчитаны на интенсивное использование диалога с пользователем, размещайте (если это возможно) все процедуры, связанные с некоторой точкой диалога, в том же модуле, в котором создается и исполняется соответствующий модальный элемент. Например, используемые в программе диалоговые окна, как правило, порождаются от TDialog, а диалоговые элементы этих окон - от TInputLine и TListViewer. Если Вы поместите все три порожденных типа в один модуль, Ваша программа будет исполняться быстрее, так как взаимосвязанные вызовы объектов не будут приводить к свопингу оверлеев.

Заметим, что размеры всех основных оверлейных модулей - Арр, Objects, Views, Menus приблизительно одинаковы и составляют около 50 Кбайт. С учетом Ваших собственных объектов, обеспечивающих интенсивное взаимодействие с пользователем и порожденных от TWindow или TDialog, типичный размер оверлейного буфера составит не менее 64 КБайт. Если Вы хотите минимизировать потери времени на свопинг и в то же время создать достаточно компактную программу, Вам придется поэкспериментировать с размером оверлейного буфера и/или испытательной зоны. Вы можете также возложить на пользователя Вашей программы ответственность за выбор размера оверлейного буфера, предусмотрев соответствующий параметр в строке вызова программы.

В следующем примере показан возможный способ инициации оверлея.

{$F+,0+,S-}

{$М 8192,65536,655360}

Uses Overlay, Drivers, Memory, Objects, Views, Menus,

Dialogs,istList, StdDlg, App;

{Объявляем оверлейные модули:}

{$0 App }

{$O Dialogs }

{$0 HistList }

{$0 Memory }

{$0 Menus }

{$0 Objects }

{$0 StdDlg }

{$O Views }

const

OvrBufDisk=96*1024;{Размер буфера без EMS-памяти}

OvrBufEMS=72*1024;{Размер буфера при использовании EMS-памяти}

type

ТМуАрр = object (TApplication)

Constructor Init; Destructor Done; Virtual;

.....

end; {TMyApp}

Procedure InitOverlays;

var

FileName: String [79] ;

begin

FileName := ParamStr(0);

Ovrlnit(FileName) ;

if OvrResult <> 0 then

begin

PrintStr('Невозможно открыть оверлейный файл ', FileName);

Halt;

end;

OvrinitEMS;

if OvrResult = 0 then OvrSetBuf(OvrBufEMS)

else

begin

OvrSetBuf(OvrBufDisk) ;

OvrSetRetry(OvrBufDisk div 2);

end

end; {InitOverlays}

Constructor TMyApp.Init;

begin

InitOverlays;

TApplication.Init;

.....

.....

end; {TMyApp.Init}

Destructor TMyApp.Done;

begin

.....

.....

TApplication.Done;

end; {TMyApp.Done}

var

MyApp: TMyApp;

begin

MyApp.Init;

MyApp.Run;

MyApp. Done;

end.

В этой программе используется механизм размещения оверлеев в исполняемом EXE-файле. Для этого после компиляции программы используйте команду ДОС

copy/b MyProg.exe+MyProg.ovr MyProg.exe

Чтобы определить маршрут поиска EXE-файла, в процедуре InitOverlays проверяется параметр вызова с номером 0. Заметим, что в этот параметр автоматически помещается маршрут доступа к загруженной программе только в том случае, когда Ваш ПК работает под управлением MS-DOS версии 3.0 и выше.

Обратите внимание: размер оверлейного буфера можно сделать меньшим, если программа обнаружит доступную EMS-память, ведь в этом случае потери времени на свопинг будут минимальными. Разумеется, инициация оверлея осуществляется до обращения к TApplication.Init, т.к. модуль Арр, в котором находится этот метод, сделан в программе оверлейным.
комментарии: 0 понравилось! вверх^ к полной версии

Без заголовка 10-09-2009 17:05


Отладка программ

Если Вы пытались отлаживать какую-либо программу в Turbo Vision, Вы наверняка убедились, что трассировка (пошаговое прослеживание логики работы) таких программ весьма неэффективна. Вызвано это двумя обстоятельствами. Во-первых, значительная часть библиотеки Turbo Vision скрыта от Вас: библиотека поставляется в TPU-файлах, прослеживание работы которых невозможно. Во-вторых, в Turbo Vision используется принцип отделения логики создания видимых элементов от логики обработки связанных с ними событий: как только видимый элемент активизируется вызовом Execute, начинает работать его метод HandleEvent, который может породить целую цепочку непрослеживаемых трассировкой действий программы.

Ключом к решению проблемы отладки программ в Turbo Vision является расстановка точек контроля в наследуемых методах HandleEvent. Если программа не хочет открывать диалоговое окно или не реагирует на нажимаемую кнопку, следует прежде всего убедиться в том, что Ваши действия действительно порождают нужное событие.

Может случиться, что установленная контрольная точка не будет реагировать вообще или, наоборот, будет активизироваться слишком часто. Если точка не активизируется, это означает, что Ваш обработчик событий просто «не видит» событие. В этом случае необходимо убедиться в том, что поле EventMask видимого объекта содержит маску, позволяющую ему реагировать на событие нужного вида. Другой причиной «исчезновения» события может быть его перехват (и обработка) другим видимым элементом. Это может быть вызвано различными обстоятельствами. Например, Вы могли ошибочно связать две разные команды с одной константой или используете команду, которую использует также другой видимый элемент. Кроме того, обычно в наследуемых методах HandleEvent вызывается обработчик событий объекта-родителя, который может «украсть» событие у Вашего обработчика. В таких ситуациях бывает достаточно сделать вызов родительского метода после того, как событие будет обработано Вами.

Если контрольная точка активизируется слишком часто, значит Вы установили ее неправильно. Например, если Вы установили эту точку внутри метода TGroup.Execute, точка будет непрерывно активизироваться, т.к. значительная часть времени работы программы тратится на ожидание события. Если Вам все-таки требуется установить контрольную точку именно в этом месте, сделайте ее условной, чтобы она не реагировала на пустые или ненужные события.

Иногда запущенная программа «зависает», т.е. перестает реагировать на любые действия пользователя. Такие ошибки отлаживать труднее всего. Если программа «зависла», попытайтесь прежде всего локализовать то место, в котором это происходит. Для этого обычно используется расстановка контрольных точек в подозрительных местах программы. Следует помнить, что в Turbo Vision «зависания» связаны в основном с тремя видами ошибок:
освобождается динамический объект, который входил в состав ранее освобожденной динамической группы;
читаются данные из потока в ошибочно зарегистрированный объект (объект имеет неуникальный регистрационный номер);
элемент коллекции ошибочно трактуется как элемент другого типа. Ошибки первого вида встречаются наиболее часто. Например, прогон следующего невинного на первый взгляд варианта программы приводит к зависанию:

Uses Objects,Views;

var

G1, G2: PGroup;

R: TRect;

begin

R.Assign(10,5,70,20) ;

Gl := New(PGroup, Init(R));

R.Grow(-10, -3) ;

G2 := New(PGroup, Init(R));

G1.Insert(G2);

Dispose(G1, Done);

Dispose(G2, Done) {Здесь программа "зависнет"!}

end.

Заметим, что перестановка операторов Dispose местами приводит к корректному варианту, т.к. метод G1.Done умеет контролировать освобождение своего подэлемента G2 и не освобождает его вторично. Во всех случаях оператор Dispose (G2, Done) излишен: освобождение группы вызывает автоматическое освобождение всех ее подэ-лементов.

Поскольку динамическая память используется в Turbo Vision очень интенсивно, полезно предусмотреть в отладочном варианте программы визуализацию ее размера. Для этого можно использовать такой объект THeapView:

Unit HeapView;

Interface

Uses Dialogs,Objects;

type

PHeapView = THeapView;

THeapView = object(TStaticText)

Constructor Init(var R: TRect);

Procedure Update;

end;

Implementation

Constructor THeapView.Init;

var

S: String;

begin

Str(MemAvail,S);

Inherited lnit(R,#3+S)

end;

Procedure THeapView.Update;

var

S: String;

begin

Str(MemAvail,S);

DisposeStr(Text);

Text := NewStr(#3+S);

Draw

end;

end.

Например, в следующей программе показан способ включения контрольного окна, создаваемого в этом объекте, в верхний правый угол экрана:

Uses Objects,Views,App, HeapView;

var

H: PHeapView;{Окно для MemAvail}

W: PWindow;

G: PGroup;

R: TRect;

P: TApplication;{Стандартная программа}

begin

P.Init;

R.Assign(70,0,80,1);{Верхний
Читать далее...
комментарии: 0 понравилось! вверх^ к полной версии
Без заголовка 10-09-2009 17:04


Обработка ошибок инициации и модальных состояний

Каждый видимый элемент наследует виртуальный метод TView.Valid (Command: Word): Boolean. С помощью этого метода решаются две задачи: если параметр обращения Command = cmValid = О, метод должен проверить правильность инициации объекта и выдать True, если инициация прошла успешно; при обращении с параметром Command о cmValid метод возвращает True только тогда, когда модальное состояние диалогового элемента можно завершить командой Command. По умолчанию метод Valid возвращает True. Вы должны перекрыть этот метод, если хотите автоматизировать контроль за инициацией объекта и/или за завершением работы модального элемента.

Поскольку метод Valid автоматически вызывается из метода ValidView, в нем нет необходимости контролировать правильность использования кучи - это делает ValidView. С другой стороны, в методе Valid можно проверить другие условия правильного функционирования объекта. Например, если в объекте используется дисковый файл, можно проверить существование этого файла.

Типичный метод Valid имеет такой вид:

Function TMyView. Valid (Command: Word): Boolean;

begin

Valid := True;

{Проверяем корректность инициации:}

if Command = cmValid then

if not Correctlylnit then

begin

ReportErrorlnit; {Сообщяем о некорректной инициации}

Valid := False

end

else

{Проверяем корректность завершения:}

else if Command <> EnableCommand then

begin

ReportErrorEnd {Сообщяем о некорректном выходе}

Valid := False

end

end;

В этом фрагменте предполагается, что результат проверки правильности создания элемента возвращается в логической переменной Correctlylnit, проверка корректности завершения работы модального элемента осуществляется сравнением команды завершения с ожидаемой командой EnableCommand, а сообщения об обнаруженных отклонениях от нормы выдаются процедурами ReportErrorInit и ReportErrorEnd. Заметим, что сообщения об ошибках инициации, не связанных с динамическим распределением объекта в куче, реализуются в методе Valid, в то время как сообщения об ошибках кучи - в методе ValidView.

Если видимый элемент - модальный, метод Valid перекрывается также для того, чтобы сообщить вызывающей программе о том, будет ли корректным в данном контексте завершение модального состояния командой Command или нет. Таким способом можно, например, перехватить выход из окна редактора в случае, если в нем остался несохраненный в файле текст. Разумеется, в подобной ситуации программа может не только выдать сообщение пользователю, но и предпринять необходимые действия для корректного завершения работы модального элемента. Метод Valid автоматически вызывается методом Execute модального элемента перед завершением работы.

Перекрытие методов Valid особенно полезно на этапе создания сложных программ: автоматический вызов проверки состояния используемого видимого элемента и выдача исчерпывающей диагностики могут дать неоценимую помощь программисту. Если Вы перекрываете методы Valid, Вы можете программировать, не заботясь о многочисленных проверках - методы сделают это за Вас.
комментарии: 0 понравилось! вверх^ к полной версии
Без заголовка 10-09-2009 17:03


Контроль за динамической памятью

Как правило, объекты в Turbo Vision размещаются в куче. Это отвечает специфике диалоговых программ: на этапе разработки программист обычно не может учесть все возможные действия пользователя программы. Чтобы не накладывать неестественные ограничения на те или иные ее возможности, не следует злоупотреблять статическими определениями объектов, так как в этом случае программа не сможет гибко учитывать специфические требования пользователя.

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

В Turbo Vision имеются средства, упрощающие этот контроль: глобальная функция LowMemory будет возвращать True, если размер свободного участка кучи стал слишком мал (по умолчанию меньше 4 Кбайт). Таким образом, вместо того, чтобы контролировать кучу перед каждым обращением к New, можно обратиться к функции LowMemory перед началом размещения динамического объекта или сразу после того, как объект размещен в куче. Если LowMemory возвращает True, дальнейшая работа с кучей возможна только после ее очистки. Резервный участок кучи длиной в 4 Кбайт называется пулом надежности. Предполагается, что его размеры достаточны для размещения любого объекта Turbo Vision, поэтому обычно контроль с помощью LowMemory осуществляется сразу после процедуры динамического размещения нового видимого элемента.

В следующем примере создается простое диалоговое окно:

Uses Memory,...;{Функция LowMemory определена в модуле Memory}

.....

R.Assign(20,3,60,10);

D := New(Dialog, Init(R, 'Диалоговое окно'));

with D do

begin

R.Assign(2,2,32,3);

Insert(New(PStaticText, Init(R, 'Сообщение-вопрос')));

R.Assign(5,5,14,7);

Insert(New(PButton, Init(R, '~Y~es (Да)', cmYes)));

RAssign(16,5,25,7);

Insert(New(PButton, Init(R, ' ~N~o (Нет)', cmNO)))

end;

if LowMemory then

begin

Dispose(D,Done); {Нет памяти: удаляем распределение}

OutOfMemory; {Сообщаем об этом}

DoIt := False {Признак ошибки}

end

else

Dolt := DeskTop.ExecView(D)=cmYes;

Если Вы используете вызов LowMemory сразу после динамического размещения объекта, то в ходе самого размещения не должен произойти аварийный останов, связанный с нехваткой памяти. Таким образом, размер пула надежности должен быть достаточным для размещения всего объекта. Переменная LowMemSize задает размер пула надежности в параграфах (участках, длиной по 16 байт). По умолчанию она имеет значение 4096 div 16 = 256, т.е. размер пула надежности составляет 4 Кбайт.

На практике вместо прямого обращения к LowMemory чаще используется вызов метода TProgram.ValidView (P: Pointer): Pointer. Этот метод получает в качестве параметра обращения указатель Р на динамический объект и осуществляет следующие действия:
если Р = NIL, метод возвращает NIL;
если LowMemory = True, метод освобождает память, связанную с Р, вызывает метод TProgram.OutOfMemory и возвращает NIL;
если обращение к методу TView. Valid (cm Valid) дает False (см. ниже), объект Р удаляется из кучи и метод ValidView возвращает NIL;
в противном случае считается, что размещение осуществлено успешно, и метод возвращает значение указателя Р.

Метод TProgram.ValidView осуществляет стандартные действия по контролю надежности использования кучи. Обычно его используют перед тем, как поместить новый видимый элемент в группу, например:

DeskTop.Insert(ValidView(New(TMyWindow, Init(...))));

Заметим, что нехватка памяти вызывает обращение к виртуальному методу OutOfMemory, предназначенному для выдачи сообщения о ненормальной ситуации. По умолчанию этот метод ничего не делает и просто возвращает управление вызывающей программе. Вы должны перекрыть его, если хотите сообщить пользователю о возникшей проблеме.

В ряде случаев может оказаться полезной глобальная функция Function MemAlloc (Size: Word): Pointer, которая осуществляет те же действия, что и New или GetMem, но в отличие от них не распределяет пул надежности. Функция возвращает указатель на выделенную область кучи или NIL, если в куче нет свободного блока нужного размера. Аналогичные действия осуществляет функция MemAllocSeg, отличающаяся от MemAlloc только тем, что выделяет память, выровненную на границу параграфа (на границу сегмента).
комментарии: 0 понравилось! вверх^ к полной версии
Без заголовка 10-09-2009 16:59


Ошибки ввода-вывода


Если один из операторов компилировался с директивой {$I+}, то ошибка ввода-вывода приводит к прекращению выполнения программы. В состоянии {$I-} программа продолжает выполняться, а ошибка возвращается функцией IORESULT.

100 Disk read error (Ошибка чтения с диска).

Генерируется процедурой READ в типизированном файле в случае, если Вы пытаетесь осуществить считывание из полностью прочитанного файла.

101 Disk write error (Ошибка записи на диск).

Ошибка генерируется процедурами CLOSE, WRITE, WRITELN, FLUSH в случае, если диск заполнен.

102 File not assigned (Файлу не присвоено имя).

Ошибка генерируется процедурами RESET, REWRITE, APPEND, RENAME и ERASE в случае, если файловой переменной не было присвоено имя файла с помощью обращения к процедуре ASSIGN.

103 File not open (Файл не открыт).

Ошибка генерируется процедурами CLOSE, READ, WRITE, SEEK, EOF, FILEPOS, FILESIZE, FLUSH, BLOCKREAD, BLOCKWRITE в случае, если файл не открыт.

104 File not open for input (Файл не открыт для ввода).

Ошибка генерируется процедурами READ, READLN, EOF, EOLN, SEEKEOF или SEEKEOLN в текстовом файле в случае, если файл не открыт для ввода.

105 File not open for output (Файл не открыт для вывода).

Ошибка генерируется процедурами WRITE или WRITELN в текстовом файле в случае, если файл не открыт для вывода.

106 Invalid numeric format (Неверный числовой формат).

Генерируется процедурами READ или READLN в случае, если числовое значение, считанное из текстового файла, не соответствует правильному числовому формату.



Критические ошибки

150 Disk is write protected (Диск защищен от записи).

151 Unknown unit (Неизвестный модуль).

152 Drive not ready (Дисковод находится в состоянии «не готов»).

153 Unknown command (Неопознанная команда).

154 CRC error in data (Ошибка в исходных данных).

155 Bad drive requiest structure length (При обращении к диску указана неверная длина структуры).

156 Disk seek error (Ошибка при операции установки головок на диске).

157 Unknown media type (Неизвестный тип носителя).

158 Sector not found ЦСектор не найден).

159 Printer out of paper (Кончилась бумага на принтере).

160 Device write fault (Ошибка при записи на устройство).

161 Device read fault (Ошибка при чтении с устройства).

162 Hardware failure (Сбой аппаратуры).
комментарии: 0 понравилось! вверх^ к полной версии
Без заголовка 10-09-2009 16:58


Программирование звукового генератора

Звуковые возможности ПК основаны на одноканальном управляемом звуковом генераторе, вырабатывающем электромагнитные колебания звуковой частоты. Колебания подаются на встроенный в ПК динамик и заставляют его звучать.

В модуль CRT включены три процедуры, с помощью которых Вы сможете запрограммировать произвольную последовательность звуков.

Процедура Sound.

Заставляет динамик звучать с нужной частотой. Заголовок процедуры:

Procedure Sound(F: Word);

Здесь F - выражение типа Word, определяющее частоту звука в герцах. После обращения к процедуре включается динамик и управление немедленно возвращается в основную программу, в то время как динамик будет звучать впредь до вызова процедуры NoSound.

Процедура No Sound.

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

Процедура Delay.

Обеспечивает задержку работы программы на заданный интервал времени. Заголовок процедуры:

Procedure Delay(T: Word);

Здесь Т - выражение типа Word, определяющее интервал времени (в миллисекундах), в течение которого задерживается выполнение следующего оператора программы.

Для генерации звукового сигнала обычно используется вызов описанных процедур по схеме Sound-Delay-NoSound. Следующая программа заставит ПК воспроизвести простую музыкальную гамму. Используемый в ней массив F содержит частоты всех полутонов в первой октаве от «до» до «си». При переходе от одной октавы к соседней частоты изменяются в два раза.

Uses CRT;

const

F: array [1..12] of Real =

(130.8, 138.6, 146.8, 155.6, 164.8, 174.6, 185.0, 196.0, 207.7, 220.0,

233.1, 246.9);{Массив частот 1-й октавы}

Temp = 100;{Темп исполнения}

var

k,n: Integer;

begin

{Восходящая гамма}

for k := 0 to 3 do for n := 1 to 12 do

begin

Sound(Round(F[n]*(1 shl k) )) ;

Delay(Temp);

NoSound

end ;

{Нисходящая гамма}

for k := 3 downto 0 do

for n := 12 downto 1 do

begin

Sound(Round(F[n]*(1 shl k)) ) ;

Delay(Temp);

NoSound

end

end.
комментарии: 0 понравилось! вверх^ к полной версии
Без заголовка 10-09-2009 16:57


Текстовый вывод на экран

Библиотека Turbo Vision способна удовлетворить самым высоким требованиям и я настоятельно рекомендую обращаться к ней при программировании сложных текстовых изображений (меню, окон и т.п.). Тем не менее вполне возможно, что некоторые из читателей захотят использовать значительно более простые, но достаточно эффективные средства модуля CRT, описываемые в этом разделе.

Используемое в ПК устройство визуального отображения информации - дисплей -состоит из двух основных частей: монитора, содержащего экран (электронно-лучевую трубку или жидкокристаллическую панель) с необходимыми компонентами (устройствами развертки изображения), и блока управления, который чаще называют дисплейным адаптером или просто адаптером. Обычно оба устройства согласуются друг с другом, но в отдельных случаях этого согласования может не быть (например, цветной монитор может работать с монохромным адаптером и наоборот). Будем считать оба устройства согласованными, поэтому, говоря о различных дисплеях, я буду говорить только о различных адаптерах, так как именно в них сосредоточены основные отличия дисплеев друг от друга.

Исторически первым адаптером (1981 г.), использованным на IBM PC, был так называемый монохромный адаптер (MDA). Его возможности очень скромны: он позволял выводить только текстовые сообщения в одном из двух форматов - 25 строк по 40 или по 80 символов в строке. Символы выводились в прямом изображении (светлые символы на темном фоне), причем их ширина оставалась одинаковой в обоих режимах, поэтому при выводе в режиме 40x25 использовалась только левая половина экрана. В MDA применялись два символьных шрифта - обычный и с подчеркиванием.

В 1982 году фирма Hercules выпустила адаптер HGC (от англ. Hercules Graphics Card - графическая карта Геркулес), который полностью эмулировал MDA в текстовом режиме, но в отличие от него мог еще воспроизводить и графические изображения с разрешением 720x350 точек (пикселей).

Примерно в это же время IBM выпустила цветной графический адаптер CGA (Color Graphics Adapter) и впервые на экране ПК появился цвет. CGA позволял выводить как текстовые сообщения, так и графические изображения (с разрешением 320x200 или 640x200 пикселей). В текстовом режиме выводились 40x25 или 80x25 символов как в монохромном, так и в цветном изображениях. При использовании монохромного режима символы, в отличие от MDA, не могли подчеркиваться, зато их можно было

выводить в негативном изображении (черные символы на светлом фоне). При выводе в цветном режиме использовалось 16 цветов для символов и 8 - для окружающего их фона.

Текстовые возможности CGA стали стандартом де-факто и поддерживаются во всех последующих разработках IBM - адаптерах EGA, MCGA, VGA и SVGA. Возможности модуля CRT рассматриваются применительно к адаптерам этого типа.

Процедура TextMode.

Используется для задания одного из возможных текстовых режимов работы адаптера. Заголовок процедуры:

Procedure TextMode(Mode: Word);

Здесь Mode - код текстового режима. В качестве значения этого выражения могут использоваться следующие константы, определенные в модуле CRT:

const

BW40=0{Черно-белый режим 40x25}

Со40=1{Цветной режим 40x25}

BW80=2{Черно-белый режим 80x25}

Со80=3{Цветной режим 80x25}

Mono=7{Используется с MDA}

Font8x8=256{Используется для загружаемого шрифта в режиме 80х43

или 80х50 с адаптерами EGA илиVGA}

Код режима, установленного с помощью вызова процедуры TextMode, запоминается в глобальной переменной LastMode модуля CRT и может использоваться для восстановления начального состояния экрана.

Следующая программа иллюстрирует использование этой процедуры в различных режимах. Замечу, что при вызове TextMode сбрасываются все ранее сделанные установки цвета и окон, экран очищается и курсор переводится в его левый верхний угол.

Uses CRT;

Procedure Print(S: String);

(Выводит сообщение S и ждет инициативы пользователя}

begin

WriteLn(S); {Выводим сообщение}

WriteLn('Нажмите клавишу Enter...');

ReadLn {Ждем нажатия клавиши Enter}

end; {Print}

var

LM: Word;{Начальный режим экрана}

begin

LM := LastMode; {Запоминаем начальный режим работы дисплея}

TextMode(Со40);

Print('Режим 40x25");

TextMode(CoSO) ;

Print('Режим 80x25');

TextMode(Co40+Font8x8);

Print('Режим Co40+Font8x8') ;

TextMode(Co80+Font8x8);

Print('Режим Co80+Font8x8');

{Восстанавливаем исходный режим работы:}

TextMode(LM)

end.

Процедура TextColpr.

Определяет цвет выводимых символов. Заголовок процедуры:

Procedure TextColor(Color: Byte);

Процедура TextBackground.

Определяет цвет фона. Заголовок:

Procedure TextBackground(Color: Byte);

Единственным параметром обращения к этим процедурам должно быть выражение типа Byte, задающее код нужного цвета. Этот код удобно определять с помощью следующих мнемонических констант, объявленных в модуле CRT:

const

Black = 0;{Черный}
Читать далее...
комментарии: 0 понравилось! вверх^ к полной версии
Без заголовка 10-09-2009 16:56


Программирование клавиатуры

Дополнительные возможности управления клавиатурой реализуются двумя функциями: KeyPressed и ReadKey.

Функция KeyPressed.

Возвращает значение типа Boolean, указывающее состояние буфера клавиатуры: False означает, что буфер пуст, a True - что в буфере есть хотя бы один символ, еще не прочитанный программой.

В MS-DOS реализуется так называемый асинхронный буферизованный ввод с клавиатуры. По мере нажатия на клавиши соответствующие коды помещаются в особый буфер, откуда они могут быть затем прочитаны программой. Стандартная длина буфера рассчитана на хранение до 16 кодов символов. Если программа достаточно долго не обращается к клавиатуре, а пользователь нажимает клавиши, буфер может оказаться переполненным. В этот момент раздается звуковой сигнал и «лишние» коды теряются. Чтение из буфера обеспечивается процедурами Read/ReadLn и функцией ReadKey. Замечу, что обращение к функции KeyPressed не задерживает исполнения программы: функция немедленно анализирует буфер и возвращает то или иное значение, не дожидаясь нажатия клавиши.

Функция ReadKey.

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

Пусть, например, в какой-то точке программы необходимо игнорировать все ранее нажатые клавиши, коды которых еще не прочитаны из буфера, т.е. необходимо очистить буфер. Этого можно достичь следующим способом:

Uses CRT;

var

С: Char;

begin

while KeyPressed do

С := ReadKey;

.......

end.

При использовании процедуры ReadKey необходимо учесть, что в клавиатурный буфер помещаются так называемые расширенные коды нажатых клавиш. Если нажимается любая алфавитно-цифровая клавиша, расширенный код совпадает с ASCII-кодом соответствующего символа. Например, если нажимается клавиша с латинской буквой «а» (в нижнем регистре), функция ReadKey возвращает значение chr (97), а если «А» (в верхнем регистре) - значение chr (65). При нажатии функциональных клавиш F1...F10, клавиш управления курсором, клавиш Ins, Home, Del, End, PgUp, PgDn в буфер помещается двухбайтная последовательность: сначала символ #0, а затем расширенный код клавиши. Таким образом, значение #0, возвращаемое функцией ReadKey, используется исключительно для того, чтобы указать программе на генерацию расширенного кода. Получив это значение, программа должна еще раз обратиться к функции, чтобы прочитать расширенный код клавиши.

Т.е. код сканирования клавиши. Этот код определяется порядком, в соответствии с которым микропроцессор клавиатуры Intel 8042 периодически опрашивает (сканирует) состояние клавиш.

Следующая простая программа позволит Вам определить расширенный код любой клавиши. Для завершения работы программы нажмите клавишу Esc.

Uses CRT;

var

С: Char;

begin

repeat

С := ReadKey;

if C<>#0 then

WriteLn(ord(C))

else

WriteLnCO1 ,ord(ReadKey) :8)

until C=#27 {27 - расширенный код клавиши Esc}

end.

Если Вы воспользуетесь этой программой, то обнаружите, что нажатие на некоторые клавиши игнорируется функцией ReadKey. Это прежде всего так называемые сдвиговые клавиши - Shift, Ctrl, Alt. Сдвиговые клавиши в MS-DOS обычно используются для переключения регистров клавиатуры и нажимаются в сочетании с другими клавишами. Именно таким способом, например, различается ввод прописных и строчных букв. Кроме того, функция игнорирует переключающие клавиши Caps Lock, Num. Lock, Scroll Lock, а также «лишние» функциональные клавиши F11 и F12 клавиатуры IBM AT, не имеющие аналога на клавиатуре ранних моделей IBMPC/XT (в этих машинах использовалась 84-клавишная клавиатура, в то время как на IBM AT - 101-клавишная).

В табл. 13.1 приводятся расширенные коды клавиш, возвращаемые функцией ord(ReadKey). Для режима ввода кириллицы приводятся коды, соответствующие альтернативному варианту кодировки.

Таблица 13.1 Расширенные коды клавиш
комментарии: 0 понравилось! вверх^ к полной версии
Casual &#10006;обнова&#10006; Кэжуал 09-08-2009 19:31


Aquascutum, Ben Sherman, Burberry, Ellesse, FCUK, Fred Perry, Hackett, Henri Lloyd, Timberland, Кappa, Lacoste, Lambretta, Hackett, Levi`s, Lonsdale, Pringle, Everlast, Umbro, Merc, Pringle, bench, Ralph Lauren, Puma, Paul&Shark, Stone Island, Ted Baker, Tom Tailor, Tommy Hilfiger, Boxfresh, Rockport, Abercrombie And Fitch, evisu, fake london, firetrap, french connection, marco polo, Diesel, FjallRaven, gant, Rockport, Adidas, Reebok, Hugo Boss, Burberrys, C.P. Company, Carhartt, Cheap Monday, D&G, DAKS, Diadora, DKNY, Duck And Cover, Duffer, FCUK, FILA, Umbro, Kickers, Le Coq Sportif, One True Saxon, OTS, Lyle & Scott, Pepe Jeans, Pepe Jeans London, Thomas Burberry, YvesSaintLaurent, PAUL FRANK, ADDICT,

кажуал одежда, кэжуал шмот. импровизированный интернет-магазин http://vkontakte.ru/id20922354
одежда кэжуал, покупка, продажа, обмен
casual
комментарии: 1 понравилось! вверх^ к полной версии
Фильмы 09-08-2009 19:25


Вы можете скачать новые фильмы прямо сейчас без регистрации!
Сайт очень удобен в обращении: создана отличная система поиска, с которой приятно работать; можно искать фильмы по жанру или дате выпуска. Я, например, мистику люблю. Хочу посмотреть "Зеркала". Не очень свежий, ноя его ещё не видел :)
Кстати там же можно почитать отзывы о фильмах от зрителей, если сомневаетесь при выборе. А также можно написать свой отзыв, чтобы помочь другим)
фильмы скачать без регистрации
комментарии: 2 понравилось! вверх^ к полной версии
Футболки 09-08-2009 19:11


Удивите друзей, порадуйте себя, заказав классные футболки прямо сейчас! Хорошее качество и доступные цены обрадуют!
Интернет-магазин футболок с прикольными рисунками, надписями, фото. Футболки с героями любимых мультфильмов. Нанесение любых изображений на футболку. Эксклюзивная дизайнерская футболка на заказ. Художественная роспись по ткани. Доставка по всей России. Бесплатная доставка по Санкт-Петербургу.
комментарии: 0 понравилось! вверх^ к полной версии
Заставки 09-08-2009 19:05


Лучшие заставки на рабочий стол для вашего компьютера!
Оживите свой рабочий стол одной из отличных прекрасно анимированных заставок. Огромных архив разбит на категории, в каждой из которых собраны заставки на определенную тему, что делает поиск подходящего материала легким и удобным.
Посетите http://screensaver-planet.com чтобы сделать свой компьютер красочным и, тем самым, поднять себе настроение :)
комментарии: 0 понравилось! вверх^ к полной версии
Мир экзотики 09-08-2009 14:51


"Мир экзотики" открывает новый салон цветов в центре Москвы. В магазине царит дух солнечных стран и тропической экзотики.


http://www.zakaz-buketa.ru

Для покупателей предоставлен большой выбор крупномерных растений: Большие пальмы, плодовые деревья, различная редкая экзотика), большой выбор цветущих растений, таких как орхидеи, пассифлоры, муррайа и другие интересные комнатные растения. Вы можете приобрести комнатный лимон со съедобными плодами и угощать потом гостей чаем с собственными лимонами или кумкват, чьи плоды отлично помогают справиться с синдромом похмелья. А комнатные ананасы прекрасно вызревают на подоконнике и имеют отменный вкус!

Для тех кто хочет сделать необычные подарки или хочет сделать свой интерьер неповторимым представлен огромный выбор бонсай - карликовых деревьев. Среди бонсай можно встретить как простые комнатные виды для начинающих, так и уличные бонсай, а для более "продвинутых" ценителей этого изящного искусства представлены коллекционные виды деревьев, чей возраст достигает полувека!
Так же вы можете приобрести новинку этого сезона - красивые комнатные грибы Лингжи, которые могут находится в любом месте квартиры и практически не требуют ухода.

http://www.exotic-world.ru

Особое внимание так же следует уделить огромному выбору срезанных цветов и букетов, которые хранятся в большой витринной холодильной камере. Ассортимент срезанных цветов составляет ежедневно около 2000 позиций. Цветы поставляются 2 раза в неделю из стран Европы (Голландии, Дании и Италии), а так же Эквадора и Колумбии.

Адрес магазина цветов - ул. Садовая-Самотечная, д. 9 (м. Цветной бульвар). В любое удобное для Вас время можно оформить доставку цветов или растений по указанному Вами адресу. Если вы окажетесь рядом - непременно загляните в салон цветов "Мир Экзотики" полюбоваться красотами настоящей экзотики!

http://www.bonsa.ru
комментарии: 0 понравилось! вверх^ к полной версии
Потерпевший признался в оговоре осужденного мэра Тамбова 09-08-2009 14:49


Потерпевший по делу осужденного на девять с половиной лет бывшего мэра Тамбова Максима Косенкова добровольно явился в прокуратуру и заявил, что оговорил подсудимого, сообщает "Интерфакс".

В прокуратуре Ленинского района Тамбова агентству подтвердили, что 7 августа Виталий Бабий явился в сопровождении адвоката и подал соответствующее заявление. По информации источников агентства, Бабий заявил, что "его замучила совесть". По словам Бабия, он оговорил Косенкова под давлением некого сотрудника правоохранительных органов.

Прокурор Оксана Галкина сообщила агентству, что изложенные в заявлении доводы будут проверены и "получат надлежащую оценку". В прокуратуре уточнили, что если информация об оговоре подтвердится, Бабию грозит до пяти лет лишения свободы за лжесвидетельство.

Отбывающий срок в одной из мордовских колоний Косенков был задержан 16 апреля 2008 года в Москве. Его обвинили в похищении неработающего гражданина Украины Виталия Бабия, 1988 года рождения.

18 апреля Симоновский суд санкционировал арест Косенкова и его водителя Виталия Сычева. Третьим подозреваемым по делу был также задержанный неработающий житель Твери Максим Миронов.

Косенкова обвинили в том, что он вместе с сообщниками похитил в Москве, перевез в Тамбов и там насильно удерживал гражданина Украины Виталия Бабия. 19 января Нагатинский суд Москвы приговорил Косенкова к девяти с половиной годам лишения свободы в колонии строгого режима.

На суде Косенков своей вины не признал, он также опровергал версию об интимной связи с потерпевшим. Более того, адвокаты бывшего мэра Тамбова заявили, что Бабий, которого Косенков взял на работу "присматривать за домашними животными" в феврале 2008 года исчез, "прихватив из дома Косенкова 100 тысяч рублей и золотой слиток".

Двое других подсудимых также были признаны виновными в похищении человека. Сычева приговорили к 10 годам лишения свободы в колонии особого режима, а Миронова - к семи годами и семи месяцам в колонии строгого режима.


**
dane4ka.ru – обычный блог обо всем на свете в лучших традициях рунета ;)
Cкандалы, слухи, расследования.
комментарии: 1 понравилось! вверх^ к полной версии
Обои 09-08-2009 14:45


Обои не просто так делают с разными узорчиками, орнаментами и т.п. Всё это сделано с одной целью - чтобы каждый день при взгляде на стену у человека поднималось настроение. Но, к сожалению, менять их часто не получается. И, к счастью, обои рабочего стола компьютера меняются за считанные клики мышкой, то есть всего за несколько секунд. Таким образом мы можем менять "главную картинку компьютера" по много раз на день в зависимости от настроения. Единственное, что может помешать, это маленький запас этих самых картинок, и вот тогда на помощь приходит http://top-desktop.ru/!
Огромный выбор обоев на одном сайте. Каталог разделен на несколько групп по сюжетам обоев, что делает поиск подходящей картинки очень удобным. Пополните свою коллекцию прямо сейчас!
обои для рабочего стола
комментарии: 0 понравилось! вверх^ к полной версии
Значеиние имени 09-08-2009 14:35


Чтобы узнать историю своего имени или своей фамилии теперь не обязательно сидеть в библиотеках и расспрашивать своих бабушек. Теперь в интернете есть специальный сервис, который раскроет вам все тайны вашего имени. Теперь вы можете создать семейную летопись или построить древо. Можно объединять деревья и находить своих родственников!
Начните с малого - узнайте происхождение фамилии своей семьи, это уже откроет для вас много нового.
Посетите http://www.genway.ru/lib/ прямо сейчас и поделитесь впечатлениями с друзьями прямо сейчас!
комментарии: 0 понравилось! вверх^ к полной версии
Мебель 09-08-2009 14:02


Современный интернет магазин http://www.internetmagazin-mebel.ru/ для современных квартир и офисов.
Благодаря новым технологиям легко манипулировать даже самыми большими мебельными конструкциями, в связи с этим можно использовать пространство помещения наиболее рационально. Для изготовления используется только экологически чистые материалы.
Огромный выбор гостиных модулей, мебели для спален, детских комнат и т.д.
Ознакомьтесь и каталогами магазина прямо сейчас!
комментарии: 0 понравилось! вверх^ к полной версии
Зароботок 09-08-2009 13:46


Многие осуждают блоггеров за размещение рекламы на своих страничках. Сколько людей, столько и мнений, это понятно. Я, например, не вижу здесь ничего грешного. Если у тебя есть хороший сайт или блог, абсолютно нормально пользоваться этим. Для себя я могу сравнить это с музыкой: если хорошая группа делает по-настоящему стоящие песни, но не записывает их, это, в первую очередь, неуважение к своему собственному творчеству. Так же должна работать и интернет собственность, я думаю. Зачем отвергать неплохой заработок так ещё и ругаться на людей за это?
Для тех, кто интересуется таким видом заработка, существует грамотная статья "Как заработать 18000 долларов в месяц с помощью сайта или блога". В отличии от тысяч статей, где вам обещают моментальную баснословную прибыль, в этой статье всё логично и последовательно. Читайте, думайте, делайте выводы для себя.
http://homebiz.ru/
комментарии: 2 понравилось! вверх^ к полной версии
Тольятти 6 августа 07-08-2009 16:36


Работники крупнейшего российского автопроизводителя ОАО "АвтоВАЗ" в четверг выйдут на митинг в Тольятти, организованный независимым профсоюзом "Единство", протестуя против остановки конвейера в августе и сокращения рабочей недели с сентября, сообщил РИА Новости руководитель профсоюза Петр Золотарев.

"Поводом для митинга послужили последние решения руководства "АвтоВАЗа" об остановке конвейера и еще большем сокращении рабочей недели в сентябре. Цель митинга - выразить мнение тольяттинцев о последствиях этих решений", - сказал Золотарев.

Правление ОАО "АвтоВАЗ" 22 июля приняло решение об остановке конвейера на заводе на весь август. Причиной стало снижение потребительского спроса на "вазовские" автомобили и нестабильная социальная обстановка на предприятии. С сентября на "АвтоВАЗе" планируется введение сокращенной рабочей недели. Такие меры вызвали общественный резонанс в Тольятти и, по оценке экспертов, усилили социальную напряженность в городе и на местном рынке труда. Независимый профсоюз "АвтоВАЗа" "Единство" подал заявку в мэрию Тольятти о проведении 6 августа митинга. Администрация разрешила проведение мероприятия.

По словам организаторов митинга, в нем смогут принять участие не только работники "АвтоВАЗа", но и любой житель Тольятти, а также представители предприятий-поставщиков завода. При этом Золотарев высказывал опасения, что проведение митинга "могут запретить или разогнать его участников силовыми методами".

Представители правоохранительных органов Самарской области заявили, что при соблюдении порядка и требований ФЗ-54 (закона "О собраниях, митингах, демонстрациях, шествиях и пикетированиях") "никто не собирается ограничивать участников акции и тем более пресекать силовым методом".

По данным Ассоциации европейского бизнеса, продажи автомобилей "АвтоВАЗа" за пять месяцев 2009 года сократились на 45% по сравнению с аналогичным периодом 2008 года - до 151,02 тысячи машин.

ОАО "АвтоВАЗ" - одно из крупнейших предприятий автомобильной отрасли Восточной Европы, его производственные мощности позволяют выпускать свыше 800 тысяч автомобилей в год. С 1970 по 2009 годы предприятие изготовило более 25 миллионов автомобилей Lada и автокомплектов. В настоящее время продукцией "АвтоВАЗа" являются автомобили массового производства в ценовом диапазоне от 150 тысяч до 350 тысяч рублей. На конвейерах "АвтоВАЗа" выпускается 15 моделей пяти основных семейств Lada.
комментарии: 0 понравилось! вверх^ к полной версии