Форум «Всё о Паскале» _ Теоретические вопросы _ Как скопировать часть экрана в текстовом режиме?
Автор: kornet 11.03.2008 21:16
Здравствуйте! Можно ли как то с помощью процедур Паскаля или ассемблера в текстовом режиме скопировать часть экрана и сохранить её (в графического режиме для этого существует процедура GetImage из модуля Graph)? Заранее спасибо за ответ.
Автор: klem4 11.03.2008 22:28
Используй видеопамять.
Автор: Гость 12.03.2008 2:11
Цитата(klem4 @ 11.03.2008 18:28)
Используй видеопамять.
Спасибо. Я нашёл на форуме несколько тем по поводу использования видеопамяти, но такой способ не работает во FreePascal'e.
type bytear = array [1..4000] of byte; var arr : bytear absolute $B800:$0000;
- не компилируется, компилятор выдает ошибку <Syntax Error, ";" expected but ":" found >. Вопрос: как обратиться к видеопамяти с помощью FreePascal?
Автор: volvo 12.03.2008 2:24
Используя Go32V2 DOSExtender. Иначе FPC не воспринимает привязку Absolute к адресу в памяти, только к другой переменной...
Автор: klem4 12.03.2008 2:45
kornet
Советую покапаться в rtl.pdf, вот что я смог вынести из копания за пару минут:
uses video;
const my_text = 'Hello, World!';
var i: Byte;
begin InitVideo; for i := 1 to length(my_text) do VideoBuf^[i - 1] := ord(my_text[i]) + ($07 shl 8); UpdateScreen(false); DoneVideo; end.
Автор: volvo 12.03.2008 2:50
Кстати, kornet, ты в программе Crt используешь? А то Video можно применять только тогда, когда не используется Crt, иначе будут глюки...
Автор: kornet 12.03.2008 3:46
Цитата(volvo)
Используя Go32V2 DOSExtender. Иначе FPC не воспринимает привязку Absolute к адресу в памяти, только к другой переменной...
Не хочет компилировать в режиме Go32V2 DOSExtender. Жалуется на то, что не может найти модуль System.ppu, хотя он есть в папке FPC\2.2.0\units\i386-win32\rtl и в Directories этот адрес указан. Пишет : PPU Loading D:\FPC\2.2.0\units\rtl\System.ppu. PPU is compiled for other target. test2.pas(1,1) Fatal: Can't find unit System used by program;
Цитата(klem4)
kornet Советую покапаться в rtl.pdf, вот что я смог вынести из копания за пару минут:
Спасибо, почитаю. Этот способ работает.
Цитата(volvo)
Кстати, kornet, ты в программе Crt используешь? А то Video можно применять только тогда, когда не используется Crt, иначе будут глюки...
Вообще то я хочу разработать несколько объектов окон(типа тех, что во FreePascal), чтобы их можно было передвигать, изменять их размеры, закрывать и т.д., для использования в других программах. Для этого, мне и надо, чтобы можно было сохранять часть экрана - для того, чтобы запоминать то, что находится под окном.
Автор: andriano 12.03.2008 12:32
Цитата(kornet @ 11.03.2008 23:46)
Не хочет компилировать в режиме Go32V2 DOSExtender.
Можно отмаппить функциями DPMI область видеопамяти в адресное пространство программы. Но, честное слово, проще это не будет. По сути дела ты ручками сделаешь то, что за тебя делает Go32V2.
Автор: kornet 13.03.2008 0:01
Цитата(andriano)
По сути дела ты ручками сделаешь то, что за тебя делает Go32V2.
Вопрос в том, как сделать так, чтобы FreePascal компилировал в этом режиме? Кидал модуль system.ppu в разные папки, все равно компилятор пишет ту же ошибку, о которой я писал в своём предыдущем посте.
Автор: andriano 13.03.2008 0:34
Цитата(kornet @ 12.03.2008 20:01)
Вопрос в том, как сделать так, чтобы FreePascal компилировал в этом режиме? Кидал модуль system.ppu в разные папки, все равно компилятор пишет ту же ошибку, о которой я писал в своём предыдущем посте.
Нет, сервис DPMI позволяет 32-разрядным программам DOS работать с нижней памятью вообще (например, со звуковым буфером или прерываниями, использующими память, такие как сервис VESA) и видеопамятью в частности. Директива absolute, естественно, при этом работать не будет. Но ведь у тебя задача получить доступ к видеопамяти, а не использовать определенную конструкцию языка.
Автор: kornet 13.03.2008 1:08
Цитата(andriano @ 12.03.2008 19:34)
Нет, сервис DPMI позволяет 32-разрядным программам DOS работать с нижней памятью вообще (например, со звуковым буфером или прерываниями, использующими память, такие как сервис VESA) и видеопамятью в частности. Директива absolute, естественно, при этом работать не будет.
Вообще то я спрашивал, как настроить FreePascal, чтобы он работал в режиме Go32V2 DOSExtender. Но, допустим, я не смогу его настроить. Мог бы ты написать, какими функциями DPMI я должен пользоваться или где я могу про это прочитать. Спасибо.
Автор: volvo 13.03.2008 1:27
Цитата
Вообще то я спрашивал, как настроить FreePascal, чтобы он работал в режиме Go32V2 DOSExtender.
Вообще-то ты толком объясни, чего хочешь-то? Ты хочешь из-под WinNT пользоваться Go32V2? (Компилятор какой качал? Для Win32? Судя по пути, указанному тобой, так и есть...) Не будет этого:
Цитата(Offsite)
The latest release version is 2.0.4 Please keep in mind that this package isn't supposed to work in Windows NT/2000/XP.
, с ним можно работать под чистым ДОСом. Обрати также внимание на соответствие версии компилятора, если у тебя вторая ветка - ты огребешь столько проблем с Go32V2, что лучше и не начинай...
Автор: kornet 13.03.2008 2:14
Цитата(volvo @ 12.03.2008 20:27)
Вообще-то ты толком объясни, чего хочешь-то? Ты хочешь из-под WinNT пользоваться Go32V2? (Компилятор какой качал? Для Win32? Судя по пути, указанному тобой, так и есть...) Не будет этого: , с ним можно работать под чистым ДОСом. Обрати также внимание на соответствие версии компилятора, если у тебя вторая ветка - ты огребешь столько проблем с Go32V2, что лучше и не начинай...
Да, качал для Win32. И хотел бы все программы и модули компилировать в нём. Вобщем, я понял, что для обращения к видеопамяти в Windows легче и лучше всего пользоваться модулем video.ppu, но при этом придется отказаться от использования модуля crt(но судя по тому, что я прочитал в руководстве, в video.ppu имеются те же и другие подпрограммы и переменные, которые есть в crt, и можно пользоваться ими). Спасибо всем, еще раз, за советы.
Автор: andriano 14.03.2008 2:48
Цитата(kornet @ 12.03.2008 22:14)
...что для обращения к видеопамяти в Windows легче и лучше всего...
Нич-чего не понимаю! В Windows обращаться к видеопамяти вообще безыдейно. До сих пор я был уверен, чо речь идет имено о DOS, исходя из этого и писал. В DOS требуется вполне конкретное железо, соответственно, можно гарантировать, что номера регистров, способов работы с ними, адресов видеопамяти и т.п. при работе программы идентичны вне зависимости от того, где и когда бы эта программа ни запускалась. Windows изначально предполагает иное. Поэтому непосредственная работа с видеопамятью - дело гиблое и бесперспективное.
Автор: sheka 19.08.2010 2:24
Цитата
type bytear = array [1..4000] of byte; var arr : bytear absolute $B800:$0000;
Так что, получается этим под виндосом пользоваться нельзя? (у меня ФриПаскаль, ОСь ХРюша или Вин7)
Т.е. надо качать ТП и на ХРюше работать, да?
Автор: volvo 19.08.2010 3:01
Цитата
Так что, получается этим под виндосом пользоваться нельзя?
Получается, что нельзя. Если б ты сразу задал вопрос в разделе "32-битные компиляторы" - тебе бы сразу сказали, что обращение к видеопамяти напрямую - не их сильная черта.