Вопрос № 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