- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须使用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/
回到 Borland C 编译器的基础知识。我不断收到以下消息,这让我发疯,因为我找不到分号应该放在哪里或为什么要分号 >bcc32 -v- -w -O1 oddEven.c Borland C++
我必须使用VCL形式在Delphi中编写程序。正方形,六边形和八边形的三个图形必须移至上边界,然后移至下边界,依此类推。问题是当坐标Y = 0时,当我试图将值放置在条件运算符中以停止移动时,程序冻结了
这里有一个简短的问题: 我正在尝试在 32 位 Windows 7 上使用 Embarcadero C++ Builder XE3 试验内联汇编,特别是为了开始重新自学汇编,以备将来实际应用的可能性。
我找不到与我想问的相匹配的问题。为什么我不能显示 tan (39/180*3.142)?相反,它给了我 0.0000,我需要小数。 void __fastcall TForm1::Button1Cli
随着我对 VS 2010 越来越失望,我试图找到一些替代方案,我正在寻找 Embarcadero 的新版 C++ env。 当 VS 几乎主导市场时,学习新的(我认为不流行的)产品有什么意义吗? 谢谢
我目前正在使用 Codegear RAD Studio 2007。我公司的一位客户决定他会对我们软件的本地化版本感兴趣(俄语 - 我不知道这是否重要,我们将无法使用标准的 Windows 代码页)。作
我现在正在学习,我有这个作业/任务要做: 1) 如果您按下 CTRL + L 键,所有数字符号都应该改变颜色。 2) 如果按 CTRL + S 键,您将获得光标左侧单词的长度。 我找到了这个函数 in
关于下面的C++代码, LengthAlphabeticalSort lengthAlphabeticalSort; outputList.sort(lengthAlphabeticalSort);
我正在使用 Borland c++ 3.1 编译器。我想处理异常,我编写了以下代码: void main (void) { int a = 0; int b = 1; int
我有以下代码: nErgebnisse = new unsigned int*[nInitialVecSize]; for(unsigned int i = 0; i <= nInitialVecSi
这个问题发生在我身上两次。两次都是在使用 Borland C++ 编程时。当我想运行下面的简单代码时:(完全是我写的) int n, total=0, counter=1,average; while
我正在尝试在 Borland 2010 C++ 中创建一些字典。 TDictionary__2 *d = new TDictionary__2(); 我得到错误:[BCC32 错误] Generics
如果是..那么哪个编译器最适合编译它们? 最佳答案 我的同事(不是我自己)在 386 台老式计算机上使用 Borland 编译器。 他经常遇到内存管理问题,必须非常小心地选择在 DOS 中加载哪些驱动
我不确定是否有人使用 Borland c++ 3.1,但我必须这样做。 我有一个程序可以实现简单的线程并通过定时器中断改变这些线程的上下文。 我有一个无限循环和 2 个线程,它们完成各自的工作并在彼此
void empty() { } 将被编译为 push ebp mov ebp, esp ret 如何声明函数使其没有“修饰”代码?只是简单的 ret。如果那不可能,是否可以在 .C 文件中定义完整的
class Register { private: DWORD ax,dx,cx,bx; // POH DWORD bp,sp; DWORD flag,
我支持使用 Borland C++ Builder 5.02(自 1997 年)编写的 C++ 应用程序。 Borland 字符串类上的 find() 方法的行为与我预期的不同: #include
我广泛听说 Borland C++ 5.5 编译器是免费提供的。搜索下载链接通常只会将我带到 embarcadero.com 页面,如果我能弄清楚,我该死的...... 有人知道下载 BCC 5.5
有人知道 Borland C++ rand() 函数的确切实现吗? 我尝试了以下操作,但结果与我使用真正的 TurboC 4.5 得到的结果不一样。当然,我尝试了不同变体的代码,但没有成功。 unsi
我编写了一个程序,使用串行连接与某些硬件进行通信。它以我的方式发送很多十六进制值(传感器读数),并且每隔一段时间它就会发送一个负值。前任。我收到一个十六进制值:FFFFF5D6我必须将其转换为:-26
我是一名优秀的程序员,十分优秀!