德尔福有很多可移动的方块

时间:2012-05-02 16:20:35

标签: delphi

我想出了一个让我更好地理解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.

请阅读,这很简单。我评论了负责绘图的片段,我不知道如何编码。我真的想知道如何应用处理点击和绘图框。

2 个答案:

答案 0 :(得分:6)

一些建议可以帮助您入门:

  • 问问自己这个广场需要什么样的控制。回答时需要对VCL有一点了解,但是在编辑器中考虑最明显的控制和ctrl-click来找到一个匹配的祖先来完成这个技巧。 (提示:TShape已完成绘画,但我不会使用它。)
  • 你是正确的,使用数组的Square,然后其余的将由Square类的方法完成。
  • 不,TSquare类不需要任何形式的意识,也不应该是一个。分配这样一个正方形的父节点就可以了。
  • 所有控件(即TControl类的祖先)都支持鼠标事件/处理。 (提示:覆盖MouseMoveDblClick。)
  • 您不一定需要Graphics32库。
  • 虽然您的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