2012-05-02 2 views
2

나는 델파이를 더 잘 이해할 수있는 운동을 생각해 냈습니다. 필자가 꼭 알고 싶은 모든 것을 담고있다. 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. 

아주 간단합니다. 드로잉을 담당하는 프래그먼트를 주석 처리했는데 코드 작성법을 모르겠습니다. 클릭 수 및 그림 상자 처리 방법을 여기에 적용하는 방법을 알고 싶습니다. 당신이 얻을 수있는

+2

아니요, 이것은 전혀 어렵지 않습니다. 사실, 나는 전에 여러 번 비슷한 일을했다. 그러나 전체 프로그램을 작성하지 않고도 많은 도움을받는 것이 조금 어렵습니다 ... 그리고 특정 질문에 대해 : 아니요, PAS 파일에는 관련 양식이 없어야합니다. –

+0

Andreas, 나는이 질문을 쓰는 것이 가장 좋은 방법을 몰랐습니다. 나는 완성 된 프로그램을 원하지 않는다. (분석은 또한 도움이 될 수 있지만). 가장 큰 문제는 Square 클래스를 사용하여 PAS 파일에서 클릭을 처리하고 사각형을 그리는 방법입니다. 이것이 어떻게 조직되어야 하는가. 그래서 최선의 도움은 이러한 방법으로 몇 가지 샘플이 될 것입니다. – xan

+0

나는 어떤 건축이 효과가 있을지 모른다. 기본 양식에서 훨씬 쉽습니다. 양식에 뭔가를 떨어 뜨리고 두 번 클릭하십시오. 그런 다음 코드를 편집 할 수 있습니다. 하지만 나는 클릭, 드로잉 및 다른 것들을 처리 할 수있는 클래스를 작성하고 싶습니다. 이 클래스는 프로그램의 기본 폼과 분리되어 있으며 어떻게 이러한 메소드를 실현할 수 있는지 알 수 없습니다. – xan

답변

6

몇 가지 제안을 시작 :

  • 당신이 광장에 필요한 제어의 어떤 종류의 당신 자신에게 물어보세요. 응답을 위해서는 VCL에 대한 약간의 지식이 필요하지만 편집기에서 가장 확실한 제어 및 Ctrl 키를 누른 상태에서 트릭을 수행 할 일치하는 조상을 찾습니다. (힌트 : TShape는 이미 그림을 그리지 만 사용하지는 않습니다.) Square로 배열 한 다음 나머지는 Square 클래스의 방법으로 완성됩니다.
  • 아니요, TSquare 클래스는 양식에 대한 인식을 필요로하지 않으며 하나의 형식이어야합니다. 그런 사각형의 부모를 지정하면 속임수를 쓸 수 있습니다.
  • 모든 컨트롤 (예 : TControl 클래스의 조상)은 마우스 이벤트/처리를 지원합니다. (힌트 : MouseMoveDblClick을 덮어 씁니다.)
  • 반드시 Graphics32 라이브러리가 필요하지는 않습니다.
  • TSquare 클래스를 구성 요소로 등록 할 필요는 없지만 구성 요소 작성자 가이드을 (를) Delphi 도움말에서 읽는 것이 좋습니다.
+2

정말 부드럽고 멋진 그래픽 (2D 또는 3D)을 만들고 싶다면 OpenGL을 추천합니다. OpenGL은 Delphi에서 'OpenGL'단위 덕분에 매우 사용하기 쉽습니다. 다소 단순한 렌더링 요구에도 불구하고 GDI보다 OpenGL이 더 쉬울 수도 있습니다. 물론 결과가 뛰어납니다. –

+1

Delphi를 배우려는 분이라면 OpenGL을 시작해야한다고 생각하지 않습니다. Graphics32는 Delphi-ish보다 길기 때문에 델파이에서 어떻게 작동하는지 알 수있는 더 좋은 방법입니다. OpenGL은 대체로 블랙 박스 인 반면 G32로 모든 코드 행을 단계별로 처리 할 수 ​​있습니다. –

+0

나는 GDI의 위에 객체 지향 계층이며 작업하기가 더 용이 한 GDI +를 추천한다. http://www.bilsen.com/gdiplus/index.shtml에는 우수한 Delphi GDI + wrapper가 있습니다. –

1

좋아, 당신이 초보자 것으로 보이기 때문에, 이것은 당신이 직사각형 (정사각형)을 그릴 수있는 방법을

http://docwiki.embarcadero.com/CodeSamples/en/Rectangle_%28Delphi%29

http://docwiki.embarcadero.com/CodeSamples/en/OnMouseMove_%28Delphi%29

이 이동하는 방법입니다 시작 이니, 나는 당신이 이것을 할 수있는 수업을 가질 때, 당신이 바퀴를 다시 만들어야한다고 생각하지 않는다. 대신, 이미 정의 된 클래스의 조합을 연구 할 수 있습니다.

델파이에서 그래픽으로 시작 - http://delphi.about.com/od/graphics/Delphi_Graphics_Programming.htm. 당신의 큰 문제는 이벤트를이 질문 할 수 있습니다 만드는 방법 것 같다 때문에

나는 또한 당신에게

(A DFM 파일 등 무엇) 기초를 얻기 위해 엠바 카데로 위키 또는 기타 초보자 자료를 제시 도와 드리겠습니다. Delphi event handling, how to create own event

관련 문제