我想出了一个让我更好地理解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.
请阅读,这很简单。我评论了负责绘图的片段,我不知道如何编码。我真的想知道如何应用处理点击和绘图框。
答案 0 :(得分:6)
一些建议可以帮助您入门:
TShape
已完成绘画,但我不会使用它。)TSquare
类不需要任何形式的意识,也不应该是一个。分配这样一个正方形的父节点就可以了。MouseMove
和DblClick
。)TSquare
类不需要注册为组件,但我强烈建议(部分)阅读Delphi帮助中的组件编写者指南。答案 1 :(得分:1)
http://docwiki.embarcadero.com/CodeSamples/en/Rectangle_%28Delphi%29
如何移动
http://docwiki.embarcadero.com/CodeSamples/en/OnMouseMove_%28Delphi%29
这是一个开始,我不相信你应该重新发明轮子,当你有可以为你做这个的课程。相反,您可以研究已定义的这些类的组合。
从Delphi中的图形开始 - http://delphi.about.com/od/graphics/Delphi_Graphics_Programming.htm。
我还建议您使用Embarcadero wiki或其他初学者材料以获取基础知识(什么是dfm文件等)
因为看起来您的重大问题是如何创建活动,这个问题可能会对您有所帮助 Delphi event handling, how to create own event