我正在寻找一种方法来获取FPC下的控制台视频行数和列数。我正在寻找最便携的方式,但至少有一种可以在Windows下工作(最好也在Linux下)。
从旧的Turbo Pascal时代开始,我编写了以下函数,但它们不会在FPC下编译,而且在汇编程序中它们不是很便携。
//Return the number of video rows
function GetVideoY: Byte; assembler;
asm
mov ax,$40
mov es,ax
mov al,es:$84
inc al
end; { GetVideoY }
//Return the number of video columns
function GetVideoX: Byte; assembler;
asm
mov ax,$40
mov es,ax
mov al,es:$4A
end; { GetVideoX }
更新: 基于正确答案的建议,上述例程变为:
//Return the number of video rows
function GetVideoY: Byte;
begin
GetVideoY := WindMaxY - WindMinY + 1;
end;
//Return the number of video columns
function GetVideoX: Byte;
begin
GetVideoX := WindMaxX - WindMinX + 1;
end;
我在Windows和Linux上都尝试了它们,它们似乎工作正常。感谢。
答案 0 :(得分:3)
从旧的Turbo Pascal时代起,发生了很大变化的是,从ROM-BIOS数据区读取文本屏幕分辨率几乎只适用于Dan Rollins's TECH Help!绝对地址仍然存在的裸机操作系统。代码的免费Pascal转换看起来像
function GetVideoY: Byte;
begin
GetVideoY := mem[$40:$84] + 1;
end;
function GetVideoX: Byte;
begin
GetVideoX := mem[$40:$4a];
end;
在具有图形用户界面的操作系统下运行的控制台应用程序经常不直接与其他应用程序共享屏幕,也不使用BIOS视频呼叫在屏幕上绘图。相反,它们通常在虚拟化API之后运行。
Free Pascal以Crt
unit
来源:http://www.freepascal.org/docs-html/rtl/crt/index.html
..免费Pascal的CRT单元,在dos linux和Windows下。该单元最初由Florian klaempfl为dos编写。该部门由Mark May移植到Linux,并由Michael Van Canneyt和Peter Vreman加强。它适用于Linux控制台,以及X-Windows下的xterm和rxvt窗口。两者的功能都相同..
你可以在
看到它的表面(便携式API)你可以看到里面的内容
当前屏幕分辨率的等效表达式应为
WindMaxY - WindMinY + 1
和
WindMaxX - WindMinX + 1
并阅读GotoXY周围的文档可能是一个很好的开始和搜索文本的地方ScreenWidth
和源代码文件中的ScreenHeight
可以告诉您其他任何您可能想知道的内容< / p>