Связные списки, переписать код с использованием Case - PascalABC.NET

Формулировка задачи:

Препода не устраивает "простыня" вот в этом куске. требует переписать кейсами, но как-то не ахти получается, выручите пожалуйста
procedure mousedown(x, y, mb: integer); // обработчик событий мыши(кнопки, операции, цвета и все все и меню)
begin
  if ((x >= 0) and (x < 150) and (y >= 0) and (y < 30)) then
  begin
    op := 1;
    setpencolor(clred);
    drawrectangle(0, 0, 150, 30);
    setpencolor(clblack);
    drawrectangle(150, 0, 300, 30);
    drawrectangle(300, 0, 450, 30);
    drawrectangle(450, 0, 600, 30);
    drawrectangle(600, 0, 750, 30);
    drawrectangle(750, 0, 900, 30);
  end else
  if ((x >= 150) and (x < 300) and (y >= 0) and (y < 30)) then
  begin
    op := 2;
    setpencolor(clred);
    drawrectangle(150, 0, 300, 30);
    setpencolor(clblack);
    drawrectangle(0, 0, 150, 30);
    drawrectangle(300, 0, 450, 30);
    drawrectangle(450, 0, 600, 30);
    drawrectangle(600, 0, 750, 30);
    drawrectangle(750, 0, 900, 30);
  end else
  if ((x >= 300) and (x < 450) and (y >= 0) and (y < 30)) then
  begin
    op := 3;
    setpencolor(clred);
    drawrectangle(300, 0, 450, 30);
    setpencolor(clblack);
    drawrectangle(150, 0, 300, 30);
    drawrectangle(0, 0, 150, 30);
    drawrectangle(450, 0, 600, 30);
    drawrectangle(600, 0, 750, 30);
    drawrectangle(750, 0, 900, 30);
  end else
  if ((x >= 450) and (x < 600) and (y >= 0) and (y < 30)) then
  begin
    op := 4;
    setpencolor(clred);
    drawrectangle(450, 0, 600, 30);
    setpencolor(clblack);
    drawrectangle(150, 0, 300, 30);
    drawrectangle(300, 0, 450, 30);
    drawrectangle(0, 0, 150, 30);
    drawrectangle(600, 0, 750, 30);
    drawrectangle(750, 0, 900, 30);
    redrawall(head);
    op := 1;
    setpencolor(clred);
    drawrectangle(0, 0, 150, 30);
    setpencolor(clblack);
    drawrectangle(150, 0, 300, 30);
    drawrectangle(300, 0, 450, 30);
    drawrectangle(450, 0, 600, 30);
    drawrectangle(600, 0, 750, 30);
    drawrectangle(750, 0, 900, 30);
    setpencolor(clred);
    drawrectangle(5, 55, 45, 95);
    setpencolor(clblack);
    clr := clyellow;
    drawrectangle(5, 95, 45, 135);
    drawrectangle(5, 135, 45, 175);
    drawrectangle(5, 175, 45, 215);
    drawrectangle(5, 215, 45, 255);
    drawrectangle(5, 255, 45, 295);
    drawrectangle(5, 295, 45, 335);
    drawrectangle(5, 335, 45, 375);
    drawrectangle(5, 375, 45, 415);
    drawrectangle(5, 415, 45, 455);
  end else
  if ((x >= 600) and (x < 750) and (y >= 0) and (y < 30)) then
  begin
    op := 5;
    setpencolor(clred);
    drawrectangle(600, 0, 750, 30);
    setpencolor(clblack);
    drawrectangle(150, 0, 300, 30);
    drawrectangle(300, 0, 450, 30);
    drawrectangle(450, 0, 600, 30);
    drawrectangle(0, 0, 150, 30);
    drawrectangle(750, 0, 900, 30);
    deleteall(head);
    op := 1;
    setpencolor(clred);
    drawrectangle(0, 0, 150, 30);
    setpencolor(clblack);
    drawrectangle(150, 0, 300, 30);
    drawrectangle(300, 0, 450, 30);
    drawrectangle(450, 0, 600, 30);
    drawrectangle(600, 0, 750, 30);
    drawrectangle(750, 0, 900, 30);
    setpencolor(clred);
    drawrectangle(5, 55, 45, 95);
    setpencolor(clblack);
    clr := clyellow;
    drawrectangle(5, 95, 45, 135);
    drawrectangle(5, 135, 45, 175);
    drawrectangle(5, 175, 45, 215);
    drawrectangle(5, 215, 45, 255);
    drawrectangle(5, 255, 45, 295);
    drawrectangle(5, 295, 45, 335);
    drawrectangle(5, 335, 45, 375);
    drawrectangle(5, 375, 45, 415);
    drawrectangle(5, 415, 45, 455);
  end else
  if ((x >= 750) and (x <= 900) and (y >= 0) and (y < 30)) then
    ext else
  if ((x >= 5) and (x <= 45) and (y >= 55) and (y < 95)) then
  begin
    setpencolor(clred);
    drawrectangle(5, 55, 45, 95);
    setpencolor(clblack);
    clr := clyellow;
    drawrectangle(5, 95, 45, 135);
    drawrectangle(5, 135, 45, 175);
    drawrectangle(5, 175, 45, 215);
    drawrectangle(5, 215, 45, 255);
    drawrectangle(5, 255, 45, 295);
    drawrectangle(5, 295, 45, 335);
    drawrectangle(5, 335, 45, 375);
    drawrectangle(5, 375, 45, 415);
    drawrectangle(5, 415, 45, 455);
  end else
  if ((x >= 5) and (x <= 45) and (y >= 95) and (y < 135)) then
  begin
    setpencolor(clred);
    drawrectangle(5, 95, 45, 135);
    setpencolor(clblack);
    drawrectangle(5, 55, 45, 95);
    clr := clgreen;
    drawrectangle(5, 135, 45, 175);
    drawrectangle(5, 175, 45, 215);
    drawrectangle(5, 215, 45, 255);
    drawrectangle(5, 255, 45, 295);
    drawrectangle(5, 295, 45, 335);
    drawrectangle(5, 335, 45, 375);
    drawrectangle(5, 375, 45, 415);
    drawrectangle(5, 415, 45, 455);
  end else
  if ((x >= 5) and (x <= 45) and (y >= 135) and (y < 175)) then
  begin
    setpencolor(clred);
    drawrectangle(5, 135, 45, 175);
    setpencolor(clblack);
    drawrectangle(5, 55, 45, 95);
    drawrectangle(5, 95, 45, 135);
    clr := clblue;
    drawrectangle(5, 175, 45, 215);
    drawrectangle(5, 215, 45, 255);
    drawrectangle(5, 255, 45, 295);
    drawrectangle(5, 295, 45, 335);
    drawrectangle(5, 335, 45, 375);
    drawrectangle(5, 375, 45, 415);
    drawrectangle(5, 415, 45, 455);
  end else
  if ((x >= 5) and (x <= 45) and (y >= 175) and (y < 215)) then
  begin
    setpencolor(clred);
    drawrectangle(5, 175, 45, 215);
    setpencolor(clblack);
    drawrectangle(5, 55, 45, 95);
    drawrectangle(5, 95, 45, 135);
    drawrectangle(5, 135, 45, 175);
    clr := clsilver;
    drawrectangle(5, 215, 45, 255);
    drawrectangle(5, 255, 45, 295);
    drawrectangle(5, 295, 45, 335);
    drawrectangle(5, 335, 45, 375);
    drawrectangle(5, 375, 45, 415);
    drawrectangle(5, 415, 45, 455);
  end else
  if ((x >= 5) and (x <= 45) and (y >= 215) and (y < 255)) then
  begin
    setpencolor(clred);
    drawrectangle(5, 215, 45, 255);
    setpencolor(clblack);
    drawrectangle(5, 55, 45, 95);
    drawrectangle(5, 95, 45, 135);
    drawrectangle(5, 135, 45, 175);
    drawrectangle(5, 175, 45, 215);
    clr := clorange;
    drawrectangle(5, 255, 45, 295);
    drawrectangle(5, 295, 45, 335);
    drawrectangle(5, 335, 45, 375);
    drawrectangle(5, 375, 45, 415);
    drawrectangle(5, 415, 45, 455);
  end else
  if ((x >= 5) and (x <= 45) and (y >= 255) and (y < 295)) then
  begin
    setpencolor(clred);
    drawrectangle(5, 255, 45, 295);
    setpencolor(clblack);
    drawrectangle(5, 55, 45, 95);
    drawrectangle(5, 95, 45, 135);
    drawrectangle(5, 135, 45, 175);
    drawrectangle(5, 175, 45, 215);
    drawrectangle(5, 215, 45, 255);
    clr := clbrown;
    drawrectangle(5, 295, 45, 335);
    drawrectangle(5, 335, 45, 375);
    drawrectangle(5, 375, 45, 415);
    drawrectangle(5, 415, 45, 455);
  end else
  if ((x >= 5) and (x <= 45) and (y >= 295) and (y < 335)) then
  begin
    setpencolor(clred);
    drawrectangle(5, 295, 45, 335);
    setpencolor(clblack);
    drawrectangle(5, 55, 45, 95);
    drawrectangle(5, 95, 45, 135);
    drawrectangle(5, 135, 45, 175);
    drawrectangle(5, 175, 45, 215);
    drawrectangle(5, 215, 45, 255);
    drawrectangle(5, 255, 45, 295);
    clr := clcyan;
    drawrectangle(5, 335, 45, 375);
    drawrectangle(5, 375, 45, 415);
    drawrectangle(5, 415, 45, 455);
  end else
  if ((x >= 5) and (x <= 45) and (y >= 335) and (y < 375)) then
  begin
    setpencolor(clred);
    drawrectangle(5, 335, 45, 375);
    setpencolor(clblack);
    drawrectangle(5, 55, 45, 95);
    drawrectangle(5, 95, 45, 135);
    drawrectangle(5, 135, 45, 175);
    drawrectangle(5, 175, 45, 215);
    drawrectangle(5, 215, 45, 255);
    drawrectangle(5, 255, 45, 295);
    drawrectangle(5, 295, 45, 335);
    clr := clmagenta;
    drawrectangle(5, 375, 45, 415);
    drawrectangle(5, 415, 45, 455);
  end else
  if ((x >= 5) and (x <= 45) and (y >= 375) and (y < 415)) then
  begin
    setpencolor(clred);
    drawrectangle(5, 375, 45, 415);
    setpencolor(clblack);
    drawrectangle(5, 55, 45, 95);
    drawrectangle(5, 95, 45, 135);
    drawrectangle(5, 135, 45, 175);
    drawrectangle(5, 175, 45, 215);
    drawrectangle(5, 215, 45, 255);
    drawrectangle(5, 255, 45, 295);
    drawrectangle(5, 295, 45, 335);
    drawrectangle(5, 335, 45, 375);
    clr := clgold;
    drawrectangle(5, 415, 45, 455);
  end else
  if ((x >= 5) and (x <= 45) and (y >= 415) and (y < 455)) then
  begin
    setpencolor(clred);
    drawrectangle(5, 415, 45, 455);
    setpencolor(clblack);
    drawrectangle(5, 55, 45, 95);
    drawrectangle(5, 95, 45, 135);
    drawrectangle(5, 135, 45, 175);
    drawrectangle(5, 175, 45, 215);
    drawrectangle(5, 215, 45, 255);
    drawrectangle(5, 255, 45, 295);
    drawrectangle(5, 295, 45, 335);
    drawrectangle(5, 335, 45, 375);
    drawrectangle(5, 375, 45, 415);
    clr := clpurple;
  end else
  if ((x >= 855) and (x <= 895) and (y >= 55) and (y < 95)) then
  begin
    setpencolor(clred);
    drawrectangle(855, 55, 895, 95);
    setpencolor(clblack);
    mrkr := 1;
    drawrectangle(855, 95, 895, 135);
    drawrectangle(855, 135, 895, 175);
    drawrectangle(855, 175, 895, 215);
    drawrectangle(855, 215, 895, 255);
  end else
  if ((x >= 855) and (x <= 895) and (y >= 135) and (y < 175)) then
  begin
    setpencolor(clred);
    drawrectangle(855, 135, 895, 175);
    setpencolor(clblack);
    drawrectangle(855, 55, 895, 95);
    drawrectangle(855, 95, 895, 135);
    mrkr := 2;
    drawrectangle(855, 175, 895, 215);
    drawrectangle(855, 215, 895, 255);
  end else
  if ((x >= 855) and (x <= 895) and (y >= 215) and (y <= 255)) then
  begin
    setpencolor(clred);
    drawrectangle(855, 215, 895, 255);
    setpencolor(clblack);
    drawrectangle(855, 55, 895, 95);
    drawrectangle(855, 95, 895, 135);
    drawrectangle(855, 135, 895, 175);
    drawrectangle(855, 175, 895, 215);
    mrkr := 3;
  end else
  if ((x > 55) and (x < 845) and (y > 40) and (y < 490)) then
    if op = 1 then begin
      newnode(x, y, clr, mrkr);
      drawnode(p);
    end  else
    if op = 2 then 
      deletenode(x, y, head)
    else 
    if op = 3 then 
      movenode(x, y, head);  
end;

Код к задаче: «Связные списки, переписать код с использованием Case - PascalABC.NET»

textual
uses GraphABC;
 
var
  MouseX, MouseY : Integer;
  myProcedure : procedure;
 
type
  /// Кнопка
  tButton = class
  private
    X, Y, Width, Height : Integer;
    Text : String;
    btnSelect : Boolean;
    proc : procedure;
    
    procedure Show;
    begin
      if btnSelect then
        begin
          Brush.Color := RGB(128, 128, 255);
          Font.Color := RGB(255, 255, 0);
        end
      else
        begin
          Brush.Color := RGB(192, 192, 192);
          Font.Color := RGB(255, 255, 0);
        end;
      Font.Style := fsBold;
 
      FillRectangle(X, Y, X + Width, Y + Height);
      DrawTextCentered(X + 1, Y + 1, X + Width - 1, Y + Height - 1, Text);
    end;
 
    constructor Create(X, Y, Width, Height : Integer; Text : String; proc : procedure);
    begin
      Self.X := X; Self.Y := Y; Self.Width := Width; Self.Height := Height;
      Self.Text := Text; btnSelect := False;
      Self.proc := proc;
      Show;
    end;
    
    procedure Select;
    begin
      btnSelect := Not btnSelect;
      Show;
      if btnSelect then
        myProcedure := proc;
    end;
    
    function MouseDown(mouseX, mouseY : Integer) := (mouseX > X) and (mouseX < X + Width) and (mouseY > Y) and (mouseY < Y + Height);
  end;
 
procedure Slider;
begin
  PutPixel(MouseX, MouseY, clBlack);
end;
 
procedure None;
begin
end;
 
const
  btnsCount = 2;
  
var
  btns : array [1..btnsCount] of tButton;
 
procedure MouseDown(x, y, mb : Integer);
begin
  // Может это кнопка?
  for var num := 1 to btnsCount do
    if btns[num].MouseDown(x, y) then
      begin
        btns[num].Select; // Эту включим
        for var i := 1 to btnsCount do
          if (i <> num) and btns[i].btnSelect then
            btns[i].Select; // Другие погасим
        Exit; // Событие отловлено. Другие не нужны
      end;
      
  // Обработка других событий    
end;
 
procedure MouseMove(x, y, mb : Integer);
begin
  MouseX := X;
  MouseY := Y;
  myProcedure;
end;
 
begin
  SetWindowSize(900, 500);
  
  myProcedure := None;
 
  btns[1] := New tButton(  2, 2, 180, 20, 'Создать маркер', Slider);
  btns[2] := New tButton(202, 2, 180, 20, 'Удалить маркер', None  );
  
  OnMouseDown := MouseDown;
  OnMouseMove := MouseMove;
  
end.

7   голосов, оценка 3.857 из 5


СОХРАНИТЬ ССЫЛКУ