2013년 3월 27일 수요일

델파이 10장, 11장

10장 보고서 작성


즉, 결과물을 인쇄하는 것인데. 현재 내가 쓰고 있는 XE3 버전에는 Fast  Report 밖에 없다.

사용법은 매우 간단하다.

DB와 테이블을 연결하고 위치만 잡아주면 끝이다.

책이 워낙 대충 설명해놔서 실습하는데 애 먹었지만 익히는데는 금방이었다.

인쇄물 틀잡는 것만 좀 해놓으면 계속 써먹을 수 있다는 장점도 있다.

책과 내가 가지고 있는 툴이 버전이 틀린 관계로 애를 먹고 있다.

허리도 아프고, 시간도 촉박하고 델파이 공부 얼렁 끝내고 싶다 진짜 ㅡㅡ

11장 DLL 작성과 호출


DLL 은 다른 응용 프로그램에서 사용되는 코드나 자원을 포함하는 컴파일된 모듈이다.

한마디로 말하자면 공통으로 쓰는 부분을 합쳐서 공유하게 하자는 거다.

 1.DLL 사용시 장점

  • 응용프로그램의 재 컴파일 없이 DLL을 변경하거나 프로시저 및 함수를 추가 할 수 있다.
  • 여러 개의 응용프로그램에서 사용되는 DLL은 단일 복사본이 메모리에 올라가므로 응용 프로그램의 크기는 작아지고 메모리 사용량도 작아짐
  • DLL은 다른 언어간의 호환을 제공함. 
2.DLL 작성법

  1. File -> New -> Other에서 DLL(Dynamic_link Library)용 프로젝트를 선택
  2. DLL을 작성하기 위한 새로운 프로젝트를 생성
  3. 프로그램 작성
  4. DLL 생성하기 위해 Project->Build All을 실행하면 dll이 생성된다.
3. DLL 호출
DLL을 호출하는 방법은 3가지가 있다.

  • 정적으로 가져오기
프로그램 가동시 미리 라이브러리를 로드하여 해당 프로시저나 함수를 호출하는 방법으로 메모리 효율면에서는 좋지 않음

  • 동적으로 가져오기
필요한 시점에서 라이브러리를 로드하여 해당 함수나 프로시저를 호출하고 라이브러리를 해제함
메모리 사용면에서는 효과적이나 자주 사용하는 라이브러리인 경우는 정적 로딩이 효과적일수 있음

  • 지연 방식으로 가져오기
정적 로딩과 동적 로딩의 절충형으로 델파이 2010에 추가된 기능이며 라이브러리를 미리 선언해 놓지만 호출 시에 로드하고 프로그램 종요시에 해제함


4. DLL 호출 시 주의 사항

  • 정적 로딩의 경우 라이브러리와 호출하는 응용프로그램의 경로가 다른 경우, 라이브러리의 패스를 명시해야 함
  • 정적 라이브러리인 경우 하나의 라이브러리에서 여러 개의 프로시저나 함수를 사용한다고 해도 라이브러리의 이름과 함수을 쌍으로 명시해야 함
  • 프로시저나 함수 이름은 대소문자 구분을 합니다
  • 프로시저나 함수 호출 시, 특히 언어가 다른 경우 매치되는 정확한 타입을 주어야 함


2013년 3월 22일 금요일

델파이 9장

1. Exception 처리


에러처리는 사용자들에게 덜 빡치게(?) 해주는 아주 중요한 것이다.

에러가 났을 때 고객 지원 전번을 띄어주는 업체와

걍 아무런 메세지 없이 종료되는 업체는 고객들에게 많은 생각을 가지게 해줄 것이다.

델파이에서 제공해주는 기본 에러 처리 개체 종류는

입출력/힙/정수 일치/부동 소수정 일치/타입 캐스팅/
변환/하드웨어/데이터베이스/문자와 리스트

등의 에러처리를 제공해 준다.

에러처리 블록의 기본 구문이다.

try .... finally블록

try
   statement1;
   statement2;
finally
   statement3;
   statement4;
end;

  • 오류가 발생하지 않으면 모든 문장들이 순차적으로 실행
  • 오류가 발생했을 경우에는 바로 finally 부분의 코드로 이동하여 실행
  • 오류가 발생하던 하지 않던 finally 부분은 항상 실행
  • 주로 이 블록은 개체, 파일, 윈도우 자원 등을 보호하기 위해 구현
-------------------------------------------------------------------------------
try...except 블록

try
   statement1;
   statement2;
except
   On e:Exception Type1 Do
      statement3;
   On e:Exception Type2 Do
      statement4;
end;

  • 오류 발생 없이 코드가 수행될 경우에는 Except 문의 코드는 실행되지 않음
  • 오류가 발생하면 Except 부분으로 옮겨져서 수행
  • 오류 개체가 try...except 블록으로 들어와 처리되면 시스템은 더이상 오류 상황을 보지 않고 정상적으로 처리 함
  • 특정 타입의 Excpetion 개체를 검색하기 위하여 On... Do문을 사용할 수 있으며 그 개체의 인스턴스를 사용하기 위한 임의의 변수 e를 사용할 수 있음
  • Exception 개체는 이 변수를 통해 해당 개체의 속성과 메소드에 접근할 수 있음
  • On...Do문의 어떤 것도 현재 Excpetion에 적용되지 않으면 else 부분을 제공하여 실행하도록 할 수 있음. 
  • 만일 else 부분이 제공되지 않으면 계속 바깥쪽의 try 문을 계단식으로 찾아감
  • try...except 나 try...finally 블록은 블록 내에 중첩하여 사용할 수 있음

2. Raise


오류 조건을 표시하기 위해 예약어 Raise를 사용하여 일부러 에러를 유발 시킬 수 있다.
에러를 일부러 유발시키는 경우는 주로 입력 체크나 조건 체크에 사용한다.
예) 패스워드가 3회 이상 틀렸을 때.

사용법
Raise Exception.Create('입력 오류');

3. EAbort Exception


델파이에는 조용한 에러처리로 불리는 특별한 Exception 클래스가 있다.
이를 Silent Exception이 발생했다고 한다.
Exception과 방식은 동일하지만 대화 상자가 나타나지 않는다.

Raise EAbort Create('보이지 않는 메세지');


내용은 더 있는데.........
쓰기가 힘들다 ㅡㅡ;; 감기도 걸리고 허리도 아프고 ㅠㅠ
아아 오랜만에 맘먹고 공부하는데 태클이 ㅠㅠ

델파이 8장

8장은 필드 에디터 이다.

1. 필드 개체

델파이는 db 테이블의 각 필드 타입과 크기에 맞는 독립적인 하나의 필드 개체들을 자동으로 만들어 준다.
이런 필드 개체는 실행되는 동안에만 사용할 수 있지만 디자인 타임에도 필드 에디터를 이용하여 필드 개체를 만들 수 있다.
필드에 대해서 제어하는 것이 필드 에디터 이다.

하........... 델파이 버그가 너무 심하다.......

예제 소스에 있는 것을 그대로 컴파일하고 실행 시켰는데.

에러가 생기더니 마우스가 서버린다.

뭐 이런게 다 있지?? 내가 델파이를 공부하긴 하지만 정말 버그도 많고 개판이다.

진짜 취업만 아니면 때려치고 싶은 델파이다.

어쩌면 이글을 마지막으로 델파이는 않쓸지도 모르겠다....

델파이 공부 끝나면 그 때나 다시 요약해서 올리겠다.

끝~

델파이 7장

7장은 BDE를 사용한 데이터베이스 프로그래밍 이다.
분량이 꽤 길고 오류도 많고, 내가 몸상태도 영 시원찮아서 이제야 마치고 쓴다 ㅡㅡ;;
프로그램 개발 과정은 너무 기니 패스하고 요약만 하겠다

소스코드 링크가 없어졌다 ㅡ.ㅡ;;; 이건 찾으면 다시 업뎃하겠다....;;;
그나마 소스코드 다운 받아놔서 다행이넹~

이건 뭐 내용이 너무 기니 책을 보고, 그대로 따라하며 배우라고 밖에 할 수 없다 ㅡㅡ;;

간단한 프로그램을 만들어보니 DB 연결도 몹시 쉽고 (DB목록에서 선택만 하면 된다.)

쿼리문을 변수에 넣어서 처리하는 방식이다 보니

쿼리문이 바뀌면 바뀌는 쿼리문만 바꿔서 넣어서 하면 되기에 프로그램을 많이 수정할 필요가 없다.

물론 소스코드에 쿼리문을 직접 넣는 개발자는 하수다 -_-

책에는 엑셀 컴포넌트가 있지만 내가 설치한 xe3에는

엑셀관련 컴포넌트가 없어서 해보질 못해서 좀 아쉬웠다.

아주 조금이지만 DB를 이용한 프로그램을 만들어 봤다~





2013년 3월 19일 화요일

델파이 6장

데이터베이스 프로그래밍 개요.


1. 데이터베이스란?

방대한 양의 데이터 저장, 관리 및 사용을 위한 시스템,
데이터 베이스는 한개 이상의 테이블로 구성되어 있음.
테이블은 행과 열로 구성되는 2차원 구조의 집합체 입니다.
데이터베이스에서는 행을 레코드, 열을 필드라고 함.

레코드는 정보를 표현하는 기본 단위로서 관련 있는
여러 필드가 모여서 하나의 레코드를 구성함
레코드와 필드를 합친 것을 테이블이라고 하고,
이 테이블을 모아 놓은 자료가 데이터베이스

데이터 베이스는 로컬 데이터베이스/리모트 데이터베이스 2가지가 있음.
로컬 데이터베이스는 개인 또는 복수 사용자를 위한 것이고
리모트 데이터베이스는 다중 사용자를 위한 것

2. 데이터베이스에서 사용되는 용어들


  • Primary Key

한 레코드를 다른 레코드와 구별해주는 컬럼이나 필드를 기본키라고 한다.
기본키가 되기 위해서는 각 레코드에 대해 유일한 값이어야 하고 NULL 값이 아니어야 함

  • Foreign Key
다른 테이블과 연결하기 위하여 사용되는 키를 의미한다. 한 테이블에서 기본키가 되는 필드가 다른 테이블의 참조키로 사용될 수 있음.

  • 인덱스
테이블에 대한 보다 빠른 접근이나 효과적인 정렬 작업을 위해 테이블 내의 필드 값들을 기본적으로 하여 물리적으로 만들어 두는 것.
모든 기본키는 인덱스로 생성되어 있음.

  • 트랜젝션
여러개의 데이터베이스 연산들을 하나로 묶는 것을 의미하며 묶인 모든 연산들이 제대로 실행되면 데이터데이스에 변경된 내용기 기록되고(Commit), 한 연산이라도 실패하면 원래대로 돌아감(RollBack).

  • 저장프로시저
저장 프로시저는 여러분 수행될 필요가 있는 데이터베이스 연산들을 프로시저 형태로 미리 데이터베이스에 컴파일하여 저장해 두는 것, 데이터베이스에 따라 작성하는 방법이 다름

3. SQL이란?

데이터베이스의 자료를 이용하거나 데이터베이스에 테이블을 생성하고, 생성된 테이블에 데이터를 저장하기 위해 SQL을 사용함.
델파이에서는 어떠한 데이터베이스에서도 사용할 수 있는 표준 SQL을 사용함

4. 델파이와 데이터베이스 연결 유형

로컬 구조 (Single-tiered)
클라이언트/서버구조

1. BDE를 이용한 연결 
 2. ADO를 이용한 연결
 3. DBExpress를 이용한 연결
분산구조
1. BDE를 이용한 멀티-티어구조
 2. ADO를 이용한 멀티-구조

3. DBExpress를 이용한 멀티-티어구조

보면 별로 바뀐 부분이 없다 ㅡ.ㅡ;;
내일부터는 본격적으로 DB를 이용해서 프로그램을 만들어 보자~

2013년 3월 17일 일요일

델파이 5장

5장은 디버깅 사용하기 다.

디버깅이란?
소스 코드를 잘못 작성하여 프로그램의 실행 중에 발생하는 에러들을 찾아내고 바로 잡는 일

1. 디버그 정보 설정

Tools 메뉴에서 Options을 선택한 후 Debugger Option을 선택하면 아래와 같은 옵션들이 표시된다.
-디버그 정보를 프로젝트 별로 이용하려면 Project->Options->Compiler를 선탤하여 디버그 정보를 포함하도록 설정
-디버그를 활성화 하려면 Debugging Option에서 Integrated debugging에 체크

2. 기본적인 디버깅 방법

-프로그램 실행 중 오류가 의심스러운 부분의 실행을 중단하기 위해 Break Point를 설정
-설정방법
1.Break Point를 생성하기 원하는 문장의 왼쪽 끝을 커서를 놓고 클릭, 또는 f5 키를 누름
2. Run -> Add Breakpoint 메뉴를 이용하여 Break point를 편집

Watch 설정
어떤 변수 값의 변화를 살표보기 위해 지정하는 것.
Run -> Add Watch 메뉴를 선택하면 확인하고 싶은 변수들을 지정할 수 있음.

디버깅은 경험이기 때문에 여기에 쓰기엔 부족하다

다음에는 파트 2로 넘어가는데.
파트 2는 데이터베이스를 이용한 프로그래밍 하기다.
4장,5장은 짧아서 걍 하루에 다 썼다 ㅡ.ㅡ;
자격증 공부를 더 할 수 있을 듯~


델파이 4장

델파이 4장 제목은 컴포넌트 라이브러리와 패키지다.


1. 컴포넌트 라이브러리


계층 구조는 아래와 같다.
1.TObject
델파이의 모든 VCL 클래스들은 TObject 클래스로부터 상속됩니다. 모든 클래스의 공통적인 특성과 기능들을 가지고 있음.

2. TPersistent
저장과 읽기를 담당하는 클래스다.
이 클래스는 상속받은 모든 클래스들을 자신의 상태 정보를 필요할 때 마다 저장하고 다시 불러올 수 있게 됩니다.

3. TComponent
-툴 팔레트에 설치되는 기능
-디자인 타임에 마우스를 이용하여 폼에 추가되는 기능
-오브젝트 인스펙터를 통해 속성이 설정되는 기능

4. TControl
모든 시각적인 컴포넌트들의 선조 클래스

5. TGraphicControl
시각적인 컴포넌트이기는 하지만 입력 포커스를 받지 못하는 컴포넌트의 선조 클래스.
예)TImage, TLabel 등

6. TWincontrol
입력 포커를를 받을 수 있는 선조 클래스
예)TEdit, TCombobox 등

7. Exception
에러 상황들마다 클래스를 미리 정의해 놓고 구조적으로 에러 처리를 할 수 있게 해줌.
예외 클래스의 가장 선조가 되는 클래스
--------------------------------------------------------------------------------

2. 패키지란?

패키지는 델파이의 IDE와 델파이로 만드는 프로그램들이 공통적으로 사용할 수 있는 일종의 특화된 DLL이다.
DLL이란 공통적으로 사용되는 어떤 특정 기능들 만을 컴파일 해둔 것.
패키지란 텔파이에 맞게 컴파일된 DLL 이다.
패키지는 DLL과 유사하지만 다른점도 있다.
DLL은 실행했을 경우에만 사용할 수 있지만 패키지는 디자인 타임에도 사용할 수 있다.

- 런타임 패키지:어플리케이션을 실행할 때 기능을 제공하는 패키지
- 디자인 타임 패키지:컴포넌트를 만들거나 IDE에 컴포넌트를 설치할 때 사용하는 패키지


패키지 사용시 장점

  • 런타임 패키지는 응용프로그램 내의 코드의 중복을 제거하므로 프로그램 사이즈가 감소
  • 시스템 리소스와 하드 공간을 절약할 수 있음
  • 패키지를 이용하면 공통 코드는 빼고 프로그램을 컴파일 하기 때문에 보다 빨리 컴파일 할 수 있음
  • 디자인 타임 패키지는 컴포넌트를 배포하고 설치하는 일을 산순화 해줌



2013년 3월 15일 금요일

델파이 3장 - 2

동영상 재생기를 만들어 보겠다.
많은 삽질 끝에 성공했다 -_-
먼저 폼을 만들어 보자.
아래와 같이 만들자.



  1. 패널 3개를 넣고 Align 속성을 altop, alClient, alBottom 으로 나눈다.
  2. TStatusBar 컴포넌트 넣고, 팝업메뉴에서 Panel Editor를 선택하고 1개 추가한다.
  3. 버튼 2개를 넣고 각각 Open, Exit 로 속성을 변경한다.
  4. TMediaPlayer 컴포넌트를 패널1에 넣고, 속성은 Display는 Panel2로 설정
  5. TTrackBar컴포넌트를 패널2에 넣고 속성은 Align은 alBottom으로 설정
  6. 패널3에 라벨를 넣고 위 그림과 같이 Caption 속성을 입력한다.
  7. 패널3에 패널 하나 더 넣고 BevelOuter를 bvLowered로 지정한다.
  8. TOpenDialog와 TTimer컴포넌트를 넣는다.
아래는 완성된 코드다.
---------------------------------------------------------------------------------

unit UVideo;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.ComCtrls,
  Vcl.StdCtrls, Vcl.MPlayer, Vcl.Buttons;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    MediaPlayer1: TMediaPlayer;
    Panel2: TPanel;
    Panel3: TPanel;
    TrackBar1: TTrackBar;
    StatusBar1: TStatusBar;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    mPlayFrame: TLabel;
    mTotalFrame: TLabel;
    mTime00: TLabel;
    mTime01: TLabel;
    mFileName: TPanel;
    OpenDialog1: TOpenDialog;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
      var DoDefault: Boolean);
    procedure MediaPlayer1Notify(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  h,m,s,ss : integer;
begin
  if OpenDialog1.Execute then
  begin
    //열기 대화 상자에서 선택한 동영상 파일을 미디어 플레이어의 FileName 속성에 대입하여 연결
    MediaPlayer1.FileName := OpenDialog1.FileName;
    //경로명과 파일명을 가지고 있는 문자열에서 파일명과 확장자명만을 축출하는 함수
    mFileName.Caption := ExtractFileName(OpenDialog1.FileName);
    //재생할 동영상을 연결
    Mediaplayer1.Open;
    mediaPlayer1.TimeFormat := tfFrames;
    //전체 프레임 수를 표시
    TrackBar1.Max := MediaPlayer1.Length;
    //현재 재생 위치를 표시
    TrackBar1.Position := MediaPlayer1.Position;
    mTotalFrame.Caption := FormatFloat('##,###,###,###,##0',MediaPlayer1.Length);
    mPlayFrame.Caption := FormatFloat('##,###,###,###,##0',MediaPlayer1.Position);
    MediaPlayer1.TimeFormat := tfMilliseconds;
    ss := MediaPlayer1.Length div 1000;
    s := ss mod 60;
    m := ss div 60;
    h := m div 60;
    m := m mod 60;
    mTime00.Caption := FormatFloat('00:00:00',0);
    mTime01.Caption := FormatFloat('00',h)+':'+FormatFloat('00',m)+':'+FormatFloat('00',s);
  end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OpenDialog1.Filter := 'Avi Files|*.avi|MPEG Files|*.mpg|All Files|*.*';
  mPlayFrame.Caption := '0';
  mTotalFrame.Caption := '0';
  mTime00.Caption := '00:00:00';
  mTime01.Caption := '00:00:00';
end;

procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
  var DoDefault: Boolean);
begin
  case Button of
    btPlay: begin
              Timer1.Enabled := true;
              StatusBar1.Panels[0].Text := '재생';
            end;
    btPause: StatusBar1.Panels[0].Text := '잠시멈춤';
    btStop: StatusBar1.Panels[0].Text := '재생중지';
    btNext: StatusBar1.Panels[0].Text := '다음';
    btPrev: StatusBar1.Panels[0].Text := '이전';
    btStep: StatusBar1.Panels[0].Text := '앞으로';
    btBack: StatusBar1.Panels[0].Text := '뒤로';
  end;
end;

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
  if (MediaPlayer1.NotifyValue = nvSuccessful) and (MediaPlayer1.Mode = mpStopped) then
    StatusBar1.Panels[0].Text := '재생완료';
  if MediaPlayer1.Mode = mPStopped then
    StatusBar1.Panels[0].Text := '재생중지';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  h,m,s,ss : integer;
begin
  MediaPlayer1.TimeFormat := tfFrames;
  mPlayFrame.Caption := FormatFloat('##,###,###,###,##0',MediaPlayer1.Position);
  TrackBar1.Position := MediaPlayer1.Position;
  MediaPlayer1.TimeFormat := tfMilliseconds;
  ss := MediaPlayer1.Position div 1000;
  s := ss mod 60;
  m := ss div 60;
  h := m div 60;
  m := m mod 60;
  mTime00.Caption := FormatFloat('00',h)+':'+FormatFloat('00', m)+ ':' + FormatFloat('00',s);
  Timer1.Enabled := true;
end;

end.

---------------------------------------------------------------------------------
역시 빨강 부분은 폼을 완성하면서 자동으로 추가된 코드고
주황 부분이 직접 넣어야 하는 부분이다.
실행해보니 코덱의 문제인지 소리만 나는 영상도 있고, 나오는 영상도 있고, 안나오는 영상도 있다 ㅡㅡ;;
어째든 이번 장도 끝~ ㅎㅎ;; ㅌㅌㅌ



델파이 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를 누르면 컴파일하고 실행이 된다. 
다음 시간에는 동영상 재생기를 만들어 보겠다.

2013년 3월 14일 목요일

델파이 2장

델파이 1장과 2장은 페이지수가 꽤 된다 -_- 그래서 여러개로 나누어서 올려야 할 꺼 같다.
2장 주제는 폼의 특성과 화면 띄우기 이다.

솔직히 이걸 하나한 캡쳐해서 올리기엔 너무 빡쎄다 -_-
책을 보고 하면 되기에 ( --);;;

먼저 전체 소스코드를 받을 수 있는 곳을 알려주겠당~

http://tech.devgear.co.kr/devgearbook/2435

1. 메모리 해체 관련한 폼의 종류 (Auto Create 폼, Available 폼)


*Auto Create 폼 - 기본적으로 설정되어있는 메모리 해제를 신경 안쓰는 폼

*Available 폼 - 사용자가 필요한 시점에 동적으로 메모리에 로드하고 사용이 끝나면 메머리를 해제하는 방법을 택할 수 있는 폼

폼을 동적으로 생성하고 해제하기 위해서는 먼저 Available 폼으로 바꿔야 한다.
바꾸는 법은 Project -> Option 메뉴에서 Forms 항목에 있다.

2. 폼이 나타나는 방식에 따른 폼의 종류(Modal, Modeless)


* Modal 폼 - 다른 윈도우를 사용할수 없도록 화면의 맨 위에 활성화 되는 폼
(예 - 로그인 창, 옵션 창)

*Modeless 폼 - 폼이 생성되어 나타나도 여전히 다른 폼을 사용할 수 있는 폼
(예 - 시계, 인터넷창 등등)

-Modal 예제-


procedure TForm1.Button12Click(Sender: TObject);
begin
  Form3 := TForm3.Create(Application);
  if Form3.ShowModal = mrOk then
    Caption := FormatDatetime('yyyy-mmmm-dd hh:nn:ss', Form3.DateTimePicker1.Date);
  Form3.Free;
end;

주황색 부분이 모달로 띄우겠다는 뜻이다.
아래는 달력을 띄우는 것임 ㅡ.ㅡ;; 자세한건 소스를 다운 받아서...........

-Modeless 예제-


procedure TForm1.Button13Click(Sender: TObject);
var
  I : Word;
begin
  for I := 0 to Application.ComponentCount - 1 do
  begin
    if Application.Components[I] is TForm2 then
    begin
      (Application.Components[I] as TForm).Show;
      Exit;
    end;
  end;

  Form2 := TForm2.Create(Application);
  Caption := IntToStr(Application.ComponentCount);
  Form2.Show;

end;

주황색 부분은 버튼을 누를 때마다 창이 뜨는 것을 방지해준다. 오로지 1개만 뜸.


빨간색 부분이 Modeless로 띄우는 부분이다.

Modeless는 메모리 해제를 내가 해줘야 한다.(귀찮게시리 ㅡㅡ)
Form2가 Modeless 폼이라면 닫을 때 메모리 해제를 해주어야 한다.


procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree; //메모리 해제
end;

3. Close 할 때 어떻게 Close 할 껀지 결정해주긔~


caNone : 폼을 Close 하지 않음. 아무런 변화가 없음(뭐하러 있는거임? ㅡㅡ?)
caHide : 폼을 닫지 한고 숨김.
caFree : 폼이 닫히고 메모리에서 해제함.(바로 위에 사용했제?)
caMinimzed : 폼을 최소화 함.

프로그램이 끝나기 전에 Action 변수에 위에 것을 넣어줘야 함.

4. Is 연산자와 As 연산자


* is 연산자 : 개체 유형 체크 연산자

개체의 실제 런타임 클래스를 확인하는데 사용.

var
H : Thourly;
...
if H is Thourly then

이 연산자는 H라는 오브젝트가 Thourly 클래스나 그 자손 클래스의 인서턴스인 경우 True를 리턴하고 아니면 False를 리턴함.

* as 연산자 : 확인된 타입 캐스트 연산자

Procedure Button1Click(Sender:Tobject);
begin
   (sender As TButton).Caption := 'ok';
end;

위 예문에서 sender은 TObject 타입이므로 Caption 속성에 접근할 수 없으므로 As 연산자를 사용하여 타입캐스트 하여 Caption 속성에 접근함.

5. 폼의 초기처리/ 마감처리를 위한 이벤트

  • OnCreate 이벤트 - 폼이 생성될 때 발생하는 이벤트. 주로 화면의 초기처리 작업을 위한 이벤트로 사용
  • OnShow 이벤트 - 폼이 표시될 때 발생하는 이벤트.
  • OnActivate 이벤트 - 폼에 포커스가 넘어와 활성화 될 때 발생하는 이벤트.
  • On Deactive 이벤트 - 폼이 비활성화될 때 발생하는 이벤트
  • OnCloseQuery 이벤트 - OnClose 이벤트 발생전에 윈도우에 Close 되는지 확인하고 싶을 때 사용하는 이벤트
  • OnClose 이벤트 - 폼을 닫을 때 발생하는 이벤트로 화면의 마무리 처리를 위한 이벤트로 사용
  • OnDestroy 이벤트 - 폼이 해제될 때 발생하는 이벤트 

여기까지 대충(정말 대충-_-)2장을 요약해봤다.(그래도 난 코딩하며 공부했다규!!)
소스 코드를 여기에 올리기엔 분량도 많으니 위에 소개한 소스코드를 다운 받아서 해보길 바란다.
델파이는 프로그램을 만드는데 정말 간단하게 만들수 있는 것 같다.
정말 많은 컴포넌트를 제공하고, 왠만한 기본 메뉴 정도는 다 만들어져 있다.
우리가 할일은 배치하고, 연결하고, 이쁘게 포장만 해도 왠만한 프로그램이 만들어진다.
물론 없는 것은 개발자가 직접 만들어야 하지만....
정말 빠른 시간에 프로그램을 작성할 수 있는 것이 델파이의 장점인것 같다.

3장은 그림판과 동영상 프로그램을 작성해볼껀데.
이건 하나하나 캡쳐해서 올려보겠다.(오오미)

2013년 3월 13일 수요일

델파이 1장 - 2

oop 객체지향 프로그래밍에 대해 살펴 보겠다.
객체 지향이 어쩌구 하는건 OOAD에 설명해놨으니 그거 보라능(내가 귀찮아서 이럼)

먼저 클래스란?
클래스는 속성과 행위를 갖는 레코드형과 비슷한 일종의 자료형이다.
클래스 형으로 정의한 변수는 그 자체가 개체가 되는 것이 아니라
메모리에 자리 잡기 위해서는 인스턴스 하는 작업이 필요한데 이를 생성이라고 한다.

델파이에서 클래스 선언
type
   클래스 이름 = class (부모클래스)
   멤버 선언
end;

부모클래스를 생략하면 TObject를 계승 받는다.

sealed로 표시된 클래스는 상속이 불가능 하다
--------------------------------------------------------------

  • 생성자란?

개체를 생성하고 초기화 하는 동작을 수행하는 루틴
오브젝트가 생성되기 전에 호출되기 때문에 클래스 이름으로 지정해서 호출
Constructor 로 시작하는 프로시저임.

생성자 작성법
Constructor TMyobj.Create; //TMyobj가 클래스명
Constructor TCompoent.Create(AOwner:TCompoent); //TCompoent가 클래스명


  • 파괴자란?

생성자와 반대로 작업을 정리하고 메모리를 해제하는 기능을 수행
Destructor 로 시작하는 프로시저

파괴자 작성법
Destructor TMyobj.Destroy; //TMyobj는 클래스명


  • Free
할당된 개체의 인스턴스를 체크하여 내부적으로 Destroy를 부르는 루틴
Myobj.Free;
--------------------------------------------------------------------------

상속

상속이란?
기존의 클래스를 기반으로 새로운 클래스를 정의하는 것.
이것은 귀찮으니 만든 코드로 설명하겠음 -_-;
----------------------------------------------------------------------------


unit Unit6;

interface
type
TPerson = class(TObject)  //TObject 상속받은 TPerson 클래스 생성
  private //오직 이 클래스에서만 사용
    ttt : String;
  public //다음의 내용은 다른 클래스에서도 사용
    Name : String;
    Age : byte;
    Address : String;
    Constructor Create; virtual; //create의 내용을 상속하여 사용
    function Getname : String;
end;

TEmp = class(TPerson)
public
  office : String;
  Empno : Integer;
  Baserate : real;
  Constructor Create; override; //create를 상속받아 재사용
  function Salary : real; virtual; abstract; //salary 함수 재사용
end;

THourly = class(TEmp)
  Hrs : Integer;
  Constructor Create; override; //create를 재정의하여 사용
  function Salary : real; override; //salary를 재정의하여 사용
end;

TSalary = class(TEmp)
  Salesamt : real;
  Commissionrate : real;
  Constructor Create; override;
  function Salary : real; override;
end;

implementation

{ TPerson }
//사원 정보 입력
constructor TPerson.Create;
begin
  Name := 'Kim';
  Age := 20;
  Address := 'Anywhere';
end;

//사원 이름을 호출하는 함수
function TPerson.Getname: String;
begin
  Result := Name;
end;

{ TEmp }

constructor TEmp.Create; //TPerson에서 정의한 Create를 상속받음
begin
  inherited; //부모클래스의 메소드를 호출하라는 예약어.
  office := 'bbk';
  Empno := 1;
  Baserate := 10;
end;

{ THourly }

constructor THourly.Create;
begin
  inherited;
  Hrs := 10;
end;

function THourly.Salary: real;
begin
  Result := Baserate * Hrs;
end;

{ TSalary }

constructor TSalary.Create;
begin
  inherited;
  Commissionrate := 1;
  Salesamt := 5;
end;

function TSalary.Salary: real;
begin
  result := (Salesamt * Commissionrate) + (Baserate + 40.0);
end;

end.
---------------------------------------------------------------
흐미 이게 뭔소리당가? 한다면 걍 답답할 뿐이다.
설명을 하자면.

TObject -> TPerson -> Temployee -> TSalary
                                                    -> THourly

로 상속을 받은 것이다.

먼저 interface 안에서 클래스를 생성하고 컨트롤 + 시프트 + C를 누르면
implementation 아래에 자동으로 틀이 만들어진다.
설마 이걸 하나하나 친 사람은 없겠지? >.<;
만들어진 틀 안에 코딩하면 된다.
inherited 라는게 있는데 이건 부모 클래스의 해당 이름으로 된 메소드를 호출에서 쓰겠다는 것이다.
친절하게 곳곳에 주석도 달았으니 알아서 보길 바란다.(어차피 보는 사람도 적은데 츤츤)

다음에는 컴포넌트를 사용해서 간단하게 만들어 보겠다~
다음이래봐야 잠깐 쉬고 쓸꺼다 -_-
길면 읽지를 않으니 원.

2013년 3월 12일 화요일

델파이 1장 - 1

델파이는 c언어와 비슷하면서도 약간 다르다.
다른 부분만 다루어 보겠다~(내가 귀찮아서 이러는게 아니다)

전체적인 구조
---------------------------------------------------------

unit 유닛이름;

interface  (전역변수)

implementation (지역변수)

Initialization  (생성자)

Finalization  (파괴자)

end. (프로그램 끝)
  • interface - 모든 프로그램 또는 다른 유닛에서도 함께 사용할 수 있다(전역변수)
  • implementation - 선언된 현재 유닛에서만 사용이 가능하다.(지역변수)
  • Initialization - 초기처리를 위한 공간. interface에 정의된 데이터 구조의 초기화 및 필요한 자원 할당을 위한 문장을 기술함(생성자)
  • Finalization - Initialization에서 할당된 프로그램에서 사용했던 자원을 되돌리는 문장을 기술함 (파괴자)
----------------------------------------------------------
초간단 문법 설명!!

주석은 //, {}, (**) 를 사용한다.
; 는 코드 한줄의 끝
. 은 프로그램의 끝 (가장 끝에 end.라고 되어 있다.)
begin end; 는 한 쌍으로 사용한다.(c언어에서 {}에 해당한다. - 열라 귀찮게 ㅡㅡ)
:= 오른쪽에 있는 어떤 값을 왼쪽에 저장할 때 사용(a := Integer) 

변수 선언 방법
var
  x, y : integer;   //같은 형이면 ,로 쓸수 있다.
  p : ^integer;     //^는 포인터의 주소가 가르키는 값이다.
begin
  x := 17;
  y := 0;
  p := @x;  //@연산자는 포인터 변수에게 주소를 넘기는 연산자(x의 주소를 알려달랑께)
  y := p^;   //^포인터의 주소가 가르키는 값(p의 주소 안에 있는 값을 내놓으랑께)
end; 

---------------------------------------------------------------
배열 선언

예)
배열명 = array[배열요소수, 배열요소수] of 자료형;

예제) 
unit 유닛명;

interface
//0~2까지의 공간을 가지는 정적인 배열을 지정
type
   Country = array[0..2] of string;
var
   i:integer;
  s:string;
  Countries : Country;

implementation
initialization
//할당된 정적 배열 Countries에 초기값을 할당
begin
  Countries[0] := 'Korea';
  Countries[1] := 'Japan';
  Countries[2] := 'Etc';
end;
end.
---------------------------------------------------------------
레코드 형 선언(구조체)
  • 다양한 자료형을 연속된 기억 공간에 보관
  • 모든 레코드 요소는 다른 자료형을 가질수 있음
  • 크기가 서로 다른 자료형의 레코드 멤버가 연속된 기억 공간을 사용
레코드 형 = Record
   필드명 : 자료형;
   필드명 : 자료형;
end;
-----------------------------------------------------------------
프로시저
  • 프로그램을 기능별로 분리하여 코딩을 더욱 간편하게 함
  • 프로시저 선언이란 유닛의 Type 부분에 프로시저 원형을 적어주는 것
  • 프로시저 선언은 유닛의 interface 부분에 선언
procedure 프로시저 이름 (<매개변수이름>:<매개변수타입>,<매개변수타입:매개변수타입>);

예제)
procedure clear (var A : array of Double);
var 
   i : Integer;
begin
   for i := 0 to High(A) do A[i] := 0;
end;
-----------------------------------------------------------------
함수
  • 리터럴(C언어의 return)값을 반환한다는 점을 제외하면 기본적으로 프로시저와 같음
  • 함수도 프로시저와 마찬가지로 먼저 선언해야함
  • Function 예약어 사용
  • 반환값은 지시어 Result를 사용하여 반환
function 함수명 (매개변수이름:매개변수타입):반환타입;
const 
   상수명 = 리터럴값;
var
   변수명 : 자료형;
begin
   statement1;
   statement2;
end;

예제)
function Add(x,y: integer):integer;
begin
   Result := x + y;
end;
-----------------------------------------------------------------
매개변수 전달 방식
1. Call by Value
변수를 값으로 전달하는 방식. 컴파일러는 값을 복사하여 원래의 값이 아닌 복사한 값을 전달 함 루틴 안에서 변수값을 변경할 수 있음
procedure Add(x,y : integer);

2. Call by Reference
변수의 메모리 위치를 프로시저에 전달하는 방식으로, 프로시저는 해당 메모리 위치의 내용을 변경할 수 있음.
procedure Add(Var Rec:String);

3. Call by Const
상수로 매개변수를 전달하는 방식으로 프로시저 내에서 변수 값은 변경할 수 없고, 참조만 가능
procedure Add(Const x,y : integer);

4. 출력 파라미터
Out 파라미터는 참조에 의해 전달되는 방식. Out 파라미터는 출력용으로만 사용.
procedure Add(Out a : String);
---------------------------------------------------------------------
Overload 루틴
  • 하나의 유닛에는 같은 이름의 함수나 프로시저를 선언할 수 없음
  • Overload를 사용하면 동일한 범위에서 같은 이름으로 하나 이상의 프로시저와 함수를 선언할 수 있음
  • 호출 시 파라미터 리스트의 차이에 의해서 구분 됨
Function divide(x,y : Integer) : Integer; Overload;
Function divide(x,y : Real) : Real; Overload;
---------------------------------------------------------------------
연산자

연산자는 c와 거의 비슷하다. 틀린 것만 쓰겠다.

  • Div 는 정수형 나눗셈(어차피 /가 정수, 실수를 나눌 수 있으니 /쓰자 -_-)
  • Mod 는 나머지 값(C에서 %와 같다)
  • Shl 은 왼쪽으로 비트 이동
  • Shr 은 오른쪽으로 비트 이동
  • @ 연산자는 변수, 프로시저, 함수 또는 메소드의 주소를 계산하기 위해 사용
  • <> 는 같지 않다. (C는 != )
---------------------------------------------------------------------
초 간단하게 문법을 대충 봤다(너무 대충이라도 나만 알면 장땡 ㅡ.ㅡ)
내일은 본격적으로 프로그램을 만들어 볼꺼다.
근데 프로그램 만들면 어찌 여기에 올리지 ㅡㅡ??








2013년 3월 11일 월요일

델파이 목차와 공부 계획

30일 밖에 시간이 없다!!(트라이얼 버전은 30일 밖에 못씀)

그럴려면 목차를 보고 공부 기간을 설정하는 것이 좋다.

델파이 Begin... End 의 목차를 보니

크게는 파트 1,2,3 로 나누어져 있고

파트1은 델파이의 기본이고
파트2는 데이터베이스 관련이고
파트3는 웹프로그래밍 이다.

기본적인 공부는 하루에 1장 씩이다.

파트2 까지가 14장이다.

주말을 뺀다면....(나도 좀 놀자) 파트2까지는 한달안에 할 수 있을 듯하다.

파트3는 웹인데........ 웹은 거의다 jsp니깐 패스닷.(오오미 현실적인)

자 이제 2파트까지만 하기로 정했다. 각 장의 제목을 보자.

파트 1

1장 델파이로 프로젝트 시작하기
2장 폼의 특성과 띄우기
3장 컴포넌트와 친해지기
4장 컴포넌트 라이브러리와 패키지
5장 디버가 사용하기

파트 2
6장 데이터베이스 프로그래밍 개요
7장 BDE를 사용한 데이터베이스 프로그래밍
8장 필드 에디터
9장 예외(Exception)처리
10장 보고서 작성하기
11장 DLL 작성과 호출
12장 DBExpress를 사용한 데이터베이스 프로그래밍
13장 ADO를 이용한 데이터베이스 프로그래밍
14장 분산처리(DateSnap)

이다. 총 14장 기간은 30일. 흠... 기간이 남으면 파트3을 할 수도 있겠다 ㅎㅎ;

파트3

15장 웹 브로커를 이용한 웹 프로그래밍
16장 DataSnap 웹
17장 DataSnap REST
18장 인트라웹을 이용한 웹 프로그래밍
19장 컴포넌트 작성
20장 인디 컴포넌트를 이용한 프로그래밍
21장 쓰레드


이 글은 결코 아직도 설치가 완료 안되서 쓴 건 아니다..........

델파이를 배워보자~!

어제(10일)에 자격증 시험이 끝났다(실기가 남았음 ㅡ.ㅡ)
오늘 가답안 체크해보니 널널하게 합격~! (잇힝)

오늘부터는 델파이를 공부해보려고 한다.

델파이가 뭐당가??

솔직히 나도 회사가서 처음 본 언어다.

하이레벨과 로우레벨을 넘나드는 언어인것 같다.

로우레벨은 나중에 내가 아두이노 가지고 놀 때 해볼 계획이고

일단은 델파이를 해보고자 한다.

어차피 공부하면서 공부한 내용을 복습차원에서 올리는 것이기에

허접할 수도 있다.(나만 이해하면 돼-0-)

일단 델파이를 깔아보자.

http://www.embarcadero.com/downloads

여기에서 RAD Studio XE3 를 설치하면 된다.

다운을 받으려면 일단 회원가입을 해야한다. 어차피 배울꺼니 가입하자(무료다)

다운은 빠르지만 설치는 무지하게 오래걸린다
(지금 이 글을 쓰는 이 순간에도 설지 안됐음 ㅡㅡ)

그런데 30일밖에 못쓰기 때문에 빠르게 후딱 배워야 한다.

개인적으로는 차라리 툴을 공짜로 배포해야 델파이가 많이 활성화 될 꺼 같다는 느낌이..
자바가 왜 그리 확산 되었는지 보면 알 수 있다.

30일 내로 배워야 하는 나로써도 x줄이 탄다. ㄷㄷㄷ

과감하게 배워보자쿠나~

델파이는 기본적으로 책이 별로 없다.

델파이 기본 문법책
http://www.yes24.com/24/goods/3359533?scode=032&OzSrank=2

델파이 응용책
http://www.yes24.com/24/goods/5325972?scode=032&OzSrank=1

기본 문법은 어차피 비슷하니 나 같은 경우는 바로 응용책으로 넘어갔다.

오늘은 열심히 깔고 내일부터 본격적인 델파이를 하겠다.

그러고 보니 내일이면 자격증 실기책도 오는데 -_-

둘 다 병행해야 한다니!!

소스코드를 다운 받을 수 있는 곳.
http://tech.devgear.co.kr/devgearbook/2435