Ответы

Pascal ABC Почему объекты ведут себя по разному в описанных и главной процедуре?

Вот есть программка, в ней объект, который графически изменяется. Только в главной процедуре у него есть анимация, а через обработчик клавиатуры он просто меняет цвет через время за которое эта анимация должна произойти.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
uses graphWPF;

type
  pos = record
    x, y: integer;
  end;
  cube_base = class
  private
    ind_clr_off, ind_clr_on: color;
    position: pos;
    status: boolean;
    procedure draw;
    begin
      fillrectangle(position.x - 40, position.y, 120, 120, rgb($AA, $AA, $AA));
      if status then
        fillrectangle(position.x, position.y + 40, 40, 40, ind_clr_on)
      else
        fillrectangle(position.x, position.y + 40, 40, 40, ind_clr_off);
    end;
  
  public
    constructor Create(x, y: integer);
    begin
      position.x := x;
      position.y := y;
ind_clr_off := rgb($32, $CD, $32); ind_clr_on := rgb($FF, $8C, $00);
      draw;
    end;
    
    procedure switch;
    
    begin
      status := not status;
      if status then
        for var swc := 0 to 40 do
        begin
          fillrectangle(position.x, position.y + 40 + swc, 40, 40, ind_clr_off);
          fillrectangle(position.x, position.y + swc, 40, 40, ind_clr_on);
          fillrectangle(position.x - 40, position.y, 120, 40, rgb($AA, $AA, $AA));
          fillrectangle(position.x - 40, position.y + 80, 120, 40, rgb($AA, $AA, $AA));
          write(swc);
          sleep(5);
        end
      else
        for var swc := 40 downto 0 do
        begin
          fillrectangle(position.x, position.y + 40 + swc, 40, 40, ind_clr_off);
          fillrectangle(position.x, position.y + swc, 40, 40, ind_clr_on);
          fillrectangle(position.x - 40, position.y, 120, 40, rgb($AA, $AA, $AA));
          fillrectangle(position.x - 40, position.y + 80, 120, 40, rgb($AA, $AA, $AA));
          write(swc);
          sleep(5);
        end;
    end;
  end;

var
  blocklist := new List<cube_base>;

procedure keymap(key: key);
begin
  if key = system.Windows.Input.Key.Space then
    blocklist.Item[0].switch;
end;

begin
  window.Top := 0;
  window.Left := 0;
  writeln('run');
  OnKeyDown := keymap;
  blocklist += new cube_base( 100, 100);
  blocklist.Item[0].switch;
  sleep(1000);
   blocklist.Item[0].switch;
end.