블로그 이미지
자료에 문제가 있을 경우, 확인하는대로 삭제처리 하겠습니다. 즐거운 하루 되시길...
05-14 07:07
Total
Today
Yesterday

카테고리

분류 전체보기 (199)
이야기방 (20)
공부방 (173)
개발관련&IT용어.. 등등; (7)
잡다구니 (8)
OS & Server (13)
NetWork (3)
DB (30)
Delphi (47)
LUA (0)
JAVA (6)
HTML (10)
XML (1)
ASP (5)
JSP (2)
자바스크립트 (27)
CSS (8)
ETC.. (6)
개발노트&관련잡다구니 (6)

'공부방/Delphi'에 해당되는 글 47건

  1. 2010.07.15 [델파이] 폼 생성과 해제
  2. 2010.07.15 [델파이] 클래스의 가시성
  3. 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를 정해주면 자동으로 종료시켜준다.



Posted by 래채
, |

[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;


Posted by 래채
, |

오브젝트 파스칼에서 오브젝트는 레코드형 변수와 마찬가지로 여러 개의 요소들로 이루어진 자료들의 모음이다. 레코드에서 각각의 변수 요소들을 필드라고 하듯이 오브젝트에 대해서도 각각의 변수 요소들을 필드라고 한다. 오브젝트의 필드들은 적절하게 외부에 가려져 있으며, 보통 이들을 직접 참조하는 대신 오브젝트에서 제공하는 프로시저를 호출하여 작업을 처리한다. 이런 프로시저들을 메소드라 하고, 오브젝트는 이와 같이 상태를 보존하는 필드와 동작을 행하는 메소드로 구성된다. 또한 필드에 대한 무책임한 참조로부터 보호하기 위해 적절한 참조 방법을 제공하기도 하는데, 이를 프로퍼티라고 하고, 클래스에 속한 필드, 메소드, 프로퍼티 등을 클래스의 멤버라고 한다.

 

클래스는 레코드형과 마찬가지로 일종의 자료형이다. 클래스형으로 정의된 변수는 자체로 아직 오브젝트가 되는 것은 아니다. 오브젝트가 되어 메모리에 자리잡기 위해서는 인스턴스화하는 작업이 필요한데, 이를 생성(Create)이라고 한다. 이렇게 생성된 오브젝트를 오브젝트 또는 인스턴스라고 부른다. 오브젝트는 클래스에서 정의한 필드, 프로퍼티, 메소드를 가지고 있게 된다. 오브젝트의 사용이 끝나면 메모리에서 삭제하는 것을 파괴(Destroy)한다고 한다.

 

클래스를 선언할 항상 클래스의 모든 멤버들을 선언해야 하는 것은 아니다.

기존에 선언된 클래스를 계승받아 새로운 클래스에 필요한 멤버들만 선택해서 선언하면 된다. 이때, 새로 선언된 클래스를 후손(Descendant)이라 하고, 계승받은 기존의 클래스를 조상(Ancestor)이라고 부른다. 모든 클래스의 선언시에 항상 계승받을 선조 클래스를 지정하게 되어 있으면 생략하면 기본적으로 Tobject 클래스로부터 직접 계승받는 것으로 된다. Tobject 클래스는 모든 클래스의 가장 높은 조상이 되며, 모든 오브젝트가 갖춰야 기본적인 기능들을 구현해 놓은 클래스이다. 후손 클래스는 새로운 멤버를 계속 추가할 수만 있고 제거할 수는 없다.

 

클래스의 선언은 다른 선언과는 달리 유닛이나 프로그램의 가장 바깥에서만 행할 있다. 보통 유닛의 인터페이스 절에 선언하게 된다.


Type

   TMyClass = class(TObject)          // TMyClass 클래스의 선언-----------------(1)

   

end;

var

   MyObject : TMyClass;                 // TMyClass형의 변수 MyObject선언------(2)

 

 MyObject := TMyClass.Create;     // MyObject 생성-------------------------(3)

MyObject.Free;                             // MyObject 파괴--------------------------(4)


TMyClass TObject 부터 계승받았다.

(1) 그러므로 선조는 TObject 되고 후손은 TMyClass 된다

그리고 (2)에서 TmyClass형으로 변수 MyObject 선언하였다. 아직까지 오브젝트가 생성된 것은 아니다. 단지 선언만 했을 뿐이다

(3)에서 마침내 생성을 시켜 주었다

그리고 필요가 없게 되면 (4)에서처럼 파괴를 시켜주어야 한다.

TMyClass형의 Create라는 메소드는 위에서 만들어 주지 않았다. 그러면 어떻게 사용할 있었을까?

바로 TObject 기본적으로 정의되어 있으므로 TMyClass TObject에서 상속받기만 하면 TObject 메소드를 마치 자신의 것인양 있게 되는 것이다

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

[델파이] 폼 생성과 해제  (0) 2010.07.15
[델파이] 클래스의 가시성  (0) 2010.07.15
[델파이] 프로시저와 함수  (1) 2010.07.14
[델파이] Case 문법  (0) 2010.07.14
[델파이] 기본 컴포넌트  (0) 2010.07.14
Posted by 래채
, |