我想出了一个练习,可以让我更好地理解 Delphi。它包含了我必须想知道的所有事情。我正在使用 Graphics32 组件(TRect、TPaintBox32 等)和 Borland Delphi 7。
锻炼。编写一个 Square 类(最好在与程序的主要形式不同的 .pas 文件中),它允许在程序的主要形式上绘制正方形(具有先前在构造函数中设置的屏幕上的颜色、大小、位置等参数)。双击某个正方形应将其颜色更改为随机颜色。当我们单击并按住某个方块时,我们应该能够用鼠标移动这个方块,直到我们释放单击。
我的看法:在程序的主要形式中,我将创建 Square 数组,然后其余的将由 Square 类的方法完成。但我不知道这是否可能?绘制正方形,处理点击在我看来是非常有问题的。Square 类是否需要单独的表格(.dfm 文件)?
我将非常感谢您的帮助。
编辑:正方形的中心和它的边界应该是不同的颜色。此外,最好在正方形中间添加一条边框颜色的水平线。
EDIT2:我不知道如何将您的提示应用到我的程序中。也许在一些代码上会更容易帮助我。
在这里,我有一个 Box 类,它代表应该能够模拟布朗运动的正方形:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, GR32, GR32_Image, ExtCtrls, StdCtrls;
type
Box = class
private
speed:TTimer;
liveTime:TTimer;
isAlive:boolean;
rect:TRect;
live:integer;
public
//procedure PaintBox321PaintBuffer(Sender: TObject);
procedure liveTimeTimer(Sender: TObject);
procedure speedTimer(Sender: TObject);
function color():TColor32;
constructor Create();
end;
implementation
constructor Box.Create();
var x,y:integer;
begin
x:=random(900); y:=random(420);
rect:=MakeRect(x,y,x+30,y+30);
isAlive:=true; live:=random(26)+5;
liveTime := TTimer.Create(nil);
speed := TTimer.Create(nil);
liveTime.interval:=1000;
speed.interval:=live*100;
liveTime.OnTimer := liveTimeTimer;
speed.OnTimer := speedTimer;
end;
{
procedure Box.PaintBox321PaintBuffer(Sender: TObject);
begin
if isAlive then begin
PaintBox321.Buffer.Clear(Color32(255,255,255,125));
PaintBox321.Buffer.FillRectS(rect, color());
end;
end;
}
procedure Box.liveTimeTimer(Sender: TObject);
begin
if isAlive then begin
live:=live-1;
if live=0 then isAlive:=false;
end;
end;
procedure Box.speedTimer(Sender: TObject);
begin
if isAlive then begin
OffsetRect(rect, 3*(random(3)-1), 3*(random(3)-1));
speed.interval:=live*100;
//PaintBox321.Repaint;
end;
end;
function Box.color():TColor32;
begin
color:=Color32(255-live*5,255-live*5,255-live*5,125);
end;
end.
及主要形式代号:单元Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, GR32, GR32_Image, ExtCtrls, StdCtrls, Unit2;
type
TForm1 = class(TForm)
PaintBox321: TPaintBox32;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure PaintBox321PaintBuffer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1:TForm1;
Boxes:array of Box;
BoxesNumber:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
BoxesNumber:=-1;
end;
procedure TForm1.PaintBox321PaintBuffer(Sender: TObject);
begin
PaintBox321.Buffer.Clear(Color32(255,255,255,125));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
BoxesNumber:=BoxesNumber+1;
SetLength(Boxes, BoxesNumber+1);
Boxes[BoxesNumber]:=Box.Create();
end;
end.
请阅读它,它非常简单。我评论了负责绘图的片段,我不知道如何编码。我真的很想知道如何在这里应用处理点击和绘图框。