▶ 

Project Source

Program Project1;
Uses
   Forms,
   Unit in 'Unit1.pas' {Form1}
{$R *.RES}
begin
   Application.Initialize;
   Application.CreateForm(TForm.Form1);
   Application.Run;
end;  

Program

예약어는 프로그램 상단에 위치하고 프로그램 이름을 지정한다. Delphi 프로젝트를 저장할 주어진다. 프로그램은 Delphi내에서 스스로가 유닛이기 때문에 프로젝트는 같은 이름으로 프로그램이나 유닛을 갖지 못한다.

 

Uses

Uses 절에서 항목은 현재 프로그램이나 유닛에 의해 접근된 함수나 프로시저를 갖는 유닛의 이름을 부여한다.

 

In

지시어는 유닛 파일이 프로젝트에 의해 사용된 파일이라기 보다는 오히려 프로젝트의 일부라는 것을 컴파일러에 알린다. Unit1 유닛 identifier 표현하고 Unit1.PAS 파일 이름을 표현하고 {Form1} 유닛의 프로그램변수를 식별하는 주석이다.

 

{$R *.RES}

컴파일러 지시어는 자원 파일을 실행 파일로 연결한다.

 

Application.CreateForm

문은 응용프로그램의 폼을 생성한다. 응용프로그램내의 폼은 CreateForm 문을 갖는다.

 

Application.Run

문은 응용프로그램을 시작한다.

Unit Source

uses
   <uses unit names>;
const
   <constant name> = <constant value>
type
   <type identifier> = <type defination>
var
   <variable name> : <variable type>;
<procedure and function declarations>
<procedure and function definitions>
Initialization
   <statements>;
   …
Finalization
   <statements>;

Uses

uses절은 프로젝트 파일과 유닛 파일에 모두 사용

uses절은 유닛이 다른 유닛의 프로시저, 함수, 상수, 유형 그리고 변수를 사용할 있도록 하는 메커니즘이다.

 

Interface

Interface 섹션에는 상수, 유형, 변수 그리고 프로시저와 함수의 선언을 배치할 있다. 유닛을 사용하는 모든 유닛이나 프로그램은 이러한 선언들을 마치 하나의 커다란 파일에서 정의한 것처럼 사용한다.

 

Implementation

Implementation 섹션내에서 선언된 상수, 유형, 변수, 프로시저와 함수들은 현재 유닛의 implementation섹션에서만 사용할 있다.

 

Initialization

Interface섹션에 정의했던 모든 데이터 구조를 초기화하려면, initialization섹션에 초기화할 있다.

 

Finalization

Finalization부분에서는 Initialization 부분에 할당된 모든 리소스를 해제하도록 있다.

 

 

 




'공부방 > Delphi' 카테고리의 다른 글

[델파이] 컴포넌트 순서 정하기  (0) 2010.10.25
[델파이] Data Type  (0) 2010.07.19
[델파이] 폼 생성과 해제  (0) 2010.07.15
[델파이] 클래스의 가시성  (0) 2010.07.15
[델파이] 오브젝트, 인스턴스, 클래스  (0) 2010.07.14

폼을 생성하는 방법에는 2가지가 있다.

첫번째는 자동으로 생성하는 방법(AutocreateForm)이고, 두번째는 디자인타임시에 만든 폼을 런타임시에 코딩으로 생성하는 방법(Available Form)이다.


AutoCreate Form



델파이에서 File/New Form메뉴로 생성된 폼은 일단 모두 AutoCreate From으로 등록된다.
확인은 Project메뉴의 Option에서 할 수 있다

AutoCreate Form들은 Project Source에서 Application.Run을 수행하기 이전에 미리 생성된다.

[Project Source]
Begin
   Application.Initialize;
   Application.CreateForm(TForm1, Form1);
   Application.CreateForm(TForm2, Form2);
   Application.Run;
End;

Available Form



Project/Option메뉴에서 다음과 같이 폼을 Available Form으로 등록시킬 수 있다.
Available Form으로 등록된 폼을 열기 위해서는 프로그래머가 직접 코딩으로 폼을 생성해야만 열 수 있고 해제할 수가 있다. 

생성
Form1 := TForm1.Create(Application);

해제
Form1.Free;

▶ Show
Show를 사용하여 폼을 열면 호출한 코드가 실행을 멈추지 않는다. 이것은 사용자가 원하는 대로 많은 폼을 열어서 자유롭게 폼을 선택하여 작업할 수 있다. (즉, Form1에서 Form2를 호출한 뒤 Form2를 닫지 않고도 Form1을 건드릴 수 있다는 말이다.)

Form1.Show;

Show로 열고 바로 해제를 하면 폼은 바로 나타났다가 사라진다. 폼이 해제될 시점은 폼이 Close될 때이므로 OnClose이벤트를 이용할 수 있다.

Procedure TForm1.FormClose (Sender: Tobject, var Action: TCloseAction);
Begin
   Action := CaFree;
End;

▶ ShowModal
ShowModal을 사용하여 폼을 열면 폼을 호출한 코드는 ModalForm이 닫힐 때까지 정지한다. 그러므로 ModalForm이 열린 상태에서는 다른 폼을 선택할 수가 없다. (즉, Form1에서 Form2를 호출한 뒤 Form2를 닫지 않고서는 Form1을 건드릴 수 없다.)

ShowModal로 열려진 폼에 Modal Result값을 가지는 버튼이 있다면 이 버튼의 OnClick이벤트에 Close를 코딩하지 않아도 이 버튼을 누르면 종료된 것이다.

예를 들어서, Form1와 Form2에 버튼이 있다고 가정하자. 




Form1의 버튼은 Form2를 호출하는 버튼으로 아래와 같이 코딩되어 있다.

If Form2.Showmodal = mrOK then
   Edit1.Text := Form2.Edit1.Text;

그리고, Form2의 버튼은 Modal Result 속성이 mrOK로 되어 있다. 
그러면, Form2의 버튼을 클릭하는 순간, OnClick이벤트의 어디에도 폼을 Close하는 코딩이 없음에도 불구하고 Form2는 Close되면서 Form2의 Edit1의 값이 Form1의 Edit1에 반영되는 것을 볼 수 있을 것이다. (Modal Result를 정해주면 자동으로 종료시켜준다.



[Public]

Public지시어는 특별한 제한을 갖고있지 않는 필드나 메소드를 나타낸다. 메소드가 Public으로 선언되면 클래스의 어떤 사용자도 사용할 있다.

 

[Private]

Private 지시어는 클래스가 정의된 Unit 외부에서 접근하거나 알아보지 못하도록 프로시저, 함수나 필드를 정의하기 위해 사용된다. Private 선언된 식별자의 범위는 선언을 포함하는 모듈로 제한된다. 같은 Unit에서 정의된 개체는 서로의 Private 필드와 메소드를 사용할 있다.

 

[Pretected]

Protected지시어는 Public Private중간형태로 파생 클래스이면 상위 클래스의 모든 정보를 참조하여 사용할 있다.


Unit UnitA;

type

   TA = Class(Tobject);

   Private

      PriA : Integer;

   Protected

      ProA : integer;

   Public

      PubA : Integer;

   Procedure Access;

End;

 

Procedure TA.Access;

Begin

   PriA := 1;      // OK

   ProA := 2;     // OK

   PubA := 3;     // OK

End;


Unit UnitB;

Uses UnitA;

type

   TB = Class(TA);

   Public

      Procedure Access;

End;

 

Procedure TB.Access;

Begin

   PriA := 4;       // 오류 발생 : Undeclared identifier

   ProA := 5;      // OK

   PubA := 6;      // OK

End;


UnitA 선언된 TA클래스의 메소드에서는 TA클래스에서 선언된 모든 멤버(private, protected, public) 참조할 있다.

그러나 TA클래스에서 계승받아 UnitB 선언된 TB클래스는 TB클래스가 후손 클래스이고 TA클래스는 선조 클래스이다. 후손 클래스에서는 선조 클래스의 멤버 Private영역의 멤버를 참조하지 못한다.

따라서 TA 클래스의 Private 선언되어 있는 PriA TB클래스에서 사용할 없다. 당연히 에러가 발생할 밖에…..


그리고, 한가지 유의해야 점은 TA클래스의 변수 A 생성하여 사용한다고 가정할 , TA클래스의 사용자는 TA클래스에서 public으로 선언한 멤버만을 참조할 있다.(아래)

Unit UserUnit;

uses UnitA;

procedure TForm1.Button1Click(Sender: Tobject);

var

   A : TA;

Begin

   A := TA.Create;

   A.priA := 7;               // 오류 발생 : Undeclared identifier

   A.proA := 8;              // 오류 발생 : Undeclared identifier

   A.pubA := 9;              // OK

A.  Free;

End;


+ Recent posts