使用CRT如何否定反滚动?

时间:2018-04-20 14:29:09

标签: pascal lazarus crt

我目前正在使用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;   

所以你可以告诉它,检查数字会产生一些问题。所以,如果有可能,有人可以为我提供替代方案吗?

2 个答案:

答案 0 :(得分:1)

  

我使用了一个writeln来查看我的脚本生成的数字,它不允许我查看所有数字。

你可以做的一件事是添加一行

readln; 
for循环之后

。这样,当您的应用程序到达该行时,您将需要按任意键。然后,您应该发现根本不需要delay(50);行。

另外两件事:

1)将呼叫移至循环外的Randomize。在程序开始时应该只调用一次。 FreePascal文档没有指定这一点,但它在使用Random的示例中进行了演示。 Delphi RTL documentation使这一点更加清晰:

  

不要将循环中的Randomize调用与对Random函数的调用组合在一起。通常,在所有对Random的调用之前,Randomize只调用一次。

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;  

答案 1 :(得分:1)

您可以使用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.


输出示例:

example output