Помощь - Поиск - Пользователи - Календарь
Полная версия: Как скопировать часть экрана в текстовом режиме?
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
kornet
Здравствуйте! Можно ли как то с помощью процедур Паскаля или ассемблера в текстовом режиме скопировать часть экрана и сохранить её (в графического режиме для этого существует процедура GetImage из модуля Graph)? Заранее спасибо за ответ.
klem4
Используй видеопамять.
Гость
Цитата(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
Используя Go32V2 DOSExtender. Иначе FPC не воспринимает привязку Absolute к адресу в памяти, только к другой переменной...
klem4
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
Кстати, kornet, ты в программе Crt используешь? А то Video можно применять только тогда, когда не используется Crt, иначе будут глюки... yes2.gif
kornet
Цитата(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
Цитата(kornet @ 11.03.2008 23:46) *
Не хочет компилировать в режиме Go32V2 DOSExtender.
Можно отмаппить функциями DPMI область видеопамяти в адресное пространство программы. Но, честное слово, проще это не будет. По сути дела ты ручками сделаешь то, что за тебя делает Go32V2.
kornet
Цитата(andriano)
По сути дела ты ручками сделаешь то, что за тебя делает Go32V2.
Вопрос в том, как сделать так, чтобы FreePascal компилировал в этом режиме? Кидал модуль system.ppu в разные папки, все равно компилятор пишет ту же ошибку, о которой я писал в своём предыдущем посте.
andriano
Цитата(kornet @ 12.03.2008 20:01) *

Вопрос в том, как сделать так, чтобы FreePascal компилировал в этом режиме? Кидал модуль system.ppu в разные папки, все равно компилятор пишет ту же ошибку, о которой я писал в своём предыдущем посте.

Нет, сервис DPMI позволяет 32-разрядным программам DOS работать с нижней памятью вообще (например, со звуковым буфером или прерываниями, использующими память, такие как сервис VESA) и видеопамятью в частности. Директива absolute, естественно, при этом работать не будет. Но ведь у тебя задача получить доступ к видеопамяти, а не использовать определенную конструкцию языка.
kornet
Цитата(andriano @ 12.03.2008 19:34) *

Нет, сервис DPMI позволяет 32-разрядным программам DOS работать с нижней памятью вообще (например, со звуковым буфером или прерываниями, использующими память, такие как сервис VESA) и видеопамятью в частности. Директива absolute, естественно, при этом работать не будет.

Вообще то я спрашивал, как настроить FreePascal, чтобы он работал в режиме Go32V2 DOSExtender. Но, допустим, я не смогу его настроить. Мог бы ты написать, какими функциями DPMI я должен пользоваться или где я могу про это прочитать. Спасибо.
volvo
Цитата
Вообще то я спрашивал, как настроить 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
Цитата(volvo @ 12.03.2008 20:27) *

Вообще-то ты толком объясни, чего хочешь-то? Ты хочешь из-под WinNT пользоваться Go32V2? (Компилятор какой качал? Для Win32? Судя по пути, указанному тобой, так и есть...) Не будет этого:
, с ним можно работать под чистым ДОСом. Обрати также внимание на соответствие версии компилятора, если у тебя вторая ветка - ты огребешь столько проблем с Go32V2, что лучше и не начинай...


Да, качал для Win32. И хотел бы все программы и модули компилировать в нём. Вобщем, я понял, что для обращения к видеопамяти в Windows легче и лучше всего пользоваться модулем video.ppu, но при этом придется отказаться от использования модуля crt(но судя по тому, что я прочитал в руководстве, в video.ppu имеются те же и другие подпрограммы и переменные, которые есть в crt, и можно пользоваться ими). Спасибо всем, еще раз, за советы.
andriano
Цитата(kornet @ 12.03.2008 22:14) *
...что для обращения к видеопамяти в Windows легче и лучше всего...
Нич-чего не понимаю!
В Windows обращаться к видеопамяти вообще безыдейно.
До сих пор я был уверен, чо речь идет имено о DOS, исходя из этого и писал.
В DOS требуется вполне конкретное железо, соответственно, можно гарантировать, что номера регистров, способов работы с ними, адресов видеопамяти и т.п. при работе программы идентичны вне зависимости от того, где и когда бы эта программа ни запускалась.
Windows изначально предполагает иное. Поэтому непосредственная работа с видеопамятью - дело гиблое и бесперспективное.
sheka
Цитата
type bytear = array [1..4000] of byte;
var arr : bytear absolute $B800:$0000;

Так что, получается этим под виндосом пользоваться нельзя?
(у меня ФриПаскаль, ОСь ХРюша или Вин7)

Т.е. надо качать ТП и на ХРюше работать, да?
volvo
Цитата
Так что, получается этим под виндосом пользоваться нельзя?
Получается, что нельзя. Если б ты сразу задал вопрос в разделе "32-битные компиляторы" - тебе бы сразу сказали, что обращение к видеопамяти напрямую - не их сильная черта.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.