2013년 3월 15일 금요일

델파이 3장 - 1

3장 제목은 컴포넌트와 친해지기 이다.
그 중 이번에는 그림판을 만들 것이다.
그 전에 컴포넌트가 뭐로 구성되어 있는지 알아보자.

  • 프로퍼티(Propperty)
응용프로그램에서 컴포넌트가 표시되고 제어되는 방법에 대한 제어 요소, 컴포넌트의 속성을 의미함. (예)색상, 글씨체, 크기 등등

  • 이벤트(Event)
컴포넌트가 인식할 수 있는 사용자 행의 혹은 시스템 동작. (예)클릭, 더블클릭, 키보드입력

  • 메소드(Method)
컴포넌트 안에 정의되어 있는 프로시저나 함수를 말함.
---------------------------------------------------------------------------------
먼저 아래와 같이 폼을 만들자.

델파이는 컴포넌트가 너무 많아서 검색 기능을 잘 활용해야한다.

오른쪽 위에 있는 컴포넌트는 TColorGrid이다.
오른쪽 아래에 있는 컴포넌트는 TListBox다. (T는 왜 다 붙는거야 ㅡ.ㅡ)
큰 점선의 직사각형은 TImage 다.
위에 메뉴는 TMainMenu 다.

리스트 박스는 Items를 누르고 1~9까지 입력한다.
메인메뉴에는 Clear, Open, Save As, Exit를 입력한다.

폼이 완성 되었으면 코딩을 하자. 아래는 전체 소스다.
---------------------------------------------------------------------------------

unit UImageEditor;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ColorGrd,
  Vcl.ExtCtrls, Vcl.Menus;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    Clear1: TMenuItem;
    Open1: TMenuItem;
    SaveAs1: TMenuItem;
    Exit1: TMenuItem;
    Image1: TImage;
    ColorGrid1: TColorGrid;
    ListBox1: TListBox;
    procedure Clear1Click(Sender: TObject);
    procedure Open1Click(Sender: TObject);
    procedure SaveAs1Click(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Clear1Click(Sender: TObject);
begin
  Image1.Picture.Bitmap.Assign(Nil);
  FormCreate(Self);
end;

procedure TForm1.Exit1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Picture.Bitmap.Width := Image1.Width;
  Image1.Picture.Bitmap.Height := Image1.Height;
  ListBox1.ItemIndex := 0;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  //마우스의 움직임에 따라 캔버스에 그림이 그려짐
  Image1.Picture.Bitmap.Canvas.MoveTo(X,Y);
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  //마우스 왼쪽 버튼으로 그림을 그림니다.
  if Shift = [sSleft] then //[sSleft], [sSright], [sSAlt], [sSCtrl]등 원하는 키를 설정
  begin
    //펜 굵기 지정 ListBox에서 선택한 크기 만큼 굵기가 변함
    Image1.Picture.Bitmap.Canvas.Pen.Width := StrToInt(ListBox1.Items [ListBox1.ItemIndex]);
    //펜의 색상 지정: ColorGrid에서 선택된 색상으로 변함
    Image1.Picture.Bitmap.Canvas.Pen.Color := ColorGrid1.ForegroundColor;
    //캔버스에 그려진 라인에 따라 Image1 화면에 나타납니다.
    Image1.Picture.Bitmap.Canvas.LineTo(X,Y);
  end;
end;

procedure TForm1.Open1Click(Sender: TObject);
var
  OD:TOpenDialog;
begin
  OD := TOpenDialog.Create(Self);
  OD.Filter := 'Bitmap Files(*.bmp)|*.bmp';
  if OD.Execute then
    Image1.Picture.Bitmap.LoadFromFile(OD.FileName);
  OD.Free;
end;

procedure TForm1.SaveAs1Click(Sender: TObject);
var
  SD:TSaveDialog;
begin
  SD := TSaveDialog.Create(Self);
  SD.Filter := 'Bitmap Files(*.bmp)|*.bmp';
  if SD.Execute then
    Image1.Picture.Bitmap.SaveToFile(SD.FileName);
  Sd.Free;
end;

end.
---------------------------------------------------------------------------------
이걸 설마 다 키보드로 입력하는 호구(?!)는 없을 것이다.
begin ~ end; 안에만 치는거다.(물론 이벤트 안에서 변수를 선언할 때도 있다)
주황색 부분은 앞에서 폼을 만들면서 자동으로 추가된 코드다.
그 아래 부분은 이벤트를 추가하면서 추가된 코드들이다.
빨간 부분만 코딩하면 프로그램이 원활하게 돌아간다. 
와우~ 신기하지 아니한가?(아님말고 -_-)
F9를 누르면 컴파일하고 실행이 된다. 
다음 시간에는 동영상 재생기를 만들어 보겠다.

댓글 없음:

댓글 쓰기