XPSingletonForm.pas
上传用户:yjb1804
上传日期:2021-01-30
资源大小:3105k
文件大小:5k
源码类别:

Email服务器

开发平台:

Delphi

  1. unit XPSingletonForm;
  2. {
  3.  $Source: /cvsroot/dunit/dunit/Contrib/DUnitWizard/Source/Common/XPSingletonForm.pas,v $
  4.  $Revision: 1.2 $
  5.  $Date: 2004/05/03 15:07:15 $
  6.  Last amended by $Author: pvspain $
  7.  $State: Exp $
  8.  TXPSingletonForm:
  9.  Implementation of the Singleton concept for TForm descendants.
  10.  All co-existent constructions of a (particular) descendant form type
  11.  will be references to a unique instance of that form type, rather than
  12.  separate instances.
  13.  Notes:
  14.  This implementation is not thread-safe, but that is not considered an issue
  15.  since all forms will most probably be created in the context of the
  16.  main/VCL/primary thread, ie directly, or serialized in the VCL thread via
  17.  TThread.Synchronise() calls.
  18.   This is basically a set'n'forget class. Create() (and Free() if Ownerless)
  19.  all instances of any descendant of this class as you would normally.
  20.  The only caveat is:
  21.  If you implement constructors and/or destructors in your subclass, reference
  22.  the <IsSoleRef> protected property declared in this class. See notes above
  23.  <IsSoleRef> declaration for details.
  24.  Copyright (c) 2001 by The Excellent Programming Company Pty Ltd
  25.  (Australia) (ABN 27 005 394 918).
  26.  Contact Paul Spain via email: paul@xpro.com.au
  27.  This unit is free software; you can redistribute it and/or
  28.  modify it under the terms of the GNU Lesser General Public
  29.  License as published by the Free Software Foundation; either
  30.  version 2.1 of the License, or (at your option) any later version.
  31.  This unit is distributed in the hope that it will be useful,
  32.  but WITHOUT ANY WARRANTY; without even the implied warranty of
  33.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  34.  Lesser General Public License for more details.
  35.  You should have received a copy of the GNU Lesser General Public
  36.  License along with this unit; if not, the license can be viewed at:
  37.  http://www.gnu.org/copyleft/lesser.html
  38.  or write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  39.  Boston, MA  02111-1307  USA
  40.  }
  41. interface
  42. uses
  43.   Classes,  // TComponent
  44.   Forms;    // TForm
  45. type
  46.   TXPSingletonForm = class(TForm)
  47.     protected
  48.     FRefCount: integer;
  49.     function GetIsSoleRef: boolean;
  50.     public
  51.     class function NewInstance: TObject; override;
  52.     constructor Create(AOwner: TComponent); override;
  53.     destructor Destroy; override;
  54.     procedure FreeInstance; override;
  55.     property RefCount: integer read FRefCount;
  56.   { You must reference <IsSoleRef> property in your subclass constructor(s).
  57.     If <IsSoleRef> is true, you need to execute any code you may have in your
  58.     subclass constructor(s). If false, you don't need to execute your code, as
  59.     it has been executed in a previous constructor call.
  60.     You must also reference <IsSoleRef> property in your subclass destructor.
  61.     If <IsSoleRef> is true, you need to execute any code you may have in your
  62.     subclass destructor. If false, you don't need to execute your code, as
  63.     there are remaining references to the singleton. }
  64.     property IsSoleRef: boolean read GetIsSoleRef;
  65.   end;
  66. implementation
  67. const CVSID: string = '$Header: /cvsroot/dunit/dunit/Contrib/DUnitWizard/Source/Common/XPSingletonForm.pas,v 1.2 2004/05/03 15:07:15 pvspain Exp $';
  68. var
  69.   Singletons: TStringList;
  70. //////////////////////////////////////////////////////////////////////////
  71. //    TXPSingletonForm implementation
  72. //////////////////////////////////////////////////////////////////////////
  73. constructor TXPSingletonForm.Create(AOwner: TComponent);
  74.   begin
  75.   if IsSoleRef then
  76.     inherited;
  77.     
  78.   end;
  79. destructor TXPSingletonForm.Destroy;
  80.   begin
  81.   System.Dec(FRefCount);
  82.   if RefCount = 0 then
  83.     begin
  84.     with Singletons do Delete(IndexOf(self.ClassName));
  85.     inherited Destroy;
  86.     end;
  87.   end;
  88. procedure TXPSingletonForm.FreeInstance;
  89.   begin
  90.   { Exit point for destruction process. }
  91.   { Release memory only when all references gone. }
  92.   if RefCount = 0 then
  93.     inherited FreeInstance;
  94.   end;
  95. function TXPSingletonForm.GetIsSoleRef: boolean;
  96.   begin
  97.   Result := (RefCount = 1);
  98.   end;
  99. class function TXPSingletonForm.NewInstance: TObject;
  100.   var
  101.   idx: integer;
  102.   begin
  103.   { Entry point for construction process. }
  104.   idx := Singletons.IndexOf(ClassName);
  105.   if idx <> -1 then
  106.     { Previous instance. Return singleton. }
  107.     Result := Singletons.Objects[idx]
  108.   else
  109.     begin
  110.     { First instance. Allocate memory *and* initialise - InitInstance
  111.       is called by inherited method. }
  112.     Result := inherited NewInstance;
  113.     { Register class name and associated instance. }
  114.     Singletons.AddObject(ClassName, Result);
  115.     end;
  116.   { Increment reference count. }
  117.   System.Inc(TXPSingletonForm(Result).FRefCount);
  118.   end;
  119. initialization
  120.   Singletons := TStringList.Create;
  121. finalization
  122.   Singletons.Free;
  123. end.