Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Pascal

Выпуск № 96
от 15.11.2005, 20:00

Администратор:Калашников О.А.
В рассылке:Подписчиков: 144, Экспертов: 41
В номере:Вопросов: 1, Ответов: 5


Вопрос № 29324: Здравствуйте! А можно ли как-то написать открывающееся и закрывающееся окно на Turbo Pascal? Такое, как, например, окно подтверждения выхода в FAR'e, или NC... Так, чтобы при закрытии этого окна, тот, текст, что под ним, не стирался?...

Вопрос № 29.324
Здравствуйте!
А можно ли как-то написать открывающееся и закрывающееся окно на Turbo Pascal? Такое, как, например, окно подтверждения выхода в FAR'e, или NC...
Так, чтобы при закрытии этого окна, тот, текст, что под ним, не стирался?
Отправлен: 10.11.2005, 19:58
Вопрос задал: Euphoriz (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: sir henry
Здравствуйте, Euphoriz!
Можно. Для этого надо запомнить тот кусок экрана, который перекрывается окном.
Я, например, это делаю так (пример написан для FreePascal, т.к. TurboPascal в винде с видеопамятью работать не будет):
Type
TScreen = array[1..25] of array[1..80] of record
symbol: char; {Символ изображенный на экране}
Attribute: byte; {Его цветовой аттрибут}
End;
var
videomemory: TScreen absolute $B800:$0000;
{Это переменная содержить ячейки видеопамяти для экрана 80х25}
Procedure SaveScreen(Rect: TRect; var VideoBuf: TSreen);
{Запоминаем часть экрана в буфере}
var
i,j: integer;
Begin
For i:=Rect.A.Y To Rect.B.Y Do
For j:=Rect.A.X To Rect.B.X DO
Begin
VideoBuf[i][j].Symbol:=VideoMemory[i][j].Symbol;
VideoBuf[i][j].Attribute:=VideoMemory[i][j].Attribute;
End;
End;

RestoreScreen(Rect: TRect; VideoBuf: TSreen);
{Восстанавливаем часть экрана из буфера}
var
i,j: integer;
Begin
For i:=Rect.A.Y To Rect.B.Y Do
For j:=Rect.A.X To Rect.B.X DO
Begin
VideoMemory[i][j].Symbol:=VideoBuf[i][j].Symbol;
VideoMemory[i][j].Attribute:=VideoBuf[i][j].Attribute;
End;
End;
Для TurboPascal те же самые действия можно сделать через VideoBIOS. Работает медленнее, но винда эмулирует прерывания Биос вроде как нормально.
Как это делается - честно говоря расписывать неохота. Если Вам очень уж нужно (т.е. Вы ни в какую не хотите использовать современные версии Паскаля), то напишите мне, тогда я Вам распишу.
Примитивное создание окна - это вызов процедуры Window(), рисование по его краям рамочки (лучше вне координат окна). Рамочки рисуются помещением соответствующего символа в видеопамять. Потом обычным способом выводите текст в это окно.
Как оно будет закрываться - полностью на Ваше усмотрение. Информации Вы дали мало (например, используется мышь или нет).
--------------------
Чтобы не париться с написанием примитивов для манипуляции окнами, советую Вам найти в инете Object Professional для TurboPascal. В нем есть модуль OpWindow, как раз для этих целей. Ссылку дать не могу, потому что очень давно плюнул на TurboPascal, так как он в винде сильно глючит.
--------------------
Есть еще пакет TurboVision, там тоже есть средства для работы с окнами, но они сильно сложные. :)
--------------------
Для консольных приложений Дельфи (тот же Паскаль, но без его глюков) можно скачать библиотеку KOL и модуль crt4kol. В этот модуль также включены необходимые средства по работе с окнами и дан простой пример по применению.
Ссылка: bonanzas.rinet.ru
Ответ отправил: sir henry (статус: Академик)
Отправлен: 10.11.2005, 20:53
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое! К сожалению, мне нужно только на Turbo Pascal (не моя воля - институт раритеты заставляет изучать), но, благодаря Вашей подсказке, попробую написать программу.

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

Удачи Вам!
Ответ отправил: Vitava (статус: 2-ой класс)
Отправлен: 10.11.2005, 22:05
Оценка за ответ: 4
Комментарий оценки:
Спасибо, попробую!

Отвечает: Маренич Владимир
Здравствуйте, Euphoriz!
Боюсь, что придется все ручками, а это тема целой статьи, а не ответа на вопрос.
Попробуйте использовать Turbo Vision. В свое время довольно эффективно можно было писать софт под DOS не сильно думая об интерфейсе. Там все это реализовано. Удачи.
Ответ отправил: Маренич Владимир (статус: 5-ый класс)
Отправлен: 11.11.2005, 00:03

Отвечает: Boriss
Здравствуйте, Euphoriz!
Да нет, все просто в Turbo, коей ДОСовский:
Borland Pascal все пишет на первую (с номером 0) текстовую видеостраницу, начинающуюся по адресу B800:0000. Все остальные 7 можно использовать как хочешь (Turbo Vision так и делает)
С помощью move легко реализуется ...

Приложение:

---------
Вывод - то место в тексте, где вы устали думать

Ответ отправил: Boriss (статус: Профессор)
Отправлен: 11.11.2005, 10:56

Отвечает: Vadim Vitomsky
Здравствуйте, Euphoriz!
Лучше всего для этого использовать библиотеку TurboVision, которая входит в дистрибутив начиная от Turbo Pascal 6.0
---------
оЕ ЧУЕ ФП Windows, ЮФП ЧЙУЙФ!
Ответ отправил: Vadim Vitomsky (статус: 2-ой класс)
Отправлен: 11.11.2005, 13:21


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.



© 2001-2005, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100 hotlog_js="1.0"; hotlog_r=""+Math.random()+"&s=314124&im=101&r="+escape(document.referrer)+"&pg="+ escape(window.location.href); document.cookie="hotlog=1; path=/"; hotlog_r+="&c="+(document.cookie?"Y":"N"); hotlog_js="1.1";hotlog_r+="&j="+(navigator.javaEnabled()?"Y":"N") hotlog_js="1.2"; hotlog_r+="&wh="+screen.width+'x'+screen.height+"&px="+ (((navigator.appName.substring(0,3)=="Mic"))? screen.colorDepth:screen.pixelDepth) hotlog_js="1.3" hotlog_r+="&js="+hotlog_js; document.write("HotLog")

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.pasplus
Архив рассылки
Отписаться
Вспомнить пароль

В избранное