======================================================================
CnClasses ൥Ԫ
======================================================================

by ܾ (zjy@cnpack.org) 2002.07.09

CnClasses Ԫײʵ֡
õԪλڿSource/CommonĿ¼¡

----------------------------------------------------------------------
TCnPersistent
----------------------------------------------------------------------

TCnPersistent <-- TPersistent

֪ͨĳ־࣬ TPersistentҪ˸֪ͨȹ
ܡ

  TCnPersistent = class(TPersistent)
  protected
    procedure Changing; virtual;
    procedure Changed; virtual;
    function GetOwner: TPersistent; override;
    function IsUpdating: Boolean;
    procedure OnChildChanging(Sender: TObject); virtual;
    procedure OnChildChange(Sender: TObject); virtual;
    procedure SetUpdating(Updating: Boolean); virtual;
    property Owner: TPersistent;
  public
    constructor Create; overload; virtual;
    constructor Create(AOwner: TPersistent); overload;
    constructor Create(ChangeProc: TNotifyEvent); overload;
    constructor Create(ChangingProc, ChangeProc: TNotifyEvent);
      overload;
    procedure BeginUpdate; virtual;
    procedure EndUpdate; virtual;
  published
    property OnChanging: TNotifyEvent;
    property OnChange: TNotifyEvent;
  end;

1. ֪ͨ
------------

ϵͳУԵĸֵһıǩ 
CaptionFont Զʹǩػ档ͨؼʹһͨ÷
ֵԱ¼ Paint ݵǰػؼ
д Invalidate ֪ͨؼػ档

ΪԵһֶΣǾһЩصԴһΪ
дԱ༭ʱжǶףʹ֪ͨøӣ
TCnPersistentͨ³Աֹԣ

  protected
    procedure Changing; virtual;
    ʼͨһϳĲеãǰ¼Ϊ0
    OnChanging¼

    procedure Changed; virtual;
    ѱָʾĳѷ仯ǰ¼Ϊ0
    OnChange¼һдС

    procedure OnChildChanging(Sender: TObject); virtual;
    Կʼ¼룬ĬϲͬChangingΪ
    Sender

    procedure OnChildChange(Sender: TObject); virtual;
    ѱ¼룬ĬϲͬChangedΪ
    Sender

  public
    constructor Create(ChangeProc: TNotifyEvent); overload;
    һOnChange¼ֵ

    constructor Create(ChangingProc, ChangeProc: TNotifyEvent);
      overload;
    OnChangingOnChange¼ֵ

  published
    property OnChanging: TNotifyEvent;
    Կʼ¼

    property OnChange: TNotifyEvent;
    ѱ¼

2. ¼
-----------

ʱûԣÿһԶؼдĴ
ʹٶȱһø¼ķ

  protected
    function IsUpdating: Boolean;
    ڸ±־ʾǰһĿڸ¡

    procedure SetUpdating(Updating: Boolean); virtual;
    ״̬仯ĬϵĴǵUpdatingΪTrueʼ״
    ̬ʱChanging֮ʾ½Changed

  public
    procedure BeginUpdate; virtual;
    ʼ£Ӹ¼¼0ʱChangingChanged
    ĵò¼ʹʱEndUpdateɶʹã
    try...finally..endǶ׵ø÷ʱһε
    SetUpdating(True)

    procedure EndUpdate; virtual;
    £ٸ¼BeginUpdateɶʹãǶ׵ø÷
    ʱһεSetUpdating(False)

3. ṩOwner 
----------------
(˼ɿ  ṩ)

ĳЩⳡϣIDEҪȡԵOwnerԻһ·
TCollectionҪЧṩOwnerԡDelphiṩ
TOwnedCollectionɸùܣһTCollection
УֱӺͼӵ߶ӦṩOwnerԣʹIDE
ԻһComponentName.Property1.Property2.Collection
·ΨһʶTCollectionʵᷢ
޷ʹTCollectionԵԱ༭

TCnPersistentṩ½

  protected
    function GetOwner: TPersistent; override;
    TPersistentGetOwnerOwnerԣɲٹġ

    property Owner: TPersistent;
    ҪʱʵOwnerԣֶ֧д

  public
    constructor Create(AOwner: TPersistent); overload;
    ๹֧Owner


----------------------------------------------------------------------
TCnThreadPersistent
----------------------------------------------------------------------

TCnThreadPersistent <-- TCnPersistent <-- TPersistent

̰߳ȫĸ֪ͨ־̰࣬߳ȫĿƴ롣

VCL̰߳ȫģ߳ͬʱһؼʱ
֪TThreadṩһSynchronizeһķ̷߳
ͨϢ͵̵ִ߳УԻ÷VCLʱͬ
TCnThreadPersistentҪΪʱĳͻƣ
ҪοTCanvasʵַ

  TCnThreadPersistent = class(TCnPersistent)
  protected
    property LockCount: Integer;
    ǰֻ

  public
    procedure Lock;
    ӼٽԱʳͻ÷
    Unlockɶʹãtry...finally..end

    function TryLock: Boolean;
    ԼǰLockCountΪ0سɹ־
    ɹûӦ

    procedure Unlock;
    ټ뿪ٽ÷Lockɶʹá
  end;

ҪעǣʹTCnThreadPersistentĴ벢߳
ȫġ̰߳ȫҪûԼ֤TCnThreadPersistentֻṩ
ʵֵķѡһݴڶ߳ʹãҲ
ִеĹб߳룬ûӦķδ룺

bgein
  CnThreadPersistent.Lock;
  try
    ...  // ҪĴ
  finally
    CnThreadPersistent.Unlock;
  end;
end;


----------------------------------------------------------------------
TCnComponent
----------------------------------------------------------------------

TCnComponent <-- TComponent <-- TPersistent

CnPack࣬ǰ˰ȨϢܣЩϢĹ
С

  TCnComponent = class(TComponent)
  protected
    function GetAuthorCount: Integer; virtual;
    ȡظ÷ĬΪ0

    function GetAuthor(Index: Integer): string; virtual;
    ȡߺΪţ0ʼظ÷
    

    function GetEmail(Index: Integer): string; virtual;
    ȡ亯Ϊţ0ʼظ÷
    

    function GetComment: string; virtual;
    ȡעͺظ÷ע

  published
    property About: TCnCopyright;
    ĹԣעԱ༭ʾȨϢ
  end;
