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