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

Email服务器

开发平台:

Delphi

  1. unit XPStrings;
  2. {
  3.  $Source: /cvsroot/dunit/dunit/Contrib/DUnitWizard/Source/Common/XPStrings.pas,v $
  4.  $Revision: 1.2 $
  5.  $Date: 2004/05/03 15:07:15 $
  6.  Last amended by $Author: pvspain $
  7.  $State: Exp $
  8.  IXPStrings: interface to surface a TStrings object and provide an iterator
  9.  The requirement for this interface surfaced in the development of the
  10.  EPC Singleton classes. In a nutshell, there was a requirement for a unit-scope
  11.  instance of a TStrings, which was created/destroyed in the respective
  12.  initialization/finalization sections of the unit. However, with interfaced
  13.  objects, it is possible to retain references to objects after their definition
  14.  unit (where their class is declared and defined) has finalised. Any references
  15.  to unit-scope objects in this context will then be invalid.
  16.  By interfacing the unit-scope object (a TStrings) and storing a local
  17.  reference in any objects which use it, the unit-scope object will not be
  18.  destroyed until the last reference is released.
  19.  Copyright (c) 2000, 2003, 2004 by Excellent Programming Company ABN 27 005 394 918.
  20.  All rights reserved. This source code is not to be redistributed without
  21.  prior permission from the copyright holder.
  22.  }
  23. interface
  24. uses
  25.   Classes,          // TStrings declaration
  26.   XPIterator;       // IXPDualIterator
  27. ////////////////////////////////////////////////////////////////////////////
  28. ///          IStringsIface declaration
  29. ////////////////////////////////////////////////////////////////////////////
  30. type
  31.   IXPStrings = interface
  32.     ['{9CE27B61-9811-11D4-8C82-0080ADB62643}']
  33.     function Iterator: IXPDualIterator;
  34.     function GetStrings: TStrings;
  35.     property Strings: TStrings read GetStrings;
  36.     end;
  37. function CreateXPStrings(const IsSorted: boolean = false): IXPStrings; overload;
  38. function CreateXPStrings(const AStrings: TStrings;
  39.   const IsOwner: boolean = true): IXPStrings; overload;
  40. implementation
  41. const CVSID: string = '$Header: /cvsroot/dunit/dunit/Contrib/DUnitWizard/Source/Common/XPStrings.pas,v 1.2 2004/05/03 15:07:15 pvspain Exp $';
  42. //////////////////////////////////////////////////////////////////////////////
  43. //    TIStrings declaration
  44. //////////////////////////////////////////////////////////////////////////////
  45. type
  46.   TIStrings = class(TInterfacedObject, IXPStrings, IXPDualIterator)
  47.     private
  48.     FOwned: boolean;
  49.     FStrings: TStrings;
  50.     FCurrent: integer;
  51.     protected
  52.     // IXPStrings
  53.     function Iterator: IXPDualIterator;
  54.     function GetStrings: TStrings;
  55.     // IXPDualIterator
  56.     procedure Start;
  57.     procedure Finish;
  58.     function Next(out Element): boolean;
  59.     function Previous(out Element): boolean;
  60.     public
  61.     constructor Create(const IsSorted: Boolean); overload;
  62.     constructor Create(const AStrings: TStrings;
  63.       const IsOwner: boolean);  overload;
  64.     destructor Destroy; override;
  65.     end;
  66. //////////////////////////////////////////////////////////////////////////////
  67. //    IXPStrings factory implementation
  68. //////////////////////////////////////////////////////////////////////////////
  69. function CreateXPStrings(const IsSorted: boolean): IXPStrings;
  70.   begin
  71.   Result := TIStrings.Create(IsSorted);
  72.   end;
  73. function CreateXPStrings(const AStrings: TStrings;
  74.   const IsOwner: boolean): IXPStrings;
  75.   begin
  76.   Result := TIStrings.Create(AStrings, IsOwner);
  77.   end;
  78. //////////////////////////////////////////////////////////////////////////////
  79. //    TIStrings implementation
  80. //////////////////////////////////////////////////////////////////////////////
  81. constructor TIStrings.Create(const IsSorted: Boolean);
  82.   begin
  83.   inherited Create;
  84.   FOwned := true;
  85.   FStrings := TStringList.Create;
  86.   (FStrings as TStringList).Sorted := IsSorted;
  87.   end;
  88. constructor TIStrings.Create(const AStrings: TStrings; const IsOwner: boolean);
  89.   begin
  90.   inherited Create;
  91.   FOwned := IsOwner;
  92.   FStrings := AStrings;
  93.   end;
  94. destructor TIStrings.Destroy;
  95.   begin
  96.   if FOwned then
  97.     FStrings.Free;
  98.   inherited;
  99.   end;
  100. procedure TIStrings.Finish;
  101. begin
  102.   // Position beyond end of list
  103.   FCurrent := FStrings.Count;
  104. end;
  105. function TIStrings.GetStrings: TStrings;
  106.   begin
  107.   Result := FStrings;
  108.   end;
  109. function TIStrings.Iterator: IXPDualIterator;
  110. begin
  111.   Result := self;
  112. end;
  113. function TIStrings.Next(out Element): boolean;
  114. begin
  115.   System.Inc(FCurrent);
  116.   Result := (FCurrent >= 0) and (FCurrent < FStrings.Count);
  117.   if Result then
  118.     string(Element) := FStrings[FCurrent]
  119.   else
  120.     // reset on failure
  121.     System.Dec(FCurrent);
  122. end;
  123. function TIStrings.Previous(out Element): boolean;
  124. begin
  125.   System.Dec(FCurrent);
  126.   Result := (FCurrent >= 0) and (FCurrent < FStrings.Count);
  127.   if Result then
  128.     string(Element) := FStrings[FCurrent]
  129.   else
  130.     // reset on failure
  131.     System.Inc(FCurrent);
  132. end;
  133. procedure TIStrings.Start;
  134. begin
  135.   // Position before beginning of list
  136.   FCurrent := -1;
  137. end;
  138. end.