使用CRT如何取消反滚动?
Uses CRT how to negate anti scrolling?
我目前正在使用 CRT 来允许延迟创建大量随机数,而不是让一堆数字相同(<- 我的语法很糟糕)。所以我使用 writeln 查看我的脚本生成的数字,但它不允许我看到所有数字。
For x := 1 to 100 Do
With people[x] Do
Begin
randomize;
people[x].Address:='4562 South abigail lane';
people[x].Phonenum:='555-555-1234';
people[x].licence:='ABC3456789';
people[x].tickets:=random(5);
People[x].age:=16+random(10000) mod 80 + 1;
delay(50);
writeln(people[x].age);
End;
所以你可以看出它在检查数字方面有点问题。如果可能的话,有人可以为我提供替代方案吗?
i used a writeln to see the numbers my script was generating and it wouldnt allow me to see all the numbers.
你可以做的一件事是添加一行
readln;
在你的 for
循环之后。这样,当您的应用程序到达该行时,您将需要按任意键。然后您会发现根本不需要 delay(50);
行。
另外两件事:
1) 将对 Randomize
的调用移到循环外。它应该被调用一次,在你的程序开始时。 FreePascal 文档没有指定这一点,但它在使用 Random. The Delphi RTL documentation 的示例中对此进行了演示,使这一点更加清晰:
Do not combine the call to Randomize in a loop with calls to the Random function. Typically, Randomize is called only once, before all calls to Random.
2)(结合在下面的代码中),改掉使用with
的习惯,永远。使用它节省的打字时间与您最终可能花在试图找出因使用它引起的模糊错误所花费的时间相比是微不足道的。
Randomize;
for x := 1 to 100 do
begin
people[x].Address := '4562 South abigail lane';
people[x].Phonenum := '555-555-1234';
people[x].licence := 'ABC3456789';
people[x].tickets := random(5);
people[x].age := 16 + random(10000) mod 80 + 1;
//delay(50); pointless
writeln(people[x].age);
end;
readln;
可以使用crt单元的WindMaxY
增加竖屏缓冲。
crt.WindMaxY := 110;
Randomize;
For x := 1 to 100 Do
...
现在您可以向上滚动并观察之前写入的输出。
或者,您可以使用 crt unit 中的光标位置函数来检索光标位置并将其设置在任何您想要的位置。
以下示例以易于阅读的 10x10 表格格式输出 100 个数字。请注意,我从示例中删除了不相关的代码,并且我还将循环计数器从 0 开始,以便于计算,这可能需要修改您的数组。但是,当然,您可以选择修改代码示例。
var
x: Integer;
begin
Randomize;
WriteLn;
For x := 0 to 99 Do
Begin
GotoXY((x mod 10) * 6, WhereY - 1);
if WhereX = 1 then
GotoXY(1, WhereY + 1);
WriteLn(16 + Random(10000) mod 80 + 1);
End;
Readln;
end.
示例输出:
我目前正在使用 CRT 来允许延迟创建大量随机数,而不是让一堆数字相同(<- 我的语法很糟糕)。所以我使用 writeln 查看我的脚本生成的数字,但它不允许我看到所有数字。
For x := 1 to 100 Do
With people[x] Do
Begin
randomize;
people[x].Address:='4562 South abigail lane';
people[x].Phonenum:='555-555-1234';
people[x].licence:='ABC3456789';
people[x].tickets:=random(5);
People[x].age:=16+random(10000) mod 80 + 1;
delay(50);
writeln(people[x].age);
End;
所以你可以看出它在检查数字方面有点问题。如果可能的话,有人可以为我提供替代方案吗?
i used a writeln to see the numbers my script was generating and it wouldnt allow me to see all the numbers.
你可以做的一件事是添加一行
readln;
在你的 for
循环之后。这样,当您的应用程序到达该行时,您将需要按任意键。然后您会发现根本不需要 delay(50);
行。
另外两件事:
1) 将对 Randomize
的调用移到循环外。它应该被调用一次,在你的程序开始时。 FreePascal 文档没有指定这一点,但它在使用 Random. The Delphi RTL documentation 的示例中对此进行了演示,使这一点更加清晰:
Do not combine the call to Randomize in a loop with calls to the Random function. Typically, Randomize is called only once, before all calls to Random.
2)(结合在下面的代码中),改掉使用with
的习惯,永远。使用它节省的打字时间与您最终可能花在试图找出因使用它引起的模糊错误所花费的时间相比是微不足道的。
Randomize;
for x := 1 to 100 do
begin
people[x].Address := '4562 South abigail lane';
people[x].Phonenum := '555-555-1234';
people[x].licence := 'ABC3456789';
people[x].tickets := random(5);
people[x].age := 16 + random(10000) mod 80 + 1;
//delay(50); pointless
writeln(people[x].age);
end;
readln;
可以使用crt单元的WindMaxY
增加竖屏缓冲。
crt.WindMaxY := 110;
Randomize;
For x := 1 to 100 Do
...
现在您可以向上滚动并观察之前写入的输出。
或者,您可以使用 crt unit 中的光标位置函数来检索光标位置并将其设置在任何您想要的位置。
以下示例以易于阅读的 10x10 表格格式输出 100 个数字。请注意,我从示例中删除了不相关的代码,并且我还将循环计数器从 0 开始,以便于计算,这可能需要修改您的数组。但是,当然,您可以选择修改代码示例。
var
x: Integer;
begin
Randomize;
WriteLn;
For x := 0 to 99 Do
Begin
GotoXY((x mod 10) * 6, WhereY - 1);
if WhereX = 1 then
GotoXY(1, WhereY + 1);
WriteLn(16 + Random(10000) mod 80 + 1);
End;
Readln;
end.
示例输出: