1163 lines
30 KiB
ObjectPascal
1163 lines
30 KiB
ObjectPascal
// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt)
|
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
|
unit RobotField;
|
|
|
|
//#savepcu false
|
|
|
|
interface
|
|
|
|
uses GraphABC;
|
|
|
|
const
|
|
IniFileName = 'ABC.ini';
|
|
MAX_DimX = 100;
|
|
MAX_DimY = 100;
|
|
|
|
var
|
|
RPaintColor: Color;
|
|
RBorderColor: Color;
|
|
RobotColor: Color;
|
|
RobotColor1: Color;
|
|
BackColor: Color;
|
|
|
|
LabelReadyColor: Color;
|
|
LabelDoColor: Color;
|
|
LabelStopColor: Color;
|
|
LabelErrorColor: Color;
|
|
LabelBadEndColor: Color;
|
|
LabelGoodEndColor: Color;
|
|
|
|
type
|
|
TRobotField = class
|
|
private
|
|
Tags: array [1..MAX_DimX,1..MAX_DimY] of boolean;
|
|
Painted: array [1..MAX_DimX,1..MAX_DimY] of integer; // 0-not 1-user painted 2-zadan painted
|
|
HorizWalls: array [1..MAX_DimX,0..MAX_DimY] of boolean;
|
|
VertWalls: array [0..MAX_DimX,1..MAX_DimY] of boolean;
|
|
FirstRobotX, FirstRobotY: integer;
|
|
LastRobotX, LastRobotY: integer;
|
|
RobotX, RobotY: integer;
|
|
Interval: integer;
|
|
StepFlag: boolean;
|
|
movenum: integer;
|
|
CellSize,DimX,DimY,X0,Y0: integer;
|
|
procedure Draw0;
|
|
procedure DrawFieldOnly;
|
|
procedure DrawCell(x,y: integer); { íàðèñîâàòü îäíó ÿ÷åéêó }
|
|
public
|
|
// Äîáàâèë - ÌÀ
|
|
TaskName: string;
|
|
//
|
|
constructor Create(sizex,sizey,cellsize: integer);
|
|
procedure DrawCentered;
|
|
procedure Draw;
|
|
procedure Clear;
|
|
procedure SetSpeed(speed: integer);
|
|
property StepState: boolean read StepFlag;
|
|
property SizeX: integer read DimX;
|
|
property SizeY: integer read DimY;
|
|
function IsSolution: boolean;
|
|
procedure CheckTaskCall;
|
|
// ïðèìèòèâû äëÿ ïîñòàíîâùèêà
|
|
procedure DrawLastRobotPos;
|
|
procedure DrawTag(x,y: integer);
|
|
procedure SetDim(DX,DY,CellSz: integer);
|
|
procedure SetPaintMaker(x,y: integer); { ïîìåòèòü ÿ÷åéêó êàê íàðèñîâàííóþ - ïîñòàíîâùèê}
|
|
procedure SetTag(x,y: integer); { ïîìåòèòü ÿ÷åéêó êàê ïîìå÷åííóþ }
|
|
procedure SetTagRect(x1,y1,x2,y2: integer);
|
|
procedure SetFirstRobotPos(x,y: integer);
|
|
procedure MoveRobotToFirstPos;
|
|
procedure SetLastRobotPos(x,y: integer);
|
|
procedure SetFirstLastRobotPos(x,y,x1,y1: integer);
|
|
procedure HorizWall(x,y,len: integer);
|
|
procedure VertWall(x,y,len: integer);
|
|
procedure TaskText(s: string);
|
|
// ïðèìèòèâû äëÿ âûïîëíèòåëÿ
|
|
procedure DrawRobot;
|
|
procedure MoveRobot(x,y: integer);
|
|
procedure SetPaintUser(x,y: integer); { ïîìåòèòü ÿ÷åéêó êàê íàðèñîâàííóþ - âûïîëíèòåëü}
|
|
procedure SetRobotPos(x,y: integer); // ñèíîíèì MoveRobot
|
|
function WallFromLeft(x,y: integer): boolean;
|
|
function WallFromRight(x,y: integer): boolean;
|
|
function WallFromUp(x,y: integer): boolean;
|
|
function WallFromDown(x,y: integer): boolean;
|
|
function CellIsFree(x,y: integer): boolean;
|
|
function CellIsPainted(x,y: integer): boolean;
|
|
|
|
procedure Right;
|
|
procedure Left;
|
|
procedure Up;
|
|
procedure Down;
|
|
procedure Paint;
|
|
procedure Pause;
|
|
|
|
function WallFromLeft: boolean;
|
|
function WallFromRight: boolean;
|
|
function WallFromUp: boolean;
|
|
function WallFromDown: boolean;
|
|
function CellIsFree: boolean;
|
|
function CellIsPainted: boolean;
|
|
|
|
procedure Start;
|
|
procedure Stop;
|
|
end;
|
|
|
|
procedure CorrectWHLT;
|
|
procedure SetTaskCall;
|
|
|
|
procedure RobotError(s: string);
|
|
procedure RobotError(s,s1: string);
|
|
|
|
var
|
|
RobField: TRobotField;
|
|
|
|
///--
|
|
procedure __InitModule__;
|
|
///--
|
|
procedure __FinalizeModule__;
|
|
|
|
implementation
|
|
|
|
uses
|
|
System,
|
|
System.Windows.Forms,
|
|
System.Drawing,
|
|
GraphABC,
|
|
IniFile;
|
|
|
|
type
|
|
TLabel = System.Windows.Forms.Label;
|
|
IniSettings = record
|
|
Width: integer;
|
|
Height: integer;
|
|
Left: integer;
|
|
Top: integer;
|
|
Speed: integer;
|
|
end;
|
|
|
|
var
|
|
BottomPanel: Panel;
|
|
panelBottomLeft: Panel;
|
|
buttonHelp: Button;
|
|
buttonExit: Button;
|
|
buttonStep: Button;
|
|
buttonStart: Button;
|
|
tableLayoutPanelBottom: TableLayoutPanel;
|
|
labelExState: TLabel;
|
|
groupBoxExState: GroupBox;
|
|
tableLayoutPanel1: TableLayoutPanel;
|
|
labelState: TLabel;
|
|
labelStep: TLabel;
|
|
trackBarSpeed: TrackBar;
|
|
labelSpeed: TLabel;
|
|
tableLayoutPanelTop: TableLayoutPanel;
|
|
labelZad: TLabel;
|
|
|
|
TaskIsCalled: boolean;
|
|
|
|
t: System.Threading.Thread;
|
|
|
|
//------------ Âñïîìîãàòåëüíûå -------------
|
|
procedure SetLabelStepText(s: string);
|
|
begin
|
|
labelStep.Text := s;
|
|
end;
|
|
|
|
procedure SetSafeLabelStepText(s: string);
|
|
begin
|
|
labelStep.Invoke(SetLabelStepText,s);
|
|
end;
|
|
|
|
procedure SetLabelZadText(s : string);
|
|
begin
|
|
labelZad.Text := s;
|
|
end;
|
|
|
|
procedure SetSafeLabelZadText(s: string);
|
|
begin
|
|
labelZad.Invoke(SetLabelZadText,s);
|
|
end;
|
|
|
|
procedure SetTrackBarSpeedValue(speed: integer);
|
|
begin
|
|
trackBarSpeed.Value := speed;
|
|
end;
|
|
|
|
procedure SetSafeTrackBarSpeedValue(speed: integer);
|
|
begin
|
|
trackBarSpeed.Invoke(SetTrackBarSpeedValue,speed);
|
|
end;
|
|
|
|
//------------ TRobotField -------------
|
|
constructor TRobotField.Create(sizex,sizey,cellsize: integer);
|
|
begin
|
|
Self.CellSize := cellsize;
|
|
DimX := sizex;
|
|
DimY := sizey;
|
|
RobotX := 1;
|
|
RobotY := 1;
|
|
FirstRobotX := 1;
|
|
FirstRobotY := 1;
|
|
LastRobotX := 0;
|
|
LastRobotY := 0;
|
|
X0 := 0;
|
|
y0 := 0;
|
|
StepFlag := False;
|
|
movenum := 0;
|
|
SetSpeed(3);
|
|
Clear;
|
|
end;
|
|
|
|
procedure TRobotField.Draw;
|
|
begin
|
|
if (MainForm.windowstate=formwindowstate.Minimized) then
|
|
Exit;
|
|
LockDrawing;
|
|
ClearWindow(BackColor);
|
|
Draw0;
|
|
UnLockDrawing;
|
|
end;
|
|
|
|
procedure TRobotField.DrawCentered;
|
|
var w,h: integer;
|
|
begin
|
|
if (DimX=0) or (DimY=0) then
|
|
exit;
|
|
w := CellSize*DimX;
|
|
h := CellSize*DimY;
|
|
X0 := (GraphABCControl.Width - w) div 2;
|
|
Y0 := (GraphABCControl.Height - h) div 2;
|
|
Draw;
|
|
end;
|
|
|
|
procedure TRobotField.DrawFieldOnly;
|
|
var ix,iy,w,h: integer;
|
|
begin
|
|
w := CellSize*DimX;
|
|
h := CellSize*DimY;
|
|
Brush.Color := clWhite;
|
|
FillRectangle(X0,Y0,X0+w+1,Y0+h+1);
|
|
Pen.Width := 1;
|
|
Pen.Color := RGB(191,191,191);
|
|
for ix:=0 to DimX do
|
|
Line(X0+ix*CellSize,Y0,X0+ix*CellSize,Y0+h);
|
|
for iy:=0 to DimY do
|
|
Line(X0,Y0+iy*CellSize,X0+w,Y0+iy*CellSize);
|
|
end;
|
|
|
|
procedure TRobotField.Draw0;
|
|
var x,y: integer;
|
|
begin
|
|
DrawFieldOnly;
|
|
Pen.Color:=clBlack;
|
|
Pen.Width:=3;
|
|
for x:=1 to DimX do
|
|
for y:=0 to DimY do
|
|
if HorizWalls[x,y] then
|
|
begin
|
|
MoveTo(X0+(x-1)*CellSize,Y0+y*CellSize);
|
|
LineTo(X0+x*CellSize,Y0+y*CellSize);
|
|
end;
|
|
for x:=0 to DimX do
|
|
for y:=1 to DimY do
|
|
if VertWalls[x,y] then
|
|
begin
|
|
MoveTo(X0+x*CellSize,Y0+(y-1)*CellSize);
|
|
LineTo(X0+x*CellSize,Y0+y*CellSize);
|
|
end;
|
|
|
|
Pen.Color:=clBlack;
|
|
Pen.Width:=1;
|
|
for x:=1 to DimX do
|
|
for y:=1 to DimY do
|
|
DrawCell(x,y);
|
|
end;
|
|
|
|
procedure TRobotField.DrawLastRobotPos;
|
|
var Sz,Z,Dim: integer;
|
|
begin
|
|
Sz:=CellSize;
|
|
Z:=max(Sz div 12,2);
|
|
if Sz>64 then Dim:=10
|
|
else if Sz>56 then Dim:=9
|
|
else if Sz>48 then Dim:=8
|
|
else if Sz>40 then Dim:=8
|
|
else if Sz>34 then Dim:=7
|
|
else if Sz>28 then Dim:=6
|
|
else if Sz>22 then Dim:=5
|
|
else if Sz>12 then Dim:=4
|
|
else Dim:=3;
|
|
|
|
Brush.Color:=RobotColor;
|
|
Pen.Color:=RBorderColor;
|
|
Pen.Style:=psSolid;
|
|
Rectangle(X0+Sz*(LastRobotX-1)+Z,Y0+Sz*(LastRobotY-1)+Z,X0+Sz*(LastRobotX-1)+Z+Dim,Y0+Sz*(LastRobotY-1)+Z+Dim);
|
|
end;
|
|
|
|
procedure TRobotField.DrawTag(x,y: integer);
|
|
var Sz,sz2: integer;
|
|
begin
|
|
Sz:=CellSize;
|
|
if Sz>80 then sz2:=Sz div 2 - 4
|
|
else if Sz>52 then sz2:=Sz div 2 - 3
|
|
else if Sz>12 then sz2:=Sz div 2 - 2
|
|
else sz2:=Sz div 2 - 1;
|
|
|
|
if (RobotX=x) and (RobotY=y)
|
|
then Brush.Color:=clLightGray
|
|
else Brush.Color:=clBlack;
|
|
FillRectangle(X0+Sz*(x-1)+1+sz2,Y0+Sz*(y-1)+1+sz2,X0+Sz*x+1-sz2,Y0+Sz*y+1-sz2);
|
|
end;
|
|
|
|
procedure TRobotField.DrawRobot;
|
|
var Sz,Z1: integer;
|
|
begin
|
|
Sz:=CellSize;
|
|
Z1:=max(Sz div 6,3);
|
|
if CellSize<10 then Z1:=2;
|
|
if Painted[RobotX,RobotY]=0
|
|
then Brush.Color:=RobotColor
|
|
else Brush.Color:=RobotColor1;
|
|
Pen.Color:=RBorderColor;
|
|
Pen.Style:=psSolid;
|
|
Rectangle(X0+Sz*(RobotX-1)+Z1,Y0+Sz*(RobotY-1)+Z1,X0+Sz*RobotX+1-Z1,Y0+Sz*RobotY+1-Z1);
|
|
end;
|
|
|
|
procedure TRobotField.DrawCell(x,y: integer);
|
|
var Sz,Z: integer;
|
|
begin
|
|
Sz:=CellSize;
|
|
Z:=max(Sz div 12,2);
|
|
|
|
if (Painted[x,y]=1) or (Painted[x,y]=2) then
|
|
Brush.Color:=RPaintColor
|
|
else
|
|
Brush.Color:=clWhite;
|
|
if (Painted[x,y]=1) or (Painted[x,y]=2) then
|
|
FillRectangle(X0+Sz*(x-1)+Z,Y0+Sz*(y-1)+Z,X0+Sz*x+2-Z-1,Y0+Sz*y+2-Z-1)
|
|
else
|
|
FillRectangle(X0+Sz*(x-1)+2,Y0+Sz*(y-1)+2,X0+Sz*x+2-3,Y0+Sz*y+2-3);
|
|
|
|
if (LastRobotX=x) and (LastRobotY=y) then
|
|
DrawLastRobotPos;
|
|
|
|
if (RobotX=x) and (RobotY=y) then
|
|
DrawRobot;
|
|
|
|
if Tags[x,y] then
|
|
DrawTag(x,y);
|
|
end;
|
|
|
|
procedure TRobotField.SetPaintUser(x,y: integer);
|
|
begin
|
|
if Painted[x,y]=0 then
|
|
Painted[x,y]:=1;
|
|
end;
|
|
|
|
procedure TRobotField.SetPaintMaker(x,y: integer);
|
|
begin
|
|
Painted[x,y]:=2;
|
|
end;
|
|
|
|
procedure TRobotField.SetTag(x,y: integer);
|
|
begin
|
|
Tags[x,y]:=True;
|
|
end;
|
|
|
|
procedure TRobotField.SetTagRect(x1,y1,x2,y2: integer);
|
|
var x,y: integer;
|
|
begin
|
|
for x:=x1 to x2 do
|
|
for y:=y1 to y2 do
|
|
SetTag(x,y);
|
|
end;
|
|
|
|
procedure TRobotField.SetFirstRobotPos(x,y: integer);
|
|
begin
|
|
FirstRobotX:=x;
|
|
FirstRobotY:=y;
|
|
SetRobotPos(x,y);
|
|
end;
|
|
|
|
procedure TRobotField.MoveRobotToFirstPos;
|
|
begin
|
|
SetRobotPos(FirstRobotX,FirstRobotY);
|
|
end;
|
|
|
|
procedure TRobotField.SetLastRobotPos(x,y: integer);
|
|
begin
|
|
LastRobotX:=x;
|
|
LastRobotY:=y;
|
|
end;
|
|
|
|
procedure TRobotField.SetFirstLastRobotPos(x,y,x1,y1: integer);
|
|
begin
|
|
SetFirstRobotPos(x,y);
|
|
SetLastRobotPos(x1,y1);
|
|
end;
|
|
|
|
procedure TRobotField.MoveRobot(x,y: integer);
|
|
var vx,vy: integer;
|
|
begin
|
|
vx:=RobotX;
|
|
vy:=RobotY;
|
|
RobotX:=x;
|
|
RobotY:=y;
|
|
DrawCell(vx,vy);
|
|
DrawCell(x,y);
|
|
Inc(movenum);
|
|
SetSafeLabelStepText('Øàã: ' + IntToStr(movenum));
|
|
// labelStep.Invoke(SetLabelStepText,'Øàã: ' + IntToStr(movenum));
|
|
end;
|
|
|
|
procedure TRobotField.SetRobotPos(x,y: integer);
|
|
begin
|
|
MoveRobot(x,y);
|
|
end;
|
|
|
|
function TRobotField.WallFromLeft(x,y: integer): boolean;
|
|
begin
|
|
CheckTaskCall;
|
|
WallFromLeft:=VertWalls[x-1,y];
|
|
end;
|
|
|
|
function TRobotField.WallFromRight(x,y: integer): boolean;
|
|
begin
|
|
CheckTaskCall;
|
|
WallFromRight:=VertWalls[x,y];
|
|
end;
|
|
|
|
function TRobotField.WallFromUp(x,y: integer): boolean;
|
|
begin
|
|
CheckTaskCall;
|
|
WallFromUp:=HorizWalls[x,y-1];
|
|
end;
|
|
|
|
function TRobotField.WallFromDown(x,y: integer): boolean;
|
|
begin
|
|
CheckTaskCall;
|
|
WallFromDown:=HorizWalls[x,y];
|
|
end;
|
|
|
|
function TRobotField.CellIsFree(x,y: integer): boolean;
|
|
begin
|
|
CheckTaskCall;
|
|
CellIsFree:=Painted[x,y]=0;
|
|
end;
|
|
|
|
function TRobotField.CellIsPainted(x,y: integer): boolean;
|
|
begin
|
|
CheckTaskCall;
|
|
CellIsPainted:=Painted[x,y]<>0;
|
|
end;
|
|
|
|
function TRobotField.WallFromLeft: boolean;
|
|
begin
|
|
Result := WallFromLeft(RobotX,RobotY);
|
|
end;
|
|
|
|
function TRobotField.WallFromRight: boolean;
|
|
begin
|
|
Result := WallFromRight(RobotX,RobotY);
|
|
end;
|
|
|
|
function TRobotField.WallFromUp: boolean;
|
|
begin
|
|
Result := WallFromUp(RobotX,RobotY);
|
|
end;
|
|
|
|
function TRobotField.WallFromDown: boolean;
|
|
begin
|
|
Result := WallFromDown(RobotX,RobotY);
|
|
end;
|
|
|
|
function TRobotField.CellIsFree: boolean;
|
|
begin
|
|
Result := CellIsFree(RobotX,RobotY);
|
|
end;
|
|
|
|
function TRobotField.CellIsPainted: boolean;
|
|
begin
|
|
Result := CellIsPainted(RobotX,RobotY);
|
|
end;
|
|
|
|
procedure TRobotField.CheckTaskCall;
|
|
begin
|
|
if not TaskIsCalled then
|
|
RobotError('Ïðîöåäóðà Task âûçîâà çàäàíèÿ äîëæíà áûòü ïåðâîé','Âûïîëíåíèå ïðîãðàììû ïðåðâàíî');
|
|
end;
|
|
|
|
procedure TRobotField.Right;
|
|
begin
|
|
CheckTaskCall;
|
|
if not WallFromRight then
|
|
MoveRobot(RobotX+1,RobotY)
|
|
else RobotError('Ðîáîò: âðåçàëñÿ â ïðàâóþ ñòåíó');
|
|
end;
|
|
|
|
procedure TRobotField.Left;
|
|
begin
|
|
CheckTaskCall;
|
|
if not WallFromLeft then
|
|
MoveRobot(RobotX-1,RobotY)
|
|
else RobotError('Ðîáîò: âðåçàëñÿ â ëåâóþ ñòåíó');
|
|
end;
|
|
|
|
procedure TRobotField.Up;
|
|
begin
|
|
CheckTaskCall;
|
|
if not WallFromUp then
|
|
MoveRobot(RobotX,RobotY-1)
|
|
else RobotError('Ðîáîò: âðåçàëñÿ â âåðõíþþ ñòåíó');
|
|
end;
|
|
|
|
procedure TRobotField.Down;
|
|
begin
|
|
CheckTaskCall;
|
|
if not WallFromDown then
|
|
MoveRobot(RobotX,RobotY+1)
|
|
else RobotError('Ðîáîò: âðåçàëñÿ â íèæíþþ ñòåíó');
|
|
end;
|
|
|
|
procedure TRobotField.Paint;
|
|
begin
|
|
CheckTaskCall;
|
|
Inc(movenum);
|
|
SetSafeLabelStepText('Øàã: ' + IntToStr(movenum));
|
|
// labelStep.Text := 'Øàã: ' + IntToStr(movenum);
|
|
SetPaintUser(RobotX,RobotY);
|
|
DrawCell(RobotX,RobotY);
|
|
end;
|
|
|
|
procedure TRobotField.Pause;
|
|
begin
|
|
Sleep(Interval);
|
|
end;
|
|
|
|
procedure TRobotField.SetDim(DX, DY, CellSz: integer);
|
|
begin
|
|
Clear;
|
|
DimX := DX;
|
|
DimY := DY;
|
|
CellSize := CellSz;
|
|
HorizWall(1,0,DimX);
|
|
HorizWall(1,DimY,DimX);
|
|
VertWall(0,1,DimY);
|
|
VertWall(DimX,1,DimY);
|
|
// DrawCentered;
|
|
end;
|
|
|
|
procedure TRobotField.HorizWall(x,y,len: integer);
|
|
var xx: integer;
|
|
begin
|
|
for xx:=x to x+len-1 do
|
|
HorizWalls[xx,y] := True;
|
|
end;
|
|
|
|
procedure TRobotField.VertWall(x,y,len: integer);
|
|
var yy: integer;
|
|
begin
|
|
for yy:=y to y+len-1 do
|
|
VertWalls[x,yy] := True;
|
|
end;
|
|
|
|
procedure TRobotField.TaskText(s: string);
|
|
begin
|
|
//labelZad.Text := s;
|
|
//labelZad.Invoke(SetSafeText,s);
|
|
SetSafeLabelZadText(s);
|
|
end;
|
|
|
|
procedure TRobotField.SetSpeed(speed: integer);
|
|
begin
|
|
if speed<0 then speed := 0;
|
|
case speed of
|
|
0: Interval := 2*1024;
|
|
1: Interval := 2*512;
|
|
2: Interval := 2*256;
|
|
3: Interval := 2*128;
|
|
4: Interval := 2*64;
|
|
5: Interval := 2*32;
|
|
6: Interval := 2*16;
|
|
7: Interval := 2*8;
|
|
8: Interval := 2*4;
|
|
9: Interval := 2*2;
|
|
10: Interval := 2*1;
|
|
1000: Interval := 0;
|
|
end;
|
|
if speed>10 then speed := 10;
|
|
SetSafeTrackBarSpeedValue(speed);
|
|
end;
|
|
|
|
procedure TRobotField.Stop;
|
|
begin
|
|
buttonStart.Text := 'Ïóñê (Enter)';
|
|
buttonStep.Enabled := True;
|
|
t.Suspend;
|
|
end;
|
|
|
|
procedure TRobotField.Start;
|
|
begin
|
|
buttonStart.Text := 'Ñòîï (Enter)';
|
|
buttonStep.Enabled := False;
|
|
t.Resume;
|
|
end;
|
|
|
|
procedure TRobotField.Clear;
|
|
var x,y: integer;
|
|
begin
|
|
for x:=1 to Max_DimX do
|
|
for y:=0 to Max_DimY do
|
|
HorizWalls[x,y] := False;
|
|
for x:=0 to Max_DimX do
|
|
for y:=1 to Max_DimY do
|
|
VertWalls[x,y] := False;
|
|
for x:=1 to Max_DimX do
|
|
for y:=1 to Max_DimY do
|
|
begin
|
|
Painted[x,y] := 0;
|
|
Tags[x,y] := False;
|
|
end;
|
|
LastRobotX:=1;
|
|
LastRobotY:=1;
|
|
{ HorizWall(1,0,DimX);
|
|
HorizWall(1,DimY,DimX);
|
|
VertWall(0,1,DimY);
|
|
VertWall(DimX,1,DimY);}
|
|
end;
|
|
|
|
function TRobotField.IsSolution: boolean;
|
|
label 1;
|
|
var x,y: integer;
|
|
ID: boolean;
|
|
begin
|
|
ID:=True;
|
|
for x:=1 to DimX do
|
|
for y:=1 to DimY do
|
|
begin
|
|
//ID := ID and (((Tags[x,y]=True) and ((Painted[x,y]=1) or (Painted[x,y]=2))) or ((Tags[x,y]=False) and ((Painted[x,y]=0) or (Painted[x,y]=2))));
|
|
ID := ID and (((Tags[x,y]=True) and (Painted[x,y] in [1,2])) or ((Tags[x,y]=False) and (Painted[x,y] in [0,2])));
|
|
if not ID then goto 1;
|
|
end;
|
|
ID := ID and (RobotX=LastRobotX) and (RobotY=LastRobotY);
|
|
1:
|
|
Result := ID;
|
|
end;
|
|
|
|
//--------- Èíòåðôåéñ è îáðàáîò÷èêè
|
|
procedure LoadIni(var settings: IniSettings);
|
|
var Ini: TIniFile;
|
|
begin
|
|
Ini := new TIniFile(IniFileName);
|
|
settings.Width := Ini.ReadInteger('RobotWindow','Width',679);
|
|
settings.Height := Ini.ReadInteger('RobotWindow','Height',490);
|
|
settings.Left := Ini.ReadInteger('RobotWindow','Left',(Screen.PrimaryScreen.Bounds.Width-settings.Width) div 2);
|
|
settings.Top := Ini.ReadInteger('RobotWindow','Top',(Screen.PrimaryScreen.Bounds.Height-settings.Height) div 2);
|
|
|
|
if settings.Width>screen.PrimaryScreen.Bounds.Width then
|
|
settings.Width := Screen.PrimaryScreen.Bounds.Width;
|
|
|
|
if settings.Height>Screen.PrimaryScreen.Bounds.Height then
|
|
settings.Height := Screen.PrimaryScreen.Bounds.Height;
|
|
|
|
if settings.Left < 0 then
|
|
settings.Left := 0;
|
|
|
|
if settings.Top < 0 then
|
|
settings.Top := 0;
|
|
|
|
if (settings.Left > Screen.PrimaryScreen.Bounds.Width - 10) or
|
|
(settings.Top > Screen.PrimaryScreen.Bounds.Height - 10) then
|
|
begin
|
|
settings.Left := 0;
|
|
settings.Top := 0;
|
|
end;
|
|
|
|
settings.Speed := Ini.ReadInteger('RobotWindow','Speed',3);
|
|
Ini := nil;
|
|
end;
|
|
|
|
procedure SaveIni;
|
|
var Ini: TIniFile;
|
|
begin
|
|
if (MainForm.Left<0) or (MainForm.Top<0) then
|
|
exit;
|
|
Ini := new TIniFile(IniFileName);
|
|
Ini.WriteInteger('RobotWindow','Width',MainForm.Width);
|
|
Ini.WriteInteger('RobotWindow','Height',MainForm.Height);
|
|
Ini.WriteInteger('RobotWindow','Left',MainForm.Left);
|
|
Ini.WriteInteger('RobotWindow','Top',MainForm.Top);
|
|
Ini.WriteInteger('RobotWindow','Speed',trackBarSpeed.Value);
|
|
Ini.Save;
|
|
end;
|
|
|
|
procedure buttonExitClick(o: Object; e: EventArgs);
|
|
begin
|
|
SaveIni;
|
|
halt;
|
|
end;
|
|
|
|
procedure ABCWindowResize(o: Object; e: EventArgs);
|
|
begin
|
|
CorrectWHLT;
|
|
end;
|
|
|
|
procedure MainWindowClose;
|
|
begin
|
|
SaveIni;
|
|
end;
|
|
|
|
procedure buttonStartClick(o: Object; e: EventArgs);
|
|
begin
|
|
if t.ThreadState = System.Threading.ThreadState.Suspended then
|
|
begin
|
|
robField.StepFlag := False;
|
|
labelExState.Text := 'Ðîáîò: Âûïîëíÿþ çàäàíèå';
|
|
robField.Start;
|
|
end
|
|
else
|
|
begin
|
|
robField.StepFlag := True;
|
|
labelExState.Text := 'Ðîáîò: Îñòàíîâèëñÿ';
|
|
robField.Stop;
|
|
end;
|
|
(GraphABCControl as Control).Focus;
|
|
end;
|
|
|
|
procedure buttonStepClick(o: Object; e: EventArgs);
|
|
begin
|
|
robField.StepFlag := True;
|
|
t.Resume;
|
|
(GraphABCControl as Control).Focus;
|
|
labelExState.Text := 'Ðîáîò: Êîìàíäà âûïîëíåíà';
|
|
end;
|
|
|
|
procedure buttonHelpClick(o: Object; e: EventArgs);
|
|
begin
|
|
MessageBox.Show('Ðàçðàáîò÷èê èñïîëíèòåëÿ Ðîáîò: Ìèõàëêîâè÷ Ñ.Ñ., 2002-07 '#10#13#10#13+
|
|
'Êîìàíäû èñïîëíèòåëÿ Ðîáîò:'#10#13+
|
|
' Right - âïðàâî'#10#13+
|
|
' Left - âëåâî'#10#13
|
|
' Up - ââåðõ'#10#13+
|
|
' Down - âíèç'#10#13
|
|
' Paint - çàêðàñèòü òåêóùóþ êëåòêó'#10#13
|
|
' Speed(n) - óñòàíîâèòü ñêîðîñòü n (n=0..10)'#10#13
|
|
' Stop - îñòàíîâèòü Ðîáîòà'#10#13
|
|
' Start - çàïóñòèòü Ðîáîòà'#10#13#10#13
|
|
'Óñëîâèÿ, ïðîâåðÿåìûå èñïîëíèòåëåì Ðîáîò:'#10#13
|
|
' WallFromRight - ñïðàâà ñòåíà'#10#13
|
|
' WallFromLeft - ñëåâà ñòåíà;'#10#13
|
|
' WallFromUp - ñâåðõó ñòåíà;'#10#13
|
|
' WallFromDown - ñíèçó ñòåíà;'#10#13
|
|
' FreeFromRight - ñïðàâà ñâîáîäíî;'#10#13
|
|
' FreeFromLeft - ñëåâà ñâîáîäíî;'#10#13
|
|
' FreeFromUp - ñâåðõó ñâîáîäíî;'#10#13
|
|
' FreeFromDown - ñíèçó ñâîáîäíî;'#10#13
|
|
' CellIsPainted - êëåòêà çàêðàøåíà;'#10#13
|
|
' CellIsFree - êëåòêà íå çàêðàøåíà.'#10#13,
|
|
'Èñïîëíèòåëü Ðîáîò - Ñïðàâêà');
|
|
|
|
(GraphABCControl as Control).Focus;
|
|
end;
|
|
|
|
procedure trackBarSpeedScroll(o: Object; e: EventArgs);
|
|
begin
|
|
robField.SetSpeed(trackBarSpeed.Value);
|
|
end;
|
|
|
|
procedure MainWindowKeyDown(o: Object; e: KeyEventArgs);
|
|
begin
|
|
if (e.KeyCode = Keys.Return) and buttonStart.Enabled then
|
|
buttonStartClick(o,e)
|
|
else if e.KeyCode = Keys.Escape then
|
|
buttonExitClick(o,e)
|
|
else if (e.KeyCode = Keys.Space) and buttonStep.Enabled then
|
|
buttonStepClick(o,e)
|
|
else if (e.KeyCode = Keys.Right) then
|
|
robField.SetSpeed(trackBarSpeed.Value+1)
|
|
else if (e.KeyCode = Keys.Left) then
|
|
robField.SetSpeed(trackBarSpeed.Value-1)
|
|
else if (e.KeyCode = Keys.F1) then
|
|
buttonHelpClick(o,e)
|
|
end;
|
|
|
|
procedure CorrectWHLT;
|
|
var mw,mh: integer;
|
|
begin
|
|
if (RobField.DimX=0) or (RobField.DimY=0) then
|
|
exit;
|
|
mw := (GraphABCControl.Width - 30) div RobField.DimX;
|
|
mh := (GraphABCControl.Height - 20) div RobField.DimY;
|
|
RobField.CellSize := min(mw,mh);
|
|
if RobField.CellSize mod 2 = 1 then
|
|
RobField.CellSize := RobField.CellSize - 1;
|
|
RobField.DrawCentered;
|
|
end;
|
|
|
|
procedure SetTaskCall;
|
|
begin
|
|
TaskIsCalled := True;
|
|
end;
|
|
|
|
procedure InitControls;
|
|
begin
|
|
BottomPanel := new Panel();
|
|
panelBottomLeft := new Panel();
|
|
buttonHelp := new Button();
|
|
buttonExit := new Button();
|
|
buttonStep := new Button();
|
|
buttonStart := new Button();
|
|
tableLayoutPanelBottom := new TableLayoutPanel();
|
|
labelExState := new TLabel();
|
|
groupBoxExState := new GroupBox();
|
|
tableLayoutPanel1 := new TableLayoutPanel();
|
|
labelState := new TLabel();
|
|
labelStep := new TLabel();
|
|
trackBarSpeed := new TrackBar();
|
|
labelSpeed := new TLabel();
|
|
tableLayoutPanelTop := new TableLayoutPanel();
|
|
labelZad := new TLabel();
|
|
// CenterPanel := new Panel();
|
|
|
|
BottomPanel.SuspendLayout();
|
|
panelBottomLeft.SuspendLayout();
|
|
tableLayoutPanelBottom.SuspendLayout();
|
|
groupBoxExState.SuspendLayout();
|
|
tableLayoutPanelTop.SuspendLayout();
|
|
MainForm.SuspendLayout();
|
|
//
|
|
// BottomPanel
|
|
//
|
|
BottomPanel.Controls.Add(panelBottomLeft);
|
|
BottomPanel.Controls.Add(groupBoxExState);
|
|
BottomPanel.Dock := DockStyle.Bottom;
|
|
BottomPanel.Location := new Point(0, 407);
|
|
BottomPanel.Size := new Size(679, 83);
|
|
//
|
|
// panelBottomLeft
|
|
//
|
|
panelBottomLeft.Anchor := ((System.Windows.Forms.AnchorStyles)((integer(System.Windows.Forms.AnchorStyles.Bottom) or integer(System.Windows.Forms.AnchorStyles.Left))));
|
|
panelBottomLeft.Controls.Add(buttonHelp);
|
|
panelBottomLeft.Controls.Add(buttonExit);
|
|
panelBottomLeft.Controls.Add(buttonStep);
|
|
panelBottomLeft.Controls.Add(buttonStart);
|
|
panelBottomLeft.Controls.Add(tableLayoutPanelBottom);
|
|
panelBottomLeft.Location := new Point(0, 0);
|
|
panelBottomLeft.Size := new Size(474, 83);
|
|
//
|
|
// buttonHelp
|
|
//
|
|
buttonHelp.FlatStyle := System.Windows.Forms.FlatStyle.System;
|
|
buttonHelp.Location := new Point(359, 18);
|
|
buttonHelp.Size := new Size(107, 24);
|
|
buttonHelp.TabStop := false;
|
|
buttonHelp.Text := 'Ñïðàâêà (F1)';
|
|
// buttonHelp.UseVisualStyleBackColor := true;
|
|
//
|
|
// buttonExit
|
|
//
|
|
buttonExit.FlatStyle := System.Windows.Forms.FlatStyle.System;
|
|
buttonExit.Location := new System.Drawing.Point(241, 18);
|
|
buttonExit.Size := new System.Drawing.Size(107, 24);
|
|
buttonExit.TabStop := false;
|
|
buttonExit.Text := 'Âûõîä (Esc)';
|
|
// buttonExit.UseVisualStyleBackColor := true;
|
|
//
|
|
// buttonStep
|
|
//
|
|
buttonStep.FlatStyle := FlatStyle.System;
|
|
buttonStep.Location := new Point(123, 18);
|
|
buttonStep.Size := new Size(107, 24);
|
|
buttonStep.TabStop := false;
|
|
buttonStep.Text := 'Øàã (Space)';
|
|
// buttonStep.UseVisualStyleBackColor := true;
|
|
//
|
|
// buttonStart
|
|
//
|
|
buttonStart.FlatStyle := FlatStyle.System;
|
|
buttonStart.Location := new Point(5, 18);
|
|
buttonStart.Size := new Size(107, 24);
|
|
buttonStart.TabStop := false;
|
|
buttonStart.Text := 'Ïóñê (Enter)';
|
|
// buttonStart.UseVisualStyleBackColor := true;
|
|
//
|
|
// tableLayoutPanelBottom
|
|
//
|
|
tableLayoutPanelBottom.BackColor := LabelReadyColor;
|
|
tableLayoutPanelBottom.CellBorderStyle := System.Windows.Forms.TableLayoutPanelCellBorderStyle.Outset;
|
|
tableLayoutPanelBottom.ColumnCount := 1;
|
|
tableLayoutPanelBottom.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50));
|
|
tableLayoutPanelBottom.Controls.Add(labelExState);
|
|
tableLayoutPanelBottom.ForeColor := System.Drawing.Color.White;
|
|
tableLayoutPanelBottom.Location := new Point(4, 52);
|
|
tableLayoutPanelBottom.RowCount := 1;
|
|
tableLayoutPanelBottom.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
|
|
tableLayoutPanelBottom.Size := new Size(463, 23);
|
|
//
|
|
// labelExState
|
|
//
|
|
labelExState.AutoEllipsis := true;
|
|
labelExState.AutoSize := true;
|
|
labelExState.Dock := DockStyle.Fill;
|
|
labelExState.FlatStyle := FlatStyle.System;
|
|
labelExState.Font := new System.Drawing.Font('Microsoft Sans Serif', 8, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
|
|
labelExState.Location := new Point(5, 2);
|
|
labelExState.Margin := new Padding(3, 0, 3, 3);
|
|
labelExState.Size := new Size(453, 15);
|
|
labelExState.Text := 'Ðîáîò: Ãîòîâ';
|
|
labelExState.TextAlign := ContentAlignment.MiddleCenter;
|
|
//
|
|
// groupBoxExState
|
|
//
|
|
groupBoxExState.Controls.Add(tableLayoutPanel1);
|
|
groupBoxExState.Controls.Add(labelState);
|
|
groupBoxExState.Controls.Add(labelStep);
|
|
groupBoxExState.Controls.Add(trackBarSpeed);
|
|
groupBoxExState.Controls.Add(labelSpeed);
|
|
groupBoxExState.Dock := DockStyle.Right;
|
|
groupBoxExState.Location := new Point(475, 0);
|
|
groupBoxExState.Size := new Size(204, 83);
|
|
groupBoxExState.TabStop := false;
|
|
//
|
|
// tableLayoutPanel1
|
|
//
|
|
tableLayoutPanel1.BackColor := LabelDoColor;
|
|
tableLayoutPanel1.CellBorderStyle := TableLayoutPanelCellBorderStyle.Outset;
|
|
tableLayoutPanel1.ColumnCount := 1;
|
|
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(System.Windows.Forms.SizeType.Percent, 50));
|
|
tableLayoutPanel1.Location := new Point(91, 52);
|
|
tableLayoutPanel1.RowCount := 1;
|
|
tableLayoutPanel1.RowStyles.Add(new RowStyle(System.Windows.Forms.SizeType.Percent, 50));
|
|
tableLayoutPanel1.Size := new Size(22, 22);
|
|
//
|
|
// labelState
|
|
//
|
|
labelState.AutoSize := true;
|
|
labelState.Location := new Point(6, 54);
|
|
labelState.Margin := new Padding(0);
|
|
labelState.Size := new Size(83, 17);
|
|
labelState.Text := 'Ñîñòîÿíèå:';
|
|
//
|
|
// labelStep
|
|
//
|
|
labelStep.BackColor := SystemColors.Control;
|
|
labelStep.Font := new System.Drawing.Font('Microsoft Sans Serif', 8, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
|
|
labelStep.ForeColor := System.Drawing.Color.Black;
|
|
labelStep.Location := new Point(130, 54);
|
|
labelStep.Size := new Size(66, 18);
|
|
labelStep.Text := 'Øàã: 0';
|
|
labelStep.TextAlign := ContentAlignment.MiddleLeft;
|
|
//
|
|
// trackBarSpeed
|
|
//
|
|
trackBarSpeed.CausesValidation := false;
|
|
trackBarSpeed.LargeChange := 1;
|
|
trackBarSpeed.Location := new Point(80, 11);
|
|
trackBarSpeed.Size := new Size(121, 53);
|
|
trackBarSpeed.TabStop := false;
|
|
//
|
|
// labelSpeed
|
|
//
|
|
labelSpeed.AutoSize := true;
|
|
labelSpeed.Location := new Point(6, 16);
|
|
labelSpeed.Margin := new Padding(0);
|
|
labelSpeed.Size := new Size(73, 17);
|
|
labelSpeed.Text := 'Ñêîðîñòü:';
|
|
//
|
|
// tableLayoutPanelTop
|
|
//
|
|
tableLayoutPanelTop.BackColor := System.Drawing.Color.FromArgb(238,238,238);
|
|
tableLayoutPanelTop.CellBorderStyle := TableLayoutPanelCellBorderStyle.Outset;
|
|
tableLayoutPanelTop.ColumnCount := 1;
|
|
tableLayoutPanelTop.ColumnStyles.Add(new ColumnStyle(System.Windows.Forms.SizeType.Percent, 50));
|
|
tableLayoutPanelTop.Controls.Add(labelZad);
|
|
tableLayoutPanelTop.Dock := DockStyle.Top;
|
|
tableLayoutPanelTop.Location := new Point(0, 0);
|
|
tableLayoutPanelTop.RowCount := 1;
|
|
tableLayoutPanelTop.RowStyles.Add(new RowStyle(System.Windows.Forms.SizeType.Percent, 50));
|
|
tableLayoutPanelTop.Size := new Size(679, 23);
|
|
//
|
|
// labelZad
|
|
//
|
|
labelZad.AutoEllipsis := true;
|
|
labelZad.AutoSize := true;
|
|
labelZad.Dock := DockStyle.Fill;
|
|
labelZad.FlatStyle := FlatStyle.System;
|
|
labelZad.Font := new System.Drawing.Font('Microsoft Sans Serif', 8, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
|
|
labelZad.ForeColor := SystemColors.HotTrack;
|
|
labelZad.Location := new Point(6, 3);
|
|
labelZad.Margin := new Padding(4, 1, 3, 0);
|
|
labelZad.Size := new Size(668, 14);
|
|
labelZad.Text := 'Çàäàíèå';
|
|
labelZad.TextAlign := ContentAlignment.MiddleLeft;
|
|
//
|
|
// ExecutorForm
|
|
//
|
|
MainForm.BackColor := SystemColors.Control;
|
|
// MainWindow.ClientSize := new Size(679, 490);
|
|
MainForm.Controls.Add(tableLayoutPanelTop);
|
|
MainForm.Controls.Add(BottomPanel);
|
|
MainForm.MinimumSize := new Size(687, 240);
|
|
MainForm.Text := 'Èñïîëíèòåëü Ðîáîò';
|
|
BottomPanel.ResumeLayout(false);
|
|
panelBottomLeft.ResumeLayout(false);
|
|
tableLayoutPanelBottom.ResumeLayout(false);
|
|
tableLayoutPanelBottom.PerformLayout();
|
|
groupBoxExState.ResumeLayout(false);
|
|
groupBoxExState.PerformLayout();
|
|
tableLayoutPanelTop.ResumeLayout(false);
|
|
tableLayoutPanelTop.PerformLayout();
|
|
MainForm.ResumeLayout(false);
|
|
MainForm.PerformLayout();
|
|
MainForm.KeyPreview := True;
|
|
|
|
MainForm.KeyDown += MainWindowKeyDown;
|
|
|
|
(GraphABCControl as Control).Resize += ABCWindowResize;
|
|
buttonStart.Click += buttonStartClick;
|
|
buttonStep.Click += buttonStepClick;
|
|
buttonHelp.Click += buttonHelpClick;
|
|
buttonExit.Click += buttonExitClick;
|
|
trackBarSpeed.Scroll += trackBarSpeedScroll;
|
|
end;
|
|
|
|
procedure NonSafeRobotError(s: string);
|
|
begin
|
|
buttonStart.Enabled := False;
|
|
buttonStep.Enabled := False;
|
|
tableLayoutPanel1.BackColor := LabelErrorColor;
|
|
labelExState.BackColor := LabelErrorColor;
|
|
labelExState.Text := s;
|
|
tableLayoutPanelBottom.BackColor := LabelErrorColor;
|
|
t.Suspend;
|
|
end;
|
|
|
|
procedure RobotError(s: string);
|
|
begin
|
|
buttonStart.Invoke(NonSafeRobotError,s);
|
|
end;
|
|
|
|
procedure RobotError(s,s1: string);
|
|
begin
|
|
//labelZad.Text := s1;
|
|
SetSafeLabelZadText(s1);
|
|
RobotError(s);
|
|
end;
|
|
|
|
procedure SetWindowBounds(rec: System.Drawing.Rectangle);
|
|
begin
|
|
MainForm.Bounds := rec;
|
|
end;
|
|
|
|
// Äîáàâèë - ÌÀ
|
|
procedure ResRB(TaskName: string);
|
|
external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'resrb';
|
|
//
|
|
|
|
procedure FinalizeSafe;
|
|
begin
|
|
buttonStart.Enabled := False;
|
|
buttonStep.Enabled := False;
|
|
if (robField.DimX*robField.DimY=0) then
|
|
RobotError('Ðîáîò: Íå âûçâàíà ïðîöåäóðà Task','Çàäàíèå îòñóòñòâóåò')
|
|
else if robField.IsSolution then
|
|
begin
|
|
tableLayoutPanel1.BackColor := LabelGoodEndColor;
|
|
labelExState.BackColor := LabelGoodEndColor;
|
|
tableLayoutPanelBottom.BackColor := LabelGoodEndColor;
|
|
labelExState.Text := 'Ðîáîò: Çàäàíèå âûïîëíåíî';
|
|
// Äîáàâèë - ÌÀ
|
|
try
|
|
ResRB(robField.TaskName);
|
|
except
|
|
end;
|
|
//
|
|
end
|
|
else labelExState.Text := 'Ðîáîò: Ðàáîòà îêîí÷åíà, çàäàíèå íå âûïîëíåíî';
|
|
end;
|
|
|
|
var
|
|
settings: IniSettings;
|
|
|
|
var __initialized := false;
|
|
var __finalized := false;
|
|
|
|
procedure __InitModule;
|
|
begin
|
|
RPaintColor := RGB(0,200,0);
|
|
RobotColor := RGB(255,255,220);
|
|
RobotColor1 := RGB(200,255,200);
|
|
RBorderColor := RGB(1,1,1);
|
|
BackColor := MainForm.BackColor;
|
|
|
|
LabelReadyColor := RGB(95,109,154);
|
|
LabelDoColor := RGB(95,109,154);
|
|
LabelStopColor := RGB(95,109,154);
|
|
LabelErrorColor := clRed;
|
|
LabelBadEndColor := clBlack;
|
|
LabelGoodEndColor:= RGB(0,156,0);
|
|
|
|
TaskIsCalled := False;
|
|
|
|
Brush.Color := MainForm.BackColor;
|
|
FillRectangle(0,0,1280,1024);
|
|
//MainWindow.Hide;
|
|
//InitControls;
|
|
MainForm.Invoke(InitControls);
|
|
|
|
OnClose := MainWindowClose;
|
|
|
|
// CenterWindow;
|
|
|
|
RobField := new TRobotField(0,0,50);
|
|
// RobField.DrawCentered;
|
|
t := System.Threading.Thread.CurrentThread;
|
|
LoadIni(settings);
|
|
robField.SetSpeed(settings.Speed);
|
|
//MainWindow.Bounds := new System.Drawing.Rectangle(settings.Left,settings.Top,settings.Width,settings.Height);
|
|
MainForm.Invoke(SetWindowBounds, new System.Drawing.Rectangle(settings.Left,settings.Top,settings.Width,settings.Height));
|
|
MainForm.Invoke(MainForm.Show);
|
|
end;
|
|
|
|
procedure __InitModule__;
|
|
begin
|
|
if not __initialized then
|
|
begin
|
|
__initialized := true;
|
|
GraphABC.__InitModule__;
|
|
__InitModule;
|
|
end;
|
|
end;
|
|
|
|
procedure __FinalizeModule;
|
|
begin
|
|
MainForm.Invoke(FinalizeSafe);
|
|
end;
|
|
|
|
procedure __FinalizeModule__;
|
|
begin
|
|
if not __finalized then
|
|
begin
|
|
__finalized := true;
|
|
__FinalizeModule;
|
|
end;
|
|
end;
|
|
|
|
initialization
|
|
__InitModule;
|
|
//MainForm.Show;
|
|
finalization
|
|
{buttonStart.Enabled := False;
|
|
buttonStep.Enabled := False;
|
|
if (robField.DimX*robField.DimY=0) then
|
|
RobotError('Ðîáîò: Íå âûçâàíà ïðîöåäóðà Task','Çàäàíèå îòñóòñòâóåò')
|
|
else if robField.IsSolution then
|
|
begin
|
|
tableLayoutPanel1.BackColor := LabelGoodEndColor;
|
|
labelExState.BackColor := LabelGoodEndColor;
|
|
tableLayoutPanelBottom.BackColor := LabelGoodEndColor;
|
|
labelExState.Text := 'Ðîáîò: Çàäàíèå âûïîëíåíî';
|
|
end
|
|
else labelExState.Text := 'Ðîáîò: Ðàáîòà îêîí÷åíà, çàäàíèå íå âûïîëíåíî';}
|
|
__FinalizeModule;
|
|
end. |