Другие языки программирования и технологии

Возможно ли в Паскале получить какой-нибудь символ уже выведенный на экран?

Ну или как это сделать, потому что полагаю, что возможно.Естественно в текстовом режиме...
Доброго времени суток.

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

var
WidthScreen : word;
HeightScreen : word;
VideoSeg : word;
ModeScreen : byte;

VideoWord = record
Ch : char;
At : byte;
end;

{получение параметров видео}
procedure GetMode;
var
Regs : Registers;
OfsVideoPage : word absolute $0:$4E4;
RowsToScr : byte absolute $0:$484;
begin
FillChar(Regs,SizeOf(Regs),0);
Regs.Ah:=$0f;
Intr($10,Regs);
with Regs do begin
Al:= Al and $7f;
ModeScreen:=Al;
WidthScreen:=Ah;
end;
HeightScreen:=succ(RowsToScr);
if ModeScreen = Mono then VideoSeg:=$b000
else if ModeScreen <= co80 then VideoSeg:=$b800+OfsVideoPage shr 4;
end;

{вычисление смещения для позиции экрана XY}
function OfsScr(x,y: word): word;
begin
OfsScr:=(pred(y)*WidthScreen+pred(x))*2;
end;

{запись строки с заданным атрибутом}
procedure WrtStrAtr(st: string; x,y,Attr: byte);
var
l : byte absolute st;
VPos : word;
i : byte;
w : VideoWord;
begin
VPos:=OfsScr(x,y);
W.At:=Attr;
for i:=1 to l do begin
w.Ch:=st[ i ];
MemW[VideoSeg:VPos]:=word(w);
Inc(VPos,2);
end;
end;

{запись байта (атрибуты остаются прежними) }
procedure WrtStr(st: string; x,y: byte);
var
l : byte absolute st;
VPos : word;
i : byte;
begin
VPos:=OfsScr(x,y);
for i:=1 to l do begin
Mem[VideoSeg:VPos]:=byte(st[ i ]);
Inc(VPos,2);
end;
end;

{смена атрибутов}
procedure ChangeAtr(number: word; x,y,attr: byte);
var
VPos : word;
i : byte;
begin
VPos:=OfsScr(x,y)+1;
for i:=1 to number do begin
Mem[VideoSeg:VPos]:=attr;
Inc(VPos,2);
end;
end;

Небольшое пояснение. С помощью такой конструкции, которая называется совмещением переменных в памяти, находится длина строки l : byte absolute st; Работает мгновенно, поскольку сразу читается нулевой байт строки в котором, как известно, хранится ее длина.

Удачи!
Юрий Котельников
Юрий Котельников
59 613
Лучший ответ
Для того, чтобы закрыть вопрос, вам надо два ответа. Это второй.
Валера Кольчурин Gennady подсказал? ))

Похожие вопросы