pascalabcnet/TestSuite/CompilationSamples/RobotField.pas
Бондарев Иван 59169b5168 ...
2015-06-27 18:33:50 +02:00

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.