From 8f7e92d41870c5a44c4c65d9dcbde0b26284ff32 Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Mon, 16 Sep 2024 08:25:43 +0300 Subject: [PATCH] =?UTF-8?q?Turtle=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BB=20=D0=BD=D0=B0=20=D0=BF=D0=B0=D1=82=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D0=BD=20=D0=9A=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 +- Release/pabcversion.txt | 2 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- TestSuite/CompilationSamples/Turtle.pas | 293 +++++++++++---------- bin/Lib/Turtle.pas | 293 +++++++++++---------- 6 files changed, 313 insertions(+), 283 deletions(-) diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index cc7c119ad..287179db2 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "10"; public const string Build = "0"; - public const string Revision = "3537"; + public const string Revision = "3538"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 378b391bc..b27bbba93 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%MINOR%=10 -%REVISION%=3537 %COREVERSION%=0 +%REVISION%=3538 +%MINOR%=10 %MAJOR%=3 diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 5a834536e..1d32d49d0 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.10.0.3537 +3.10.0.3538 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 52bcc371e..05b60a355 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.10.0.3537' +!define VERSION '3.10.0.3538' diff --git a/TestSuite/CompilationSamples/Turtle.pas b/TestSuite/CompilationSamples/Turtle.pas index f90a201be..a0276a312 100644 --- a/TestSuite/CompilationSamples/Turtle.pas +++ b/TestSuite/CompilationSamples/Turtle.pas @@ -8,13 +8,16 @@ uses System.Threading.Tasks; type Colors = GraphWPF.Colors; CommandType = (ForwComm,TurnComm,CircleComm,PointComm,PointsComm,UpComm,DownComm,ToPointComm,SetColorComm,SetWidthComm); - Command = record + ICommand = interface + procedure Play(dc: DrawingContext); + end; +{ Command = record typ: CommandType; r,da,x,y: real; points: array of Point; color: GColor; end; - +} var CurrentPen := ColorPen(Colors.Black,1.4); Palette: array of Color := Arr(Colors.Green, Colors.Blue, Colors.Red, Colors.Orange, @@ -269,7 +272,7 @@ var dr := False; // Опущен хвост Черепахи или нет // Команды для "проигрывания" при перерисовке (изменении масштаба и сдвиге) - Commands := new List; + Commands := new List; // Система координат var fso: FS; @@ -285,71 +288,164 @@ var tsk: System.Threading.Tasks.Task := nil; // Задача для перери {$region Функции создания команд для "проигрывания"} -function ForwC(r: real): Command; +{type + Command = record + typ: CommandType; + r,da,x,y: real; + points: array of Point; + color: GColor; + end;} + +{$region Команды Черепахи при "проигрывании"} + +// Сделаем свои команды ForwPlay, TurnPlay, CirclePlay и т.д. + +/// Продвигает Черепаху вперёд на расстояние r +procedure ForwPlay(dc: DrawingContext; r: real); begin - Result.typ := ForwComm; - Result.r := r; + tp += r * Vect(Cos(DegToRad(angle)),Sin(DegToRad(angle))); + if dr then + dc.DrawLine(CurrentPen,Pnt(Pen.X,Pen.Y),fso.RealToScreen(tp)); + fso.MoveToReal(tp.X,tp.Y) end; -function TurnC(da: real): Command; +procedure TurnPlay(da: real); begin - Result.typ := TurnComm; - Result.da := da; + angle -= da; end; -function UpC: Command; +procedure DownPlay; begin - Result.typ := UpComm; + dr := True; +end; + +procedure UpPlay; +begin + dr := False; +end; + +procedure ToPointPlay(x,y: real); +begin + tp := Pnt(x,y); + fso.MoveToReal(tp.X,tp.Y); end; -function DownC: Command; +procedure CirclePlay(dc: DrawingContext; r: real; color: GColor); begin - Result.typ := DownComm; -end; + dc.DrawEllipse(ColorBrush(color),ColorPen(Pen.Color,1),fso.RealToScreen(tp),r * Scale,r * Scale); +end; -function ToPointC(x,y: real): Command; +procedure PointPlay(dc: DrawingContext; x,y: real; color: GColor); begin - Result.typ := ToPointComm; - Result.x := x; - Result.y := y; -end; + dc.DrawEllipse(ColorBrush(color),nil,fso.RealToScreen(Pnt(x,y)),PointRadius,PointRadius); +end; -function CircleC(r: real; c: GColor): Command; +procedure PointsPlay(dc: DrawingContext; points: array of Point; color: GColor); begin - Result.typ := CircleComm; - Result.r := r; - Result.color := c; -end; + var cc := ColorBrush(color); + foreach var p in points do + begin + var pp := fso.RealToScreen(p); + dc.DrawEllipse(cc,nil,pp,PointRadius,PointRadius); + end; +end; -function PointC(x,y: real; c: GColor): Command; +procedure SetWidthPlay(r: real); begin - Result.typ := PointComm; - Result.x := x; - Result.y := y; - Result.color := c; -end; + CurrentPen := ColorPen(Pen.Color,r); +end; -function PointsC(points: array of Point; c: GColor): Command; +procedure SetColorPlay(c: GColor); begin - Result.typ := PointsComm; - Result.points := points; - Result.color := c; -end; + CurrentPen := ColorPen(c,Pen.Width); +end; -function SetWidthC(r: real): Command; -begin - Result.typ := SetWidthComm; - Result.r := r; -end; +{$endregion} + +type + ForwC = auto class(ICommand) + r: real; + public + procedure Play(dc: DrawingContext); + begin + ForwPlay(dc,r); + end; + end; + TurnC = auto class(ICommand) + da: real; + public + procedure Play(dc: DrawingContext); + begin + TurnPlay(da) + end; + end; + UpC = auto class(ICommand) + public + procedure Play(dc: DrawingContext); + begin + UpPlay + end; + end; + DownC = auto class(ICommand) + public + procedure Play(dc: DrawingContext); + begin + DownPlay + end; + end; + ToPointC = auto class(ICommand) + x,y: real; + public + procedure Play(dc: DrawingContext); + begin + ToPointPlay(x,y); + end; + end; + CircleC = auto class(ICommand) + r: real; + c: Color; + public + procedure Play(dc: DrawingContext); + begin + CirclePlay(dc,r,c); + end; + end; + PointC = auto class(ICommand) + x,y: real; + c: Color; + public + procedure Play(dc: DrawingContext); + begin + PointPlay(dc,x,y,c); + end; + end; + PointsC = auto class(ICommand) + points: array of Point; + c: Color; + public + procedure Play(dc: DrawingContext); + begin + PointsPlay(dc,points,c); + end; + end; + SetWidthC = auto class(ICommand) + w: real; + public + procedure Play(dc: DrawingContext); + begin + SetWidthPlay(w); + end; + end; + SetColorC = auto class(ICommand) + c: Color; + public + procedure Play(dc: DrawingContext); + begin + SetColorPlay(c); + end; + end; -function SetColorC(c: GColor): Command; -begin - Result.typ := SetColorComm; - Result.color := c; -end; - - -procedure AddCommand(c: Command); +procedure AddCommand(c: ICommand); begin Commands.Add(c); end; @@ -366,7 +462,7 @@ function Window := GraphWPF.Window; /// Продвигает Черепаху вперёд на расстояние r procedure Forw(r: real); begin - AddCommand(ForwC(r)); + AddCommand(new ForwC(r)); tp += r * Vect(Cos(DegToRad(angle)),Sin(DegToRad(angle))); var p1 := Pnt(Pen.X,Pen.Y); var p2 := fso.RealToScreen(tp); @@ -390,7 +486,7 @@ procedure Back(r: real) := Forw(-r); procedure Turn(da: real); begin angle -= da; - AddCommand(TurnC(da)); + AddCommand(new TurnC(da)); end; /// Поворачивает Черепаху на угол da по часовой стрелке @@ -402,23 +498,21 @@ procedure TurnLeft(da: real) := Turn(-da); /// Опускает хвост Черепахи procedure Down; begin - AddCommand(DownC); + AddCommand(new DownC); dr := True; end; /// Поднимает хвост Черепахи procedure Up; begin - AddCommand(UpC); + AddCommand(new UpC); dr := False; end; -procedure ToPointPlay(x,y: real); forward; - /// Перемещает Черепаху в точку (x,y) procedure ToPoint(x,y: real); begin - AddCommand(ToPointC(x,y)); + AddCommand(new ToPointC(x,y)); tp := Pnt(x,y); fso.MoveToReal(tp.X,tp.Y); end; @@ -427,28 +521,28 @@ end; procedure Circle(r: real); begin fso.CircleReal(r); - AddCommand(CircleC(r,Colors.White)); + AddCommand(new CircleC(r,Colors.White)); end; /// Рисует окружность указанного радиуса и цвета procedure Circle(r: real; color: GColor); begin fso.CircleRealColor(r,color); - AddCommand(CircleC(r,color)); + AddCommand(new CircleC(r,color)); end; /// Рисует точку заданным цветом procedure DrawPoint(x,y: real; color: GColor := Colors.Black); begin fso.PointRealColor(x,y,color); - AddCommand(PointC(x,y,color)); + AddCommand(new PointC(x,y,color)); end; /// Рисует точки заданным цветом procedure DrawPoints(points: array of Point; color: GColor); begin fso.PointsRealColor(points,color); - AddCommand(PointsC(points,color)); + AddCommand(new PointsC(points,color)); end; /// Рисует точки следующим цветом в палитре цветов @@ -500,71 +594,7 @@ begin ToPoint(x,y); end; -{$region Команды Черепахи при "проигрывании"} -// Сделаем свои команды ForwPlay, TurnPlay, CirclePlay и т.д. - -procedure TurnPlay(da: real); -begin - angle -= da; -end; - -/// Продвигает Черепаху вперёд на расстояние r -procedure ForwPlay(dc: DrawingContext; r: real); -begin - tp += r * Vect(Cos(DegToRad(angle)),Sin(DegToRad(angle))); - if dr then - dc.DrawLine(CurrentPen,Pnt(Pen.X,Pen.Y),fso.RealToScreen(tp)); - fso.MoveToReal(tp.X,tp.Y) -end; - -procedure DownPlay; -begin - dr := True; -end; - -procedure UpPlay; -begin - dr := False; -end; - -procedure ToPointPlay(x,y: real); -begin - tp := Pnt(x,y); - fso.MoveToReal(tp.X,tp.Y); -end; - -procedure CirclePlay(dc: DrawingContext; r: real; color: GColor); -begin - dc.DrawEllipse(ColorBrush(color),ColorPen(Pen.Color,1),fso.RealToScreen(tp),r * Scale,r * Scale); -end; - -procedure PointPlay(dc: DrawingContext; x,y: real; color: GColor); -begin - dc.DrawEllipse(ColorBrush(color),nil,fso.RealToScreen(Pnt(x,y)),PointRadius,PointRadius); -end; - -procedure PointsPlay(dc: DrawingContext; points: array of Point; color: GColor); -begin - var cc := ColorBrush(color); - foreach var p in points do - begin - var pp := fso.RealToScreen(p); - dc.DrawEllipse(cc,nil,pp,PointRadius,PointRadius); - end; -end; - -procedure SetWidthPlay(r: real); -begin - CurrentPen := ColorPen(Pen.Color,r); -end; - -procedure SetColorPlay(c: GColor); -begin - CurrentPen := ColorPen(c,Pen.Width); -end; - -{$endregion} var cansellation := False; @@ -573,22 +603,7 @@ begin FastDraw(dc -> begin dc.PushClip(new System.Windows.Media.RectangleGeometry(Rect(fso.x,fso.y,fso.w,fso.h))); foreach var command in commands do - begin - {if cansellation then - break;} - case command.Typ of - ForwComm: ForwPlay(dc,command.r); - TurnComm: TurnPlay(command.da); - UpComm: UpPlay; - DownComm: DownPlay; - ToPointComm: ToPointPlay(command.x,command.y); - CircleComm: CirclePlay(dc,command.r,command.color); - PointComm: PointPlay(dc,command.x,command.y,command.color); - PointsComm: PointsPlay(dc,command.points,command.color); - SetWidthComm: SetWidthPlay(command.r); - SetColorComm: SetColorPlay(command.color); - end; - end; + command.Play(dc); dc.Pop; end); end; diff --git a/bin/Lib/Turtle.pas b/bin/Lib/Turtle.pas index f90a201be..a0276a312 100644 --- a/bin/Lib/Turtle.pas +++ b/bin/Lib/Turtle.pas @@ -8,13 +8,16 @@ uses System.Threading.Tasks; type Colors = GraphWPF.Colors; CommandType = (ForwComm,TurnComm,CircleComm,PointComm,PointsComm,UpComm,DownComm,ToPointComm,SetColorComm,SetWidthComm); - Command = record + ICommand = interface + procedure Play(dc: DrawingContext); + end; +{ Command = record typ: CommandType; r,da,x,y: real; points: array of Point; color: GColor; end; - +} var CurrentPen := ColorPen(Colors.Black,1.4); Palette: array of Color := Arr(Colors.Green, Colors.Blue, Colors.Red, Colors.Orange, @@ -269,7 +272,7 @@ var dr := False; // Опущен хвост Черепахи или нет // Команды для "проигрывания" при перерисовке (изменении масштаба и сдвиге) - Commands := new List; + Commands := new List; // Система координат var fso: FS; @@ -285,71 +288,164 @@ var tsk: System.Threading.Tasks.Task := nil; // Задача для перери {$region Функции создания команд для "проигрывания"} -function ForwC(r: real): Command; +{type + Command = record + typ: CommandType; + r,da,x,y: real; + points: array of Point; + color: GColor; + end;} + +{$region Команды Черепахи при "проигрывании"} + +// Сделаем свои команды ForwPlay, TurnPlay, CirclePlay и т.д. + +/// Продвигает Черепаху вперёд на расстояние r +procedure ForwPlay(dc: DrawingContext; r: real); begin - Result.typ := ForwComm; - Result.r := r; + tp += r * Vect(Cos(DegToRad(angle)),Sin(DegToRad(angle))); + if dr then + dc.DrawLine(CurrentPen,Pnt(Pen.X,Pen.Y),fso.RealToScreen(tp)); + fso.MoveToReal(tp.X,tp.Y) end; -function TurnC(da: real): Command; +procedure TurnPlay(da: real); begin - Result.typ := TurnComm; - Result.da := da; + angle -= da; end; -function UpC: Command; +procedure DownPlay; begin - Result.typ := UpComm; + dr := True; +end; + +procedure UpPlay; +begin + dr := False; +end; + +procedure ToPointPlay(x,y: real); +begin + tp := Pnt(x,y); + fso.MoveToReal(tp.X,tp.Y); end; -function DownC: Command; +procedure CirclePlay(dc: DrawingContext; r: real; color: GColor); begin - Result.typ := DownComm; -end; + dc.DrawEllipse(ColorBrush(color),ColorPen(Pen.Color,1),fso.RealToScreen(tp),r * Scale,r * Scale); +end; -function ToPointC(x,y: real): Command; +procedure PointPlay(dc: DrawingContext; x,y: real; color: GColor); begin - Result.typ := ToPointComm; - Result.x := x; - Result.y := y; -end; + dc.DrawEllipse(ColorBrush(color),nil,fso.RealToScreen(Pnt(x,y)),PointRadius,PointRadius); +end; -function CircleC(r: real; c: GColor): Command; +procedure PointsPlay(dc: DrawingContext; points: array of Point; color: GColor); begin - Result.typ := CircleComm; - Result.r := r; - Result.color := c; -end; + var cc := ColorBrush(color); + foreach var p in points do + begin + var pp := fso.RealToScreen(p); + dc.DrawEllipse(cc,nil,pp,PointRadius,PointRadius); + end; +end; -function PointC(x,y: real; c: GColor): Command; +procedure SetWidthPlay(r: real); begin - Result.typ := PointComm; - Result.x := x; - Result.y := y; - Result.color := c; -end; + CurrentPen := ColorPen(Pen.Color,r); +end; -function PointsC(points: array of Point; c: GColor): Command; +procedure SetColorPlay(c: GColor); begin - Result.typ := PointsComm; - Result.points := points; - Result.color := c; -end; + CurrentPen := ColorPen(c,Pen.Width); +end; -function SetWidthC(r: real): Command; -begin - Result.typ := SetWidthComm; - Result.r := r; -end; +{$endregion} + +type + ForwC = auto class(ICommand) + r: real; + public + procedure Play(dc: DrawingContext); + begin + ForwPlay(dc,r); + end; + end; + TurnC = auto class(ICommand) + da: real; + public + procedure Play(dc: DrawingContext); + begin + TurnPlay(da) + end; + end; + UpC = auto class(ICommand) + public + procedure Play(dc: DrawingContext); + begin + UpPlay + end; + end; + DownC = auto class(ICommand) + public + procedure Play(dc: DrawingContext); + begin + DownPlay + end; + end; + ToPointC = auto class(ICommand) + x,y: real; + public + procedure Play(dc: DrawingContext); + begin + ToPointPlay(x,y); + end; + end; + CircleC = auto class(ICommand) + r: real; + c: Color; + public + procedure Play(dc: DrawingContext); + begin + CirclePlay(dc,r,c); + end; + end; + PointC = auto class(ICommand) + x,y: real; + c: Color; + public + procedure Play(dc: DrawingContext); + begin + PointPlay(dc,x,y,c); + end; + end; + PointsC = auto class(ICommand) + points: array of Point; + c: Color; + public + procedure Play(dc: DrawingContext); + begin + PointsPlay(dc,points,c); + end; + end; + SetWidthC = auto class(ICommand) + w: real; + public + procedure Play(dc: DrawingContext); + begin + SetWidthPlay(w); + end; + end; + SetColorC = auto class(ICommand) + c: Color; + public + procedure Play(dc: DrawingContext); + begin + SetColorPlay(c); + end; + end; -function SetColorC(c: GColor): Command; -begin - Result.typ := SetColorComm; - Result.color := c; -end; - - -procedure AddCommand(c: Command); +procedure AddCommand(c: ICommand); begin Commands.Add(c); end; @@ -366,7 +462,7 @@ function Window := GraphWPF.Window; /// Продвигает Черепаху вперёд на расстояние r procedure Forw(r: real); begin - AddCommand(ForwC(r)); + AddCommand(new ForwC(r)); tp += r * Vect(Cos(DegToRad(angle)),Sin(DegToRad(angle))); var p1 := Pnt(Pen.X,Pen.Y); var p2 := fso.RealToScreen(tp); @@ -390,7 +486,7 @@ procedure Back(r: real) := Forw(-r); procedure Turn(da: real); begin angle -= da; - AddCommand(TurnC(da)); + AddCommand(new TurnC(da)); end; /// Поворачивает Черепаху на угол da по часовой стрелке @@ -402,23 +498,21 @@ procedure TurnLeft(da: real) := Turn(-da); /// Опускает хвост Черепахи procedure Down; begin - AddCommand(DownC); + AddCommand(new DownC); dr := True; end; /// Поднимает хвост Черепахи procedure Up; begin - AddCommand(UpC); + AddCommand(new UpC); dr := False; end; -procedure ToPointPlay(x,y: real); forward; - /// Перемещает Черепаху в точку (x,y) procedure ToPoint(x,y: real); begin - AddCommand(ToPointC(x,y)); + AddCommand(new ToPointC(x,y)); tp := Pnt(x,y); fso.MoveToReal(tp.X,tp.Y); end; @@ -427,28 +521,28 @@ end; procedure Circle(r: real); begin fso.CircleReal(r); - AddCommand(CircleC(r,Colors.White)); + AddCommand(new CircleC(r,Colors.White)); end; /// Рисует окружность указанного радиуса и цвета procedure Circle(r: real; color: GColor); begin fso.CircleRealColor(r,color); - AddCommand(CircleC(r,color)); + AddCommand(new CircleC(r,color)); end; /// Рисует точку заданным цветом procedure DrawPoint(x,y: real; color: GColor := Colors.Black); begin fso.PointRealColor(x,y,color); - AddCommand(PointC(x,y,color)); + AddCommand(new PointC(x,y,color)); end; /// Рисует точки заданным цветом procedure DrawPoints(points: array of Point; color: GColor); begin fso.PointsRealColor(points,color); - AddCommand(PointsC(points,color)); + AddCommand(new PointsC(points,color)); end; /// Рисует точки следующим цветом в палитре цветов @@ -500,71 +594,7 @@ begin ToPoint(x,y); end; -{$region Команды Черепахи при "проигрывании"} -// Сделаем свои команды ForwPlay, TurnPlay, CirclePlay и т.д. - -procedure TurnPlay(da: real); -begin - angle -= da; -end; - -/// Продвигает Черепаху вперёд на расстояние r -procedure ForwPlay(dc: DrawingContext; r: real); -begin - tp += r * Vect(Cos(DegToRad(angle)),Sin(DegToRad(angle))); - if dr then - dc.DrawLine(CurrentPen,Pnt(Pen.X,Pen.Y),fso.RealToScreen(tp)); - fso.MoveToReal(tp.X,tp.Y) -end; - -procedure DownPlay; -begin - dr := True; -end; - -procedure UpPlay; -begin - dr := False; -end; - -procedure ToPointPlay(x,y: real); -begin - tp := Pnt(x,y); - fso.MoveToReal(tp.X,tp.Y); -end; - -procedure CirclePlay(dc: DrawingContext; r: real; color: GColor); -begin - dc.DrawEllipse(ColorBrush(color),ColorPen(Pen.Color,1),fso.RealToScreen(tp),r * Scale,r * Scale); -end; - -procedure PointPlay(dc: DrawingContext; x,y: real; color: GColor); -begin - dc.DrawEllipse(ColorBrush(color),nil,fso.RealToScreen(Pnt(x,y)),PointRadius,PointRadius); -end; - -procedure PointsPlay(dc: DrawingContext; points: array of Point; color: GColor); -begin - var cc := ColorBrush(color); - foreach var p in points do - begin - var pp := fso.RealToScreen(p); - dc.DrawEllipse(cc,nil,pp,PointRadius,PointRadius); - end; -end; - -procedure SetWidthPlay(r: real); -begin - CurrentPen := ColorPen(Pen.Color,r); -end; - -procedure SetColorPlay(c: GColor); -begin - CurrentPen := ColorPen(c,Pen.Width); -end; - -{$endregion} var cansellation := False; @@ -573,22 +603,7 @@ begin FastDraw(dc -> begin dc.PushClip(new System.Windows.Media.RectangleGeometry(Rect(fso.x,fso.y,fso.w,fso.h))); foreach var command in commands do - begin - {if cansellation then - break;} - case command.Typ of - ForwComm: ForwPlay(dc,command.r); - TurnComm: TurnPlay(command.da); - UpComm: UpPlay; - DownComm: DownPlay; - ToPointComm: ToPointPlay(command.x,command.y); - CircleComm: CirclePlay(dc,command.r,command.color); - PointComm: PointPlay(dc,command.x,command.y,command.color); - PointsComm: PointsPlay(dc,command.points,command.color); - SetWidthComm: SetWidthPlay(command.r); - SetColorComm: SetColorPlay(command.color); - end; - end; + command.Play(dc); dc.Pop; end); end;