나는 델파이를 더 잘 이해할 수있는 운동을 생각해 냈습니다. 필자가 꼭 알고 싶은 모든 것을 담고있다. Graphics32 구성 요소 (TRect, TPaintBox32 등) 및 Borland Delphi 7을 사용하고 있습니다.델파이에서 움직일 수있는 많은 사각형
연습. 프로그램의 기본 형식에서 사각형 (색상, 크기, 화면상의 위치를 이전에 생성자로 설정 한 것과 같은 매개 변수 사용)을 그릴 수있는 사각형 스퀘어 (프로그램의 기본 형식과 다른 .pas 파일에 있음)를 작성하십시오. 사각형을 두 번 클릭하면 색상이 임의의 색상으로 변경됩니다. 우리가 클릭을 놓을 때까지 마우스로이 사각형을 움직일 수 있어야합니다.
내가 보는 방식 : 프로그램의 기본 형식으로 Square 배열을 만들고 나머지는 Square 클래스의 메서드로 완성합니다. 그러나 이것이 가능한지 나는 모른다. 그림 그리기, 클릭 처리는 나에게 매우 문제가되는 것처럼 보입니다. Square 클래스는 별도의 양식 (.dfm 파일)이 필요합니까?
매우 도움이 될 것입니다.
편집 : 정사각형의 중심과 테두리는 다른 색상이어야합니다. 또한 테두리 색상의 사각형 가운데에 가로선을 추가하는 것이 좋습니다.
EDIT2 : 내 프로그램에 힌트를 적용하는 방법을 모르겠습니다. 어쩌면 어떤 코드에 도움이 될 것입니다.
여기나는 브라운 운동 symulate 할 수 있어야 평방 나타내는 클래스 박스있어 :
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.
그리고 메인 폼 코드 : 단위 유니트 1을;
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.
아주 간단합니다. 드로잉을 담당하는 프래그먼트를 주석 처리했는데 코드 작성법을 모르겠습니다. 클릭 수 및 그림 상자 처리 방법을 여기에 적용하는 방법을 알고 싶습니다. 당신이 얻을 수있는
아니요, 이것은 전혀 어렵지 않습니다. 사실, 나는 전에 여러 번 비슷한 일을했다. 그러나 전체 프로그램을 작성하지 않고도 많은 도움을받는 것이 조금 어렵습니다 ... 그리고 특정 질문에 대해 : 아니요, PAS 파일에는 관련 양식이 없어야합니다. –
Andreas, 나는이 질문을 쓰는 것이 가장 좋은 방법을 몰랐습니다. 나는 완성 된 프로그램을 원하지 않는다. (분석은 또한 도움이 될 수 있지만). 가장 큰 문제는 Square 클래스를 사용하여 PAS 파일에서 클릭을 처리하고 사각형을 그리는 방법입니다. 이것이 어떻게 조직되어야 하는가. 그래서 최선의 도움은 이러한 방법으로 몇 가지 샘플이 될 것입니다. – xan
나는 어떤 건축이 효과가 있을지 모른다. 기본 양식에서 훨씬 쉽습니다. 양식에 뭔가를 떨어 뜨리고 두 번 클릭하십시오. 그런 다음 코드를 편집 할 수 있습니다. 하지만 나는 클릭, 드로잉 및 다른 것들을 처리 할 수있는 클래스를 작성하고 싶습니다. 이 클래스는 프로그램의 기본 폼과 분리되어 있으며 어떻게 이러한 메소드를 실현할 수 있는지 알 수 없습니다. – xan