gpt4 book ai didi

delphi - Borland Delphi:如何调试该程序?

转载 作者:行者123 更新时间:2023-12-03 18:57:09 26 4
gpt4 key购买 nike

我必须使用VCL形式在Delphi中编写程序。正方形,六边形和八边形的三个图形必须移至上边界,然后移至下边界,依此类推。问题是当坐标Y = 0时,当我试图将值放置在条件运算符中以停止移动时,程序冻结了。例如,如果我将value = 180放置,它会(奇怪地)起作用。

unit Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TMainForm = class(TForm)
Image: TImage;
BeginButton: TButton;
EndButton: TButton;
Timer1: TTimer;
Edit1: TEdit;
procedure FormActivate(Sender: TObject);
procedure BeginButtonClick(Sender: TObject);
procedure EndButtonClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

uses Figure;

{$R *.dfm}
Var
t:single=0.0;
L:TSquare;
S:THexagon;
C:TOctagon;
Moving:Boolean=true;

procedure TMainForm.FormActivate(Sender: TObject);
begin
Image.Canvas.Brush.Color:=clWhite;
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
begin
L.Move(t);
S.Move(-0.2*t);
C.Move(0.5*t);
t:=t+0.5;
end;

procedure TMainForm.BeginButtonClick(Sender: TObject);
begin
L:=TSquare.Create(60,35,Image);
S:=THexagon.Create(180,100,Image);
C:=TOctagon.Create(300,100,Image);
Timer1.Enabled:=true;
end;

procedure TMainForm.EndButtonClick(Sender: TObject);
begin
Close;
end;

initialization

finalization
L.Free;
S.Free;
C.Free;

end.


第二单元:

Unit Figure;
Interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
Type
TFigure=Class
private x,y, b,
dx:integer;
Image:TImage;
procedure Draw;virtual;abstract;
procedure Rel(t:real);virtual;
public
constructor Create(ax,ay:integer;aImage:TImage);
procedure Move(t:single);
end;

THexagon=Class(TFigure)
private procedure Draw;override;
end;

TSquare=Class(TFigure)
private procedure Draw;override;
end;

TOctagon=Class(TFigure)
private procedure Draw;override;
end;


Implementation

Constructor TFigure.Create;
Begin
inherited Create;
x:=ax; y:=ay; Image:=aImage;
End;

Procedure TFigure.Rel;
Begin
dx:=5*round(t);
End;

Procedure TFigure.Move;
Begin
Image.Canvas.Pen.Color:=clWhite;
Draw;
Image.Canvas.Pen.Color:=clBlack;
Rel(t);
Draw;
End;

Procedure TSquare.Draw;
Begin
b:=70;
Image.Canvas.MoveTo(x+round(0.5*b),y-round(0.5*b));
Image.Canvas.LineTo(x-round(0.5*b),y-round(0.5*b));
Image.Canvas.LineTo(x-round(0.5*b),y+round(0.5*b));
Image.Canvas.LineTo(x+round(0.5*b),y+round(0.5*b));
Image.Canvas.LineTo(x+round(0.5*b),y-round(0.5*b));
End;

Procedure THexagon.Draw;
Begin
b:=70;
repeat
begin
Image.Canvas.MoveTo(x+round(0.5*b),y+dx);
Image.Canvas.LineTo(x+round(0.25*b),y+round(0.5*b)+dx);
Image.Canvas.LineTo(x-round(0.25*b),y+round(0.5*b)+dx);
Image.Canvas.LineTo(x-round(0.5*b),y+dx);
Image.Canvas.LineTo(x-round(0.25*b),y-round(0.5*b)+dx);
Image.Canvas.LineTo(x+round(0.25*b),y-round(0.5*b)+dx);
Image.Canvas.LineTo(x+round(0.5*b),y+dx);
end;
until ((y+round(0.5*b)+dx)<180);
End;




Procedure TOctagon.Draw;
var
I: Integer;
p: array[1..9] of tpoint;
u:extended;
Begin
x:=300;
y:=100;
u:=0;
for I := 1 to 8 do
begin
p[i].X:=x+round(40*cos(u));
p[i].Y:=y-round(40*sin(u));
u:=u+pi/4;
end;
repeat
begin
Image.Canvas.MoveTo(p[8].x,p[8].y-dx);
for I := 1 to 8 do
Image.Canvas.LineTo(p[i].X,p[i].y-dx);
end;
until (p[3].y>50);

End;
end.

最佳答案

Delphi带有集成的调试器。您应该使用它。这是开始调查程序似乎挂起的情况的方法。


使用“播放”按钮在调试器的控制下启动程序。
重现您要调查的情况。
程序挂起时,切换到调试器,然后按“暂停”按钮。调试器将中断程序的执行,因此您可以调查当前状态。
查看调用堆栈。 (如果调用堆栈窗口尚不可见,则可以使用IDE中的“调试窗口”菜单选项来显示它。)

调用堆栈将显示程序已调用的函数的列表。堆栈的顶部将是您暂停时程序正在运行的功能。它下面的函数将是调用当前函数的函数,依此类推,直到到达堆栈底部为止,该堆栈代表程序的主要功能。

您停止的功能可能不会是您编写的。相反,它通常是OS或Delphi运行时库提供的功能。您不想调试那些。通常,您可以假定它们已经正常工作。您正在寻找代码中的错误。
使用“运行直到返回”命令使最顶层的函数继续运行。重复该过程,直到达到调用堆栈中的功能之一。这可能是罪魁祸首。


现在您已经确定了有问题的功能,是时候进一步研究它了。


使用“ step over”调试器命令来逐个运行函数的每一行。 (还有一个“进入”命令,但是它将进入您不属于的功能,并且您现在对那些功能不感兴趣。)
观察代码中变量的当前值。您可以将鼠标悬停在变量上,以使调试器在工具提示中显示其值,也可以使用“监视”调试窗口一次显示多个变量。它们会在您程序的每个步骤之后进行更新。

注意变量的值。您应该已经对它们的值在程序过程中如何发展有了一些期望。在编写代码时,您可能会想到这种进展。回想一下当时的情况,并将您在调试器中观察到的结果与以前的期望进行比较。他们匹配吗?如果是这样,请继续单步执行代码。但是,如果它们不匹配,则说明您发现了一个错误。修理它。

意外行为的另一个来源是达到程序中您未曾期望达到的目标。也许程序调用了它不应该具有的功能,或者您可能希望执行多次循环。如果您可以找出原因,请修复该错误。否则,您可能需要备份一些方法。
在您观察到异常行为的地方,早点确定程序中的一点。在代码编辑器的左边距中查找蓝点。这些点代表可以设置断点的位置。单击其中一个点,您应该注意到该行已突出显示(可能为红色)。
终止程序,然后再次运行。

这次,您应该看到调试器在程序挂起之前停止,因为执行将首先到达断点。调试器在那里中断程序。
和以前一样,逐步遍历代码行,并注意导致程序偏离预期执行路径的情况。确定错误后,进行修复。

关于delphi - Borland Delphi:如何调试该程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28813806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com