유수닙니다. 제가 아는 데 까지 답변할께요. ^^;
더 잘 아시는 분 보충 답변 부탁드립니다.
1. Graph 와 mypen 의 어떤 차이점?
TGraphicControl은 입력포커스가 가지 않는 TLabel,TShape 같은 클래스의
선조클래스입니다.
질문에서 Create 를 하지 않은 이유는 간단합니다. 배열로 만들어
클래스 대입을 하기 때문입니다. 계승된 클래스 중의 하나인 TShape를
선조 클래스인 TGraphicControl에 클래스를 대입하기 때문이죠.. 즉 이미
만들어진 TShape(이미 메모리에 할당되고 인스턴스가 생성되었겠죠!)를 TGraphContr
ol에 지정을주는겁니다.
이건 모든 클래스에서 다 적용됩니다. Create는 대입하지 않고, 자신이 직
접 클래스를 메모리에 생성할 때 사용해야 합니다. 메모리에 생성했으므로
나중에 꼭 free를 실행시켜 주어야 문제(?)가 안 생기겠죠.
예를 들면 var MyLabel : TLabel; 을 동적생성하여 화면에 나타내 주려면,
procedure TForm1.FormCreate(Sender: TObject);
begin
MyLabel := TLabel.Create(Self);
MyLabel.Parent := Self;
MyLabel.Caption := 'Zzzz';
end;
라구 하구,
프로그램이 끝나는 시점에서 MyLabel.Free; 해 주어야 합니다.
하지만, 화면에 있는 Label1을 제어 하기 위해선,
procedure TForm1.FormCreate(Sender: TObject);
var MyLabel : TLabel;
begin
MyLabel := Label1;
MyLabel.Caption := 'Zzzz';
end;
라고 하는 겁니다. (생성 시킬 필요도, 해제 시킬 필요도 없죠)
컨트롤을 배열로 만드는 것 역시 클래스 할당만 해 주고, 그 때부터 마음대
로 배열의 행태로 다루면 되므로, Create 할 필요가 없죠.
물론 할당하는 클래스가 동적으로 생성되었던 거라면 원래의 클래스를 나중
에 Free시켜 주어야 하겠죠. 커커.. 저도 정확한 개념이 안 잡혀서 설명이
잘 안되는 것 같아 죄송합니다.
★ 정리해 보면 Create는 메모리에 직접 클래스를 생성할 때 쓰는 겁니다.
CKS7108님이 질문하신 내용은 클래스를 메모리에 생성시키는냐, 아님
생성된 것을 대입하여 사용하느냐 의 차이로 봐야 할 겁니다.
TShape을 TGraphicControl에 대입시키는 것이 가능한 것은 선조클래스
이기 때문이고, 그건 도움말을 보면 확인 할 수 있습니다.
아, 그리구 TPen은 Non-Visual 컴포넌트이므로 반드시 Create시켜야
하겠죠... 그리구 , 이 만들어진 TPen역시 다른 배열로 선언된 TPen
에 대입해 사용가능합니다.
2. Create메소드에서 self 지시자는 어떤 영향을 주나요.. (델파이 도움말 참조)
Self 지시자는 그 컴포넌트의 Owner(소유자)를 뜻합니다. 컴포넌트들(TComponent에
서 계승된 클래스)은 모두 생성할 때 Owner를 지정해 줍니다. 한 컴포넌트가 다른 컴
포넌트에 의해 소유되었을때, 소유된 컴포넌트의 메모리는 Owner의 메모리가 free될
때, 같이 free가 됩니다. 델파이에선 기본적으로 한 폼은 그것 위에 있는 모든 컴포
넌트의 Owner가 됩니다. 따라서 폼이 free될때, 모든 컴포넌트의 메모리도 자동으로
free가되는 겁니다. 보통 Self로 하여 사용하게 되는데, 소유자를 폼으로 하여 생성시
키는겁니다.
흐르는 물.. 유수
보탬 : 이전에는 PCNI로 글을 올렸는데, 오늘부턴 유수로 올립니다.
|