2

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

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

4

2 回答 2

6

一些帮助您入门的建议:

  • 问问自己,广场需要什么样的控制。回答需要对 VCL 有一点了解,但请考虑最明显的控制并在编辑器中按住 ctrl-click 以找到匹配的祖先来解决问题。(提示:TShape这幅画已经画好了,但我不会使用它。)
  • 您是对的,使用Square 数组,然后其余部分将通过 Square 类的方法完成
  • 不,TSquare课程不需要任何形式的意识,也不应该是一种形式。分配这样一个正方形的父级就可以了。
  • 所有控件(即 TControl 类的祖先)都支持鼠标事件/处理。(提示:覆盖MouseMoveDblClick。)
  • 您不一定需要 Graphics32 库。
  • 尽管您的TSquare类不需要注册为组件,但我强烈建议(部分)阅读 Delphi 帮助中的Component Writer's Guide
于 2012-05-02T16:54:30.977 回答
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 事件,如何创建自己的事件

于 2012-05-02T17:33:09.507 回答