-Музыка

 -Подписка по e-mail

 

 -Поиск по дневнику

Поиск сообщений в xpackpackax

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 09.01.2009
Записей:
Комментариев:
Написано: 1835





Секреты «Вконтакте»

Четверг, 17 Сентября 2009 г. 10:45 + в цитатник
Секреты Вконтакте (vkontakte.ru): 0. Узнавайте обо всех событиях сразу!

Хотите сразу узнавать о новых сообщениях, комментариях к вашим фотографиям, новых статусах друзей и многих событиях Вконтакте? Тогда обязательно установите бесплатную программу «Агент Вконтакте». С ее помощью вы запросто сможете менять свой статус, добавлять в друзья, видеть обновления у ваших друзей а также переписываться с ними так, как это происходит, например, в ICQ. Об обновлениях программа сигнализирует специальным окошком в трее (рядом с часами) что очень удобно. При этом программа не нагружает ваш ПК и позволяет использовать прокси (что особенно актуально для тех, кто работает в офисе и не может жить без «Вконтакте»). Скачивайте «Агент Вконтакте» — будьте онлайн!

Секреты Вконтакте (vkontakte.ru): 1. Просмотр закрытых страниц (профилей)

Это один из самых желанных секретов. Ну кто хоть раз не мечтал посмотреть фотографии шикарной незнакомки, при этом не добавляя ее в друзья? А если доступ к ее странице закрыт? Выход есть! Итак, секрет довольно прост. Необходимым условием является открытость фотоальбома, видеозаписей, аудиозаписей, заметок и т.д. Для начала нужно узнать ID пользователя. Как узнать ID «Вконтакте»? Очень просто! ID — это номер, который идет в УРЛ после «http://vkontakte.ru/id». Например у Павла Дурова ID 1, а у меня — 17110449 (добавляйте в друзья, я не против). После того, как вы узнали ID остается только подставить его в нужный УРЛ. Ниже представлен список «секретных» УРЛ для доступа к различным разделам пользователя. Вместо «*» подставляйте ID нужного вам пользователя.

Записи на стене:
http://vkontakte.ru/wall.php?id=*

Фотоальбомы:
http://vkontakte.ru/photos.php?id=*

Видеозаписи:
http://vkontakte.ru/video.php?id=*

Аудиозаписи:
http://vkontakte.ru/audio.php?id=*

Заметки:
http://vkontakte.ru/notes.php?id=*

Группы:
http://vkontakte.ru/groups.php?id=*

Секреты Вконтакте: 2. Специальные символы для «Вконтакте»

Вы, наверное, замечали, что у некоторых пользователей в имени, статусе или просто в профиле имеются прикольные необычные символы. С клавиатуры их, естественно, ввести нельзя, но секрет прост. Эти символы называются специальными и вводятся посредством HTML кода. Узнать какой код для какого символа «Вконтакте» нужен можно тут. По этому адресу вы найдете практически все коды для «Вконтакте».

Секреты Вконтакте: 3. Лишаемся имени (как убрать имя и фамилию)

Многие хотели бы быть инкогнито как в жизни, так и «Вконтакте». Вы все видите, все знаете, а о вас не знает никто. Это возможно! Вы с легкостью можете создать себе аккаунт без имени. Секрет с одним небольшим минусом — для начала вам нужно будет зарегистрироваться заново.

Заново регистрируемся «Вконтакте». Заполняем все поля кроме «Имя» и «Фамилия».
Копируем в адресную строку браузера код: javascript: this.disabled=true; document.regMe.submit();
Нажимаем «Enter» или кнопочку «Переход» в браузере.
Готово! Вы зарегистрированы без имени и фамилии!
Секреты Вконтакте: 4. Становимся невидимым

Еще один способ приблизиться к человеку-невидимке. Благодаря этому секрету вы сможете ходить по страницам социальной сети, а другие пользователи будут думать, что вы в оффлайне. Но при этом нельзя посещать страницу «profile.php», т.е. свой профиль и главные страницы профилей других пользователей. Есть 3 способа, точнее секрета:

Секрет № 1 (подходит только для Firefox)

Вводим в адресную строку Firefox «about:config». Появятся настройки браузера.
Нам нужно временно запретить переадресацию. Для этого в поле «Фильтр» вводим «network.http.redirection-limit» и меняем его значение на 0. У меня по умолчанию он равнялся 20-ти.
Открываем новую вкладку и заходи на страницу http://vkontakte.ru/login.php и вводим логин и пароль.
Появится сообщение об ошибке. Не волнуйтесь, так и должно быть.
Идем на любую другую страницу «Вконтакте» (кроме «profile.php»).
Возвращаемся на вкладку с настройками и обратно меняем параметр «network.http.redirection-limit» на то, что было по умолчанию.
Секрет № 2 (подходит только для Opera)

Заходим в «Инструменты» > «Настройки» > «Дополнительно» > «Сеть».
Убираем галочку «Включить автоматическое перенаправление».
Повторяем действия для браузера Firefox, начиная с 3 пункта.
Секрет № 3 (простой, но требует времени)

Заходим в раздел «Личные сообщения»
Ждем 15 минут (тайм-аут для соединения с «Вконтакте»).
Все готово. Можно перемещаться по страницам социальной сети, кроме «profile.php».
Секрет № 4

Тоже самое можно сделать при помощи программы Vk A-Vision. Речь о программах для «Вконтакте» пойдет в одном из следующих постов. Обязательно подписывайтесь на RSS, чтобы не пропустить.

Секреты Вконтакте: 5. Как жениться на себе

Особой пользы в этом секрете нет, но выделиться перед друзьями все же хочется. Жениться на себе довольно просто. Для началу объясню как это делает в браузере Opera. Заходите на страницу редактирования своего профиля (http://vkontakte.ru/profileedit.php) и открываете исходный код этой страницы. ищите код выпадающего списка и в самом конце добавляете себя . Нажмите «Применить изменения» и на странице редактирования выбираете себя. После чего остается лишь сохранить профайл. Такую же операцию можно проделать и в браузере Firefiox, но для этого вам нужно установить плагин Firebug.

Самые свежие секреты «Вконтакте» здесь! Не пропустите!

Секреты Вконтакте: 6. Отмечаем всех друзей на виде

Отмечать друзей на видео вручную долго и мучительно. Проще сделать это используя следующий секрет. Он содержит всего 4 шага:

Заходим на страницу с нужным видео.
Нажимаем «Отметить».
В адресную строку браузера вставляем скрипт: «javascript:for(blabla=0;blabla<5000;blabla++){ var elem = document.getElementById('f'+blabla); if(elem == null) break; elem.onclick(); }».
Нажимаем «Enter».
Секреты Вконтакте: 7. Отрицательный рейтинг

На мой взгляд абсолютно бесполезная вещь, но все же кому-нибудь может пригодиться. Сначала нужно добиться, чтобы на вашей странице вверху было написано «Информация на данной странице может не соответствовать действительности.» Как это сделать? Просто. Создайте страницу какой-нибудь звезды, выложите парочку фотографий Мерилин Монро и подпишите, что это вы. Профиль должен быть заполнен на 100% — это обязательное условие. Иначе секрет не сработает. Затем отпишитесь в одной из групп, в которых есть модераторы. Как только получите долгожданное сообщение «Информация на данной странице может не соответствовать действительности.» начинайте удалять информацию со страницы. Например, если удалить аватар рейтинг станет -30%.

Секреты Вконтакте: 8. Смена язык

С помощью этого простейшего секрета можно отлично разыграть друга. Суть в следующем: при переходе по ссылке http://vkontakte.ru/?lang=цифра язык меняется с русского на тот, цифру которого вы указали. Русский язык — 0. А дальше экспериментируйте! Не забудьте написать хороший зазывающий текст. Например: «http://vkontakte.ru/?lang=10 — специальная Новогодняя Версия Вконтакте! Заходи — не пожалеешь!».

Секреты Вконтакте: 9. Отменяем заявку на добавление в друзья

Иногда бывает такое: добавили в друзья человека, а потом передумали. Не беда, заявку можно удалить, точнее отменить. Введите в адресную строку браузера http://vkontakte.ru/friend.php?act=remove&id=*, где * — ID ненужного друга. После этого появится сообщение: «Вы точно хотите удалить Имя_друга Фамилия_друга из числа друзей?». Смело нажимайте «Да».

Секреты Вконтакте: 10. Статус на несколько строк

Как и другие секреты, этот довольно прост. Единственное условие — нам нужен браузер Opera. Открываем страницу своего профиля и переходим в режим просмотра исходного кода.Находим следующий кусок кода:

«»

Заменяем его на:

«»

Сохраняем результат. Теперь вы можете писать статус «Вконтакте» в несколько строк.

Секреты Вконтакте: 11. Вставляем музыку в заметку «Вконтакте»

На самом деле очень полезная функция. Если вы храните огромное количество треков, можно создать некое подобие плейлистов при помощи заметок. Нас ждут 5 шагов. Приступим.

Находим нужную нам песню. Сделать это можно по адресу vkontakte.ru/audio.php.
Рядом с песней есть ссылка «Добавить». Копируем ее. Сделать это можно следующий образом: открываете ее в новом окне и сразу останавливаете загрузку страницы. У меня получилась вот такая ссылка: audio.php?act=add&add=1&gid=0&aid=47083679&oid=-4536434&hash=5ba68fca77ce808a3947297722874e55
Копируем из этой ссылки числа, который идет после &oid= и &aid=.
Вставляем эти числа в [[audio*_**]«]», где * — число после &oid, ** — число после &aid.
Вставляем полученный тег в заметку. У меня получилось [[audio-4536434_47083679]]. Все работает.
Секреты Вконтакте: 12. Секреты граффити «Вконтакте»

Часто задавались вопросом как у некоторых пользователей получаются шикарные граффити? Секреты как всегда просты и лежат на поверхности.

Чтобы нарисовать прямые горизонтальные и вертикальные линии нужно переключить управление мыши на дополнительную клавиатуру. Делет это просто комбинацией — Shift+Alt+NumLock.
Работа с масштабом поможет вам лучше прорисовать мелкие детали. Можно увеличить масштаб в браузере а можно воспользоваться стандартной функцией Windows — «Экранная лупа». Чтобы включить ее нужно зайти: Пуск > Все программы > Стандартные > Специальные возможности > Экранная лупа.
Секреты Вконтакте: 13. Следим за людьми

Вы хотели бы знать как часто ваш друг сидит «Вконтакте»? А ваша девушка? А ваши подчиненные, вместо того, чтобы работать? Думаю да. Именно для этого и создан сервис SocialWatch.ru. С помощью этого «секретного» сервиса вы с легкостью сможете проследить за нужными вами людьми. Как обычно все просто: нужно пройти быструю регистрацию, добавить аккаунт нужного вам человека в список и все! Можно следить как много времени человек проводит в социальной сети. Секрет «Вконтакте» раскрыт.

Секреты Вконтакте: 14. Если вам заблокировали «Вконтакте»

Этот секрет будет особенно вам полезен, если у вас на работе или в учебном заведении заблокировали «Вконтакте». Выход как всегда есть. Даже если «Вконтакте» заблокирован все равно можно зайти в социальную сеть, причем двумя разными путями. Самый быстрый и простой способ — скачать программу «Агент Вконтакте» и использовать прокси сервера, которые можно найти в Интернете совершенно бесплатно. Второй способ — вход через анонимайзер. Некоторые анонимайзеры также могут быть заблокированы, но я думаю из предложенного ниже списка один рабочий точно найдется.

www.proxya.ru
www.hidemyass.com
www.proxyfoxy.com
www.iternovus.com
www.proxyguy.com
www.proxyhero.com
www.shadowsurf.com
www.timp.ru/content/view/59/68/
mecto.net/cgi-bin/pro.cgi
www.proxy.dnsserv.ru/
www.kproxy.com/
browseatwork.com/

Проблема с заблокированным «Вконтакте» решена.

Секреты Вконтакте: 15. Узнать автора анонимного мнения

Сразу стоит оговориться, что этот секрет работает не всегда. Но попробовать можно. Итак, чтобы узнать автора анонимного мнения «Вконтакте» требуется:

В Разделе “Предложения” создаем новое предложение. Постарайтесь придумать что-нибудь интересное.
После этого включаем “Предложения” в разделе “Мои Настройки”.
Отправляем автору мнения следующую ссылку http://vkontakte.ru/matches.php?act=a_sent&to_id=***&dec=1, где *** — ваш ID «Вконтакте». Как узнать ID я уже писал выше. Ссылка должная «комплектоваться» интересным текстом, чтобы аноним кликнул по ней.

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

Секреты Вконтакте: 16. Как посмотреть закрытые фотографии «Вконтакте»

Это свежий секрет, который стал известен после Нового Года. Алгоритм действий следующий:

Включаем свежеиспеченную функцию — «Ускоренный режим просмотра фотографий».
Идем в раздел «Фотографии на которых отмечен пользователь» (нужно чтобы он был открыт). Обычно там большинство фотографий закрыты для просмотра.
Выбираем фотографию, которая открыта и дальше уже стрелочками или кликом по фотографии как обычно просматриваем альбом. Все закрытые фотографии будут вам видны.
Этот секрет «Вконтакте» работает благодаря новой функциий «Ускоренный режим просмотра фотографий», которая реализована немного криво.

Не забудьте поделиться ссылкой на пост секреты «Вконтакте» с вашими друзьями — они будут благодарны.

Если вы знаете еще какие-нибудь секреты «Вконтакте» — не стесняйтесь, пишите мне в личные сообщения «Вконтакте». Затем они будут добавлены в этот пост. Секретная информация о vkontakte.ru также не помешает.

http://koreps.ru/sekrety-vkontakte/



Процитировано 5 раз

Без заголовка

Четверг, 10 Сентября 2009 г. 17:10 + в цитатник
Меню

Стандартная программа содержит поле MenuBar типа ТМепиВаr. По умолчанию Метод TApplicatlon.InitMenuBar устанавливает это поле в NIL, что означает отказ от меню. Если Вы хотите использовать меню в Вашей программе, необходимо перекрыть этот метод. В следующем примере создается двухуровневое меню, показанное на рис.23. 1.



Рис. 23.1. Двухуровневое меню

Опцию «Подменю...» можно выбрать следующими способами:
нажатием клавиш F10 - <смещение указателя> - Enter;
командой Alt-S;
отметкой мышью.

Опции «Первый выбор» и «Второй выбор» можно выбрать клавишами F1 и F2 без развертывания подменю. После развертывания подменю можно использовать те же клавиши, а также использовать клавиши с цифрами 1 и 2, отметку мышью или смещение указателя к нужной опции и Enter. Опция «Третий выбор» доступна только после развертывания подменю. Выбор каждой из этих трех опций приводит к появлению на экране окна с сообщением. Кроме того, опция «Третий выбор» попеременно запреща-ет или разрешает действие команд cm1, cm2 и cmQuit.

{$X+}

Uses Objects,App,Menus,Drivers,Views,MsgBox;

type

MyApp = object (TApplication)

Procedure InitMenuBar; Virtual;

Procedure HandleEvent(var Event: TEvent); Virtual;

end;

const

cm1 = 201;

cm2 = 202;

cm3 = 203;

{----------------}

Procedure MyApp. InitMenuBar;

var

R: TRect;

begin

GetExtent (R) ;

R.B.Y := succ(R.A.Y) ;

MenuBar := New ( PMenuBar , Init(R,

NewMenu ( {Главная полоса меню}

NewSubMenu ( {Первый элемент главного меню}

' ~S~ Подменю. ..', hcNoContext,

NewMenu ( {Определить выпадающее подменю}

NewItem( '~1~ Первый выбор ' , ' F1 ' , kbF1, cm1, 0,

NewItem('~2~ Второй выбор' , ' F2 ' , kbF2, cm2, 0,

NewLine( {Определить разделяющую линию}

NewItem('~3~ Третий выбор' , ' ' , 0, cm3, 0,

NIL) ) ) ) ) ,

NewItem( {Второй элемент главного меню}

'-ESO Выход' , '~ESC~' , kbEsc,cmQuit, 0, NIL))))); end {MyApp. InitMenuBar} ;

{------------------}

Procedure MyApp . HandleEvent ;

const

Flag: Boolean = True;

cms = [cm1, cm2, cmQuit] ;

begin

Inherited HandleEvent (Event) ;

case Event . Command of

cm1: MessageBox (#3 'Первый выбор', NIL,0);

cm2 : MessageBox (#3 'Второй выбор', NIL,0);

cm3 :

begin

MessageBox (#3' Третий выбор', NIL,0);

if Flag then

DisableCommands (cms)

else

EnableCommands (cms) ;

Flag := not Flag

end

end

end {MyApp .HandleEvent } ;

{------------------}

var

P: MyApp;

begin

P.Init;

P.Run;

P.Done

end.

Без заголовка

Четверг, 10 Сентября 2009 г. 17:09 + в цитатник
Строка статуса

В следующей программе создается строка статуса, содержание которой зависит от установленного контекста подсказки (определяется значением поля TProgram.HelpCtx). В зависимости от действий пользователя эта строка будет содержать текст

Esc Выход F1 Сменить контекст на 1

Однажды в студеную, зимнюю пору

либо

ESC Выход F2 Сменить контекст на 0

Я из лесу вышел. Был сильный мороз...

Переключение строки осуществляется клавишами F1 и F2, для выхода из программы используется клавиша Esc.

Uses Objects,App,Menus,Drivers,Views;

type

PMyStatusLine = TMyStatusLine;

TMyStatusLine = object (TStatusLine)

Function Hint(Cntx: Word): String; Virtual;

end;

MyApp = object (TApplication)

StatLine: PMyStatusLine;

Constructor Init;

Procedure InitStatusLine; Virtual;

Procedure HandleEvent(var Event: Tevent); Virtual;

end;

const

cmCntxl =200;

cmCntx2 = 201;

{-----------------}

Constructor MyApp.Init ;

begin

Inherited Init;

Insert (StatLine) {Использовать нестандартную строку статуса}

end {MyApp .Init} ;

Procedure MyApp. Ini tstatusLine ;

{Инициация нестандартного поля MyApp. StatLine}

var

R: Trect;

begin

GetExtent (R) ;

R.A.Y := pred(R.B.Y) ;

StatLine := New(PMyStatusLine, Init(R,

NewStatusDef (0, 0, {Первый вариант строки}

NewStatusKey ( ' ~Esc~ Выход1 , kbEsc, cmQuit,

NewStatusKey (' ~F1~ Сменить контекст на 1', kbF1 , cmCntxl , NIL) ) ,

NewStatusDef (1, 1, {Второй вариант строки}

NewStatusKey (' ~Esc~ Выход ', kbEsc, cmQuit,

NewStatusKey (' ~F2~ Сменить контекст на 0 ' , kbF2 , cmCntx2 , NIL)) ,

NIL) ) ) ) ; end {MyApp. Ini tstatusLine} ;

{--------------------}

Procedure MyApp. HandleEvent;

{Переключение контекста и обновление строки статуса}

begin

Inherited HandleEvent (Event) ;

case Event . Command of

cmCntxl: HelpCtx := 1;

cmCntx2: HelpCtx := 0;

else

ClearEvent (Event) ;

end;

if Event. What <> evNothing then

begin

StatLine. Update;

ClearEvent (Event)

end

end {MyApp . HandleEvent } ;

{---------------------}

Function TMyStatusLine. Hint (Cntx: Word):String;

{Переключение поля подсказки}

const

Prompt: array [0..1] of String =(

'Однажды в студеную, зимнюю пору',

'Я из лесу вышел. Был сильный мороз...');

begin

Hint : = Prompt [Cntx]

end {TMyStatusLine.Hint} ;

{---------------------}

var

P : MyApp ;

begin

P.Init;

P . Run ;

P . Done

end .

Без заголовка

Четверг, 10 Сентября 2009 г. 17:08 + в цитатник
Другие методы

Порядок вызова наследуемого метода зависит от конкретного алгоритма. В большинстве случаев наследуемый метод вызывается первым, но могут использоваться и другие последовательности. Особое значение имеет вызов наследуемого обработчика событий HandleEvent. В самом общем виде структура нового обработчика будет такой:

Procedure MyObject.HandleEvent(var Event: TEvent);

begin

{Изменение наследуемых свойств}

{Вызов наследуемого обработчика}

{Добавление новых свойств}

end;

Таким образом, вначале Вы должны запрограммировать те действия, которые изменяют стандартное поведение перекрытого обработчика, затем вызвать его и, наконец, осуществить новую обработку событий. Разумеется, любая из этих трех частей может отсутствовать. Например, стандартный обработчик TDialog.HandleEvent лишь расширяет свойства наследуемого метода TWindow.HandleEvent, добавляя в него обработку событий от клавиатуры и событий-команд:

Procedure TDialog.HandleEvent(var Event: TEvent);

begin

Inherited HandleEvent(Event);

case Event.what of

evKeyDown:

.....

evCommand:

.....

end ;

end;

Этот обработчик перехватывает все события от клавиатуры и мыши, в том числе и нажатие на клавишу Tab. Если Вы хотите обработать событие от клавиши Tab особым способом, Вы должны перехватить это событие до вызова стандартного обработчика. Например:

Procedure TNoTabsDialog.HandleEvent(var Event: TEvent);

begin

if (Event.What = evKeyDown) then

if (Event.KeyCode = kbTab) or

(Event.KeyCode = kbShiftTab) then

ClearEvent(Event); Inherited HandleEvent(Event);

end;

Без заголовка

Четверг, 10 Сентября 2009 г. 17:08 + в цитатник
Деструктор

Вызывайте наследуемый метод после реализации дополнительных действий:

Procedure MyObject.Done;

begin

{Реализация дополнительных действий}

{Вызов наследуемого деструктора Done}

end;

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

Без заголовка

Четверг, 10 Сентября 2009 г. 17:07 + в цитатник
Конструктор

Вызывайте наследуемый Метод до реализации дополнительных действий:

Procedure MyObject.Init(.....);

begin

{Вызов наследуемого конструктора Init}

{Реализация дополнительных действий}

end;

Такая последовательность необходима по той простой причине, что вызов наследуемого конструктора приводит к обнулению всех дополнительных полей объекта MyObject. Если, например, Вы используете следующий фрагмент программы:

type

MyObject = object (TWindow)

Value: Word;

Ok : Boolean;

Constructor Init(var Bounds: TRect; ATitle: TTitleStr;

AValue: Word; AOk: Boolean);

end;

Constructor MyObject.Init;

begin

Inherited Init(Bounds, ATitle, wnNoNumber);

Value := 16;

Ok := True;

end;

то дополнительные поля Value и Ok получат нужные значения 16 и True. Однако, если обращение TWindow.Init (Bounds, ATitle, wnNoNumber); поставить после оператора Ok := True, в них будут помещены значения 0 и False. Из этого правила существует одно исключение, связанное с загрузкой коллекции из потока конструктором Load. Дело в том, что в наследуемом методе TCollection.Load реализуется следующий цикл:

Constructor TCollection.Load (var S: TStream);

begin

.....

for I := 0 to Count - 1 do

AtPut(I, GetItem(S));

end;

Если элементами коллекции являются произвольные наборы двоичных данных (не объекты), Вам потребуется перед чтением очередного элемента сначала получить из потока его длину. Следующий пример иллюстрирует сказанное.

type

PDataCollection = ATDataCollection;

TDataCollection = object (TStringCollection)

ItemSize: Word;

Constructor Load(var S: TStream);

Function GetItem(var S: TStream): Pointer; Virtual;

.....

end;

Constructor TDataCollection.Load(var S: TStream);

begin

S.Read(ItemSize, SizeOf(ItemSize));

Inherited Load(S);

end;

Function TDataCollection.GetItem(var S: TStream): Pointer;

var

Item: Pointer;

begin

GetMem(Item, ItemSize);

S.Read(Item, ItemSize);

GetItem := Item;

end;

В этом примере конструктор Load сначала загружает из потока поле ItemSize, содержащее длину читаемого элемента. Затем вызывается конструктор TCollection.Load, в котором осуществляется вызов GetItem. Новый GetItem использует поле ItemSize, чтобы определить размер читаемых данных, и резервирует нужный буфер в динамической памяти. Разумеется, запись полиморфных коллекций в поток должна происходить в том же порядке, т.е. сначала записывается длина очередного элемента, а уже потом - его данные.

Без заголовка

Четверг, 10 Сентября 2009 г. 17:06 + в цитатник
Порядок вызова наследуемого метода

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

Без заголовка

Четверг, 10 Сентября 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, т.к. модуль Арр, в котором находится этот метод, сделан в программе оверлейным.

Без заголовка

Четверг, 10 Сентября 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);{Верхний правый угол}

New(H, Init(R));{Создаем окно контроля}

P.Insert(H);{Помещаем его на экран}

ReadLn; {Пауза - показываем начальный размер кучи}

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

W := New(PWindow,Init(R,'',0)); {Создаем окно}

R.Assign(5,3,55,12);

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

W.Insert(G); {Вставляем в окно группу}

DeskTop.Insert(W); {Выводим на экран}

Н.Update; {Обновляем окно контроля}

ReadLn; {Пауза - размер кучи перед освобождением}

Dispose(W, Done); {Освобождаем окно и группу}

НА.Update; {Обновляем окно контроля}

ReadLn; {Пауза - размер после освобождения}

Р.Done

end.

Для получения текущего значения общего размера кучи используется вызов метода THeapView.Update в нужных местах программы. Вы можете автоматизировать обновление окна контроля, если включите вызов Update в перекрываемый метод TProgramIdle. В следующем варианте показан способ отображения MemAvail в фоновом режиме. Кроме того, в программе иллюстрируется возможное использование функции MessageBox.

{$Х+} {Используется расширенный синтаксис вызова функции MessageBox}

Uses Objects,Views,App,HeapView,MsgBox;

type

MyApp = object (TApplication)

Procedure Idle; Virtual;

end;

var

H: PHeapView;

Procedure MyApp.Idle;

begin

H^.Update

end;

var

W: PWindow;

G: PGroup;

R: TRect;

P: MyApp;

begin

P.Init;

R.Assign(70,0,80,1);

New(H,Init(R));

P.Insert(H);

MessageBox(#3'Размер кучи до размещения',NIL,0);

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

W := New(PWindow, Init(R,'',0));

R.Assign(5,3,55,12) ;

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

WA.lnsert(G);

DeskTop.Insert(W);

MessageBox(#3'Размер кучи после размещения', NIL,0);

Dispose(W, Done);

MessageBox(#3'Размер кучи после освобождения', NIL,0);

Р.Done

end.

Константа #3 вставляется в начало строки сообщения в том случае, когда требуется центрировать эту строку (расположить ее симметрично относительно границ окна сообщения).

Без заголовка

Четверг, 10 Сентября 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, Вы можете программировать, не заботясь о многочисленных проверках - методы сделают это за Вас.

Без заголовка

Четверг, 10 Сентября 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 только тем, что выделяет память, выровненную на границу параграфа (на границу сегмента).

Без заголовка

Четверг, 10 Сентября 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 (Сбой аппаратуры).

Без заголовка

Четверг, 10 Сентября 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.

Без заголовка

Четверг, 10 Сентября 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;{Черный}

Blue = 1;{Темно-синий}

Green = 2 ;{Темно-зеленый}

Cyan = 3;{Бирюзовый}

Red = 4 ;{Красный}

Magenta = 5;{Фиолетовый}

Brown = 6 ;{Коричневый}

LightGray = 7;{Светло-серый}

DarkGray = 8;{Темно-серый}

LightBlue = 9;{Синий}

LightGreen = 10;{Светло-зеленый}

LightCyan = 11;{Светло-бирюзовый}

LightRed = 12;{Розовый}

LightMagenta = 13;{Малиновый}

Yellow = 14;{Желтый}

White ' =15;{Белый}

Blink =128;{Мерцание символа}

Следующая программа иллюстрирует цветовые возможности Турбо Паскаля.

Uses CRT;

const

Col: array [1..15] of String [16] =

('темно-синий','темно-зеленый','бирюзовый','красный',

'фиолетовый','коричневый','светло-серый','темно-серый',

'синий','зеленый','светло-бирюзовый','розовый',

'малиновый','желтый','белый');

var

k: Byte;

begin

for k := 1 to 15 do

begin {Выводим 15 сообщений различными цветами}

TextColor(k);

WriteLn('Цвет ', k, ' - ',Col[k])

end;

TextColor(White+Blink); {Белые мигающие символы}

WriteLn('Мерцание символов');

{Восстанавливаем стандартный цвет}

TextColor(LightGray);

WriteLn

end.

Обратите внимание на последний оператор WriteLn: если его убрать, режим мерцания символов сохранится после завершения программы, несмотря на то, что перед ним стоит оператор

TextColor(LightGray)

Дело в том, что все цветовые определения предварительно заносятся в специальную переменную TextAttr модуля CRT и используются для настройки адаптера только при обращении к процедурам Write/WriteLn.

Процедура ClrScr.

Очищает экран или окно (см. ниже процедуру Window). После обращения к ней экран (окно) заполняется цветом фона и курсор устанавливается в его левый верхний угол. Например:

Uses CRT;

var

С: Char

begin

TextBackground(red) ;

ClrScr;{Заполняем экран красным цветом}

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

С := ReadKey; {Ждем нажатия любой клавиши}

TextBackground(Black) ;

ClrScr {Восстанавливаем черный фон экрана}

end.

Процедура Window.

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

Procedure Window(XI,Y1,X2,Y2: Byte);

ЗдесьX1...Y2 - координаты левого верхнего (XI,Y1) и правого нижнего (X2,Y2) углов окна. Они задаются в координатах экрана, причем левый верхний угол экрана имеет координаты (1,1), горизонтальная координата увеличивается слева направо, а вертикальная - сверху вниз.

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

Uses CRT;

var

k: integer;

begin

{Создаем левое окно -желтые символы на синем фоне:}

TextBackground(Blue);

Window(5,2,35,17);

TextColor(Yellow);

for k := 1 to 100 do

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

ReadLn; {Ждем нажатия Enter}

ClrScr; {Очищаем окно}

{Создаем правое окно - белые символы на красном фоне:}

TextBackground(Red);

TextColor(White);

Window(40,2,70,17);

for k := 1 to 100 do

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

ReadLn;

TextMode(C080) {Сбрасываем все установки}

end.

Обращение к процедуре Window игнорируется, если какая-либо из координат выходит за границы экрана или если нарушается одно из условий: Х2>Х1 и Y2>Y1. Каждое новое обращение к Window отменяет предыдущее определение окна. Границы текущего окна запоминаются в двух глобальных переменных модуля CRT: переменная WindMin типа Word хранит X1 и Y1 (XI - в младшем байте), а переменная того же типа WindMax - Х2 и Y2(X2 - в младшем байте). При желании Вы можете изменять их нужным образом без обращения к Window. Например, вместо оператора

Window(40,2,70,17);

можно было бы использовать два оператора

WindMin := 39+(1 shl 8);

WindMax := 69+(16 shl 8);

(в отличие от обращения к Window координаты, хранящиеся в переменных WindMin и WindMax, соответствуют началу отсчета 0,0).

Процедура GotoXY.

Переводит курсор в нужное место экрана или текущего окна. Заголовок процедуры:

Procedure GotoXY(X,Y: Byte);

Здесь X, Y - новые координаты курсора. Координаты задаются относительно границ экрана (окна), т.е оператор

GotoXY(1,1);

означает указание перевести курсор в левый верхний угол экрана (или окна, если к этому моменту на экране определено окно). Обращение к процедуре игнорируется, если новые координаты выходят за границы экрана (окна).

Функции whereX и WhereY.

С помощью этих функций типа Byte можно определить текущие координаты курсора: WhereX возвращает его горизонтальную, a WhereY - вертикальную координаты.

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

Uses CRT;

const

LU =#218;{Левый верхний угол рамки}

RU =#191;{Правый верхний угол)}

LD =#192;{Левый нижний}

RD =#217;{Правый нижний}

H =#196;{Горизонтальная черта}

V =#179;{Вертикальная черта}

X1 =14;{Координаты окна}

Y1 =5;

X2 =66;

Y2 =20;

Txt = 'Нажмите клавишу Enter...';

var

k: integer;

begin

ClrScr; {Очищаем экран}

{Создаем окно в центре экрана - желтые символы на синем фоне:}

TextBackground(Blue);

TextColor(Yellow);

Window(X1,Y1,X2,У2);

ClrScr;

{Обводим окно рамкой}

Write(LU); {Левый верхний угол}

{Горизонтальная линия}

for k: = X1+1 to X2-1 do Write(H);

Write(RU);{Верхний правый угол}

for k := Y1+1 to Y2-1 do{Вертикальные линии}

begin

GotoXY(1,k-Y1+1);{Переходим к левой границе}

Write(V);{Левая черта}

GotoXY(X2-X1+1,WhereY){Правая граница}

Write(V){Правая черта}

end;

Write(LD);

{Левый нижний угол}

Window(X1,Y1,X2,Y2+1);{Расширяем вниз на одну строку координаты окна, иначе вывод в правый нижний угол вызовет прокрутку окна вверх}

GotoXY(2,Y2-Y1+1); {Возвращаем курсор из левого верхнего угла окна на нужное место}

{Горизонтальная рамка}

for k:= X1+1 to X2-1 do Write(H);

Write(RD); {Правый нижний угол}

{Определяем внутреннюю часть окна}

Window(X1+1,Y1+1,X2-1,Y2-1);

{Выводим левый столбец}

for k := Y1+1 to Y2-2 do

WriteLn('Левый столбец, строка ',k-Y1);;

{Ждем нажатия любой клавиши}

Write('Нажмите любую клавишу...');

k := ord(ReadKey); if k=0 then

k := ord(ReadKey);

DelLine; {Стираем приглашение}

{Выводим правый столбец}

for k := Y1+1 to Y2-2 do

begin

GotoXY((X2-X1) div 2,k-Y1);

Write('Правый столбец, строка ',k-Y1)

end ;

{Выводим сообщение и ждем нажатия клавиши Enter}

GotoXY((X2-X1-Length(Txt)) div 2,Y2-Y1-1);

TextColor(White);

Write(Txt);

ReadLn;

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

TextMode(CO80)

end.

Три следующие процедуры без параметров могут оказаться полезными при разработке текстовых редакторов.

Процедура ClrEOL.

Стирает часть строки от текущего положения курсора до правой границы окна (экрана). Положение курсора не меняется.

Процедура DelLine.

Уничтожает всю строку с курсором в текущем окне (или на экране, если окно не создано). При этом все строки ниже удаляемой (если они есть) сдвигаются вверх на одну строку.

Процедура InsLine.

Вставляет строку: строка с курсором и все строки ниже ее сдвигаются вниз на одну строку; строка, вышедшая за нижнюю границу окна (экрана), безвозвратно теряется; текущее положение курсора не меняется.

Процедуры LowVideo, NormVideo и HighVideo.

С помощью этих процедур без параметров можно устанавливать соответственно пониженную, нормальную и повышенную яркость символов. Например:

Uses CRT;

begin

LowVideo;

WriteLn('Пониженная яркость');

NormVideo;

WriteLn('Нормальная яркость');

HighVideo;

WriteLn('Повышенная яркость')

end.

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

Процедура AssignCRT.

Связывает текстовую файловую переменную F с экраном с помощью непосредственного обращения к видеопамяти (т.е. к памяти, используемой адаптером для создания изображения на экране). В результате вывод в такой текстовый файл осуществляется значительно (в 3...5 раз) быстрее, чем если бы этот файл был связан с экраном стандартной процедурой Assign. Заголовок процедуры:

Procedure AssignCRT(F: Text);

В следующей программе измеряется скорость вывода на экран с помощью стандартной файловой процедуры и с помощью непосредственного обращения к видеопамяти. Вначале файловая переменная F связывается «медленной» процедурой Assign со стандартным устройством CON (т.е. с экраном) и подсчитывается количество N1 циклов вывода некоторого текста за 5*55 = 275 миллисекунд системных часов. Затем файловая переменная связывается с экраном с помощью процедуры быстрого доступа AssignCRT и точно так же подсчитывается количество N2 циклов вывода. В конце программы счетчики N1 и N2 выводятся на экран.

Замечу, что показания системных часов хранятся в оперативной памяти компьютера в виде четырехбайтного слова по адресу [$0040:$006С] и наращиваются на единицу каждые 55 миллисекунд.

Uses CRT;

var

F: Text;

t: LongInt;{Начало отсчета времени}

N1,N2: Word;{Счетчики вывода}

const

txt = ' Text';

begin

{----- Стандартный вывод в файл -----}

Assign(F,'CON');

Rewrite(F);

N1 := 0;{Готовим счетчик вывода}

ClrScr;{Очищаем экран}

{Запоминаем начальный момент:}

t := MemL[$0040:$006C];

{Ждем начала нового 55-мс интервала, чтобы исключить погрешность в определении времени:}

while MemL[$0040:$006C]=t do;

{Цикл вывода за 5 интервалов}

while MemL[$0040:$006С]

Без заголовка

Четверг, 10 Сентября 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 Расширенные коды клавиш

Casual &#10006;обнова&#10006; Кэжуал

Воскресенье, 09 Августа 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

Фильмы

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

Футболки

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

Заставки

Воскресенье, 09 Августа 2009 г. 19:05 + в цитатник
Лучшие заставки на рабочий стол для вашего компьютера!
Оживите свой рабочий стол одной из отличных прекрасно анимированных заставок. Огромных архив разбит на категории, в каждой из которых собраны заставки на определенную тему, что делает поиск подходящего материала легким и удобным.
Посетите http://screensaver-planet.com чтобы сделать свой компьютер красочным и, тем самым, поднять себе настроение :)

Мир экзотики

Воскресенье, 09 Августа 2009 г. 14:51 + в цитатник
"Мир экзотики" открывает новый салон цветов в центре Москвы. В магазине царит дух солнечных стран и тропической экзотики.


http://www.zakaz-buketa.ru

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

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

http://www.exotic-world.ru

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

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

http://www.bonsa.ru


Поиск сообщений в xpackpackax
Страницы: 24 ... 18 17 [16] 15 14 ..
.. 1 Календарь