delphi Tcomponent 클래스 2

DELPHI를 배우는 가장 좋은 방법은 DELPHI의 VCL 원본 코드를 보고 그의 메커니즘을 보는 것이다. 본고는 TComponent의 원본 코드와 같이 그의 메커니즘을 본다.
{ TComponent }
constructor TComponent.Create(AOwner: TComponent);
begin
  FComponentStyle := [csInheritable];
  if AOwner <> nil then AOwner.InsertComponent(Self);
end; 

procedure TComponent.InsertComponent(AComponent: TComponent);
begin
  AComponent.ValidateContainer(Self);
  ValidateRename(AComponent, , AComponent.FName);//                
  Insert(AComponent);//            AComponent   
  AComponent.SetReference(True);
  if csDesigning in ComponentState then
    AComponent.SetDesigning(True);
  Notification(AComponent, opInsert);//          
end;

procedure TComponent.ValidateRename(AComponent: TComponent;
  const CurName, NewName: string);
begin
  if (AComponent <> nil) and not SameText(CurName, NewName) and
    (AComponent.Owner = Self) and (FindComponent(NewName) <> nil) then
    raise EComponentError.CreateResFmt(@SDuplicateName, [NewName]);
  if (csDesigning in ComponentState) and (Owner <> nil) then
    Owner.ValidateRename(AComponent, CurName, NewName);//             
end;

procedure TComponent.ValidateContainer(AComponent: TComponent);
begin
  AComponent.ValidateInsert(Self);
end;

procedure TComponent.ValidateInsert(AComponent: TComponent);
begin
end;

procedure TComponent.Insert(AComponent: TComponent);//                TLIST    
begin
  if FComponents = nil then FComponents := TList.Create;
  FComponents.Add(AComponent);
  AComponent.FOwner := Self;//               
end;

destructor TComponent.Destroy; file://              FFREENOTIFILES   
begin
  Destroying;
  if FFreeNotifies <> nil then
  begin
    while Assigned(FFreeNotifies) and (FFreeNotifies.Count > 0) do
      TComponent(FFreeNotifies[FFreeNotifies.Count - 1]).Notification(Self, opRemove);
    FreeAndNil(FFreeNotifies);//         ,   FFREENOTIFILES         Notification,             
  end;
  DestroyComponents;
  if FOwner <> nil then FOwner.RemoveComponent(Self);
  inherited Destroy;
end;

procedure TComponent.FreeNotification(AComponent: TComponent);//          FFREENOTIFILES                         
begin
  if (Owner = nil) or (AComponent.Owner <> Owner) then
  begin
    // Never acquire a reference to a component that is being deleted.
    assert(not (csDestroying in (ComponentState + AComponent.ComponentState)));
    if not Assigned(FFreeNotifies) then FFreeNotifies := TList.Create;
    if FFreeNotifies.IndexOf(AComponent) < 0 then
    begin
      FFreeNotifies.Add(AComponent);
      AComponent.FreeNotification(Self);
    end;
  end;
  Include(FComponentState, csFreeNotification);
end; 

 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.7 Tcomponent 분기
Tcomponent 분기는 Tcomponent가 아닌 Tcontrol에서 계승된 모든 VCL & CLX 종류를 포함합니다.이 분기의 대상에 대해 디자인할 때 창에서 직접 다시 조작할 수 있지만, 실행할 때 사용자에게 보이지 않습니다.이러한 객체는 다음과 같은 기능을 가진 지속적인 객체입니다.
n 구성 요소 패널에 나타나고 창의 무게를 변경할 수 있습니다
n다른 구성 요소 소유 및 조작
n 자체 로드 및 저장
Tcomponent가 도입한 몇 가지 방법은 구성 요소가 디자인할 때의 행동과 구성 요소에 따라 어떤 정보를 저장하는지를 가리킨다.흐름 기능 (창의 대상 속성을 저장하는 창 파일의 불러오기와 저장) 이 분기에 나타납니다.구성 요소의 발표 속성은 지속적이고 자동으로 '흐름' 으로 규정됩니다.
Tcomponent 분기도 소유권 개념을 도입했는데 이 개념은 구성 요소 라이브러리에서 나온 것이다.소유권은 Owner와 Components의 두 가지 속성으로 지원됩니다.각 구성 요소에는 소유자를 지정하는 Owner 속성이 있습니다.
하나의 구성 요소가 다른 구성 요소를 가지고 있을 수 있습니다. 이 경우, 모든 구성 요소가 이 구성 요소의Components 속성에 나타납니다.
모든 구성 요소의 구조기는 새 구성 요소의 소유자를 지정하는 매개 변수를 포함합니다.
이 도입된 소유자가 존재하면, 이 구성 요소는 자동으로 소유자의Components 속성에 추가됩니다.
Components 속성은 포함된 구성 요소 목록을 저장하는 것 외에 모든 구성 요소를 자동으로 방출할 수 있습니다.일단 하나의 구성 요소에 소유자가 생기면, 그 소유자가 풀리면, 그것도 자동으로 풀린다.
예를 들어 TForm은 Tcomponent를 계승하기 때문에 창이 소각될 때 그 안에 포함된 모든 구성 요소가 자동으로 소각되고 차지하는 메모리를 방출한다. (물론 모든 구성 요소는 자동으로 소각될 수 있도록 분석기를 정확하게 설계해야 한다.)
만약 속성 유형이 Tcomponent 또는 그 후예라면, 흐름 시스템이 그것을 읽을 때 자동으로 그 실례를 만들 것입니다.만약 하나의 속성 유형이 TPersistent이지 Tcomponent가 아니라면, 흐름 시스템은 이 속성을 통해 이미 존재하는 이 유형의 실례를 사용하고, 이 실례의 속성을 읽을 수 있습니다.
다음은 TComponent 분기의 일부 클래스입니다.
nTActionList, 동작 목록을 유지합니다. 이 동작 목록은 사용자의 입력에 반응할 수 있는 추상적인 동작을 제공합니다.
nTMainMenu, 창에 메뉴 표시줄 및 드롭다운 메뉴 제공
n TOpenDialog, TsaveDialog, TFontDialog, TFindDialog, TcolorDialog 등등 일반적인 대화상자를 제공하여 자신감을 표시하고 수집할 수 있습니다
n Tscreen, 프로그램이 만든 창 & 데이터 모듈, 활성 창, 창의 활성 구성 요소, 화면의 크기와 구성, 프로그램에서 사용할 수 있는 커서 및 글꼴 등 데이터를 추적하는 클래스입니다.
보기 인터페이스가 필요 없는 구성 요소는 일반적으로 Tcomponent 클래스에서 직접 나온다.TTimer 같은 구성 요소를 만들어야 한다면 Tcomponent를 직접 계승할 수 있습니다. 이 구성 요소들은 구성 요소 목록에 나타날 수 있지만, 디자인할 때의 시각적 인터페이스가 아니라 코드를 통해 내재적인 기능에 접근할 수 있습니다.사이즈의 훈리스트,

좋은 웹페이지 즐겨찾기