Mmcmpman.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:6k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 20.01.1998 - 18:00:00 $                                      =}
  24. {========================================================================}
  25. unit MMCmpMan;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29.     MMObj,
  30.     Classes;
  31. type
  32.     TMMFindUniqueName = procedure(Sender: TObject; C: TComponent; var Name: string) of object;
  33.     {-- TMMCompManager --------------------------------------------------}
  34.     TMMCompManager  = class(TMMNonVisualComponent)
  35.     private
  36.         FResult    : TComponent;
  37.         FOwner     : TComponent;
  38.         FParent    : TComponent;
  39.         FOnFindName: TMMFindUniqueName;
  40.         procedure   ComponentRead(C: TComponent);
  41.         procedure   ReaderSetName(Reader: TReader; Component: TComponent; var Name: string );
  42.     protected
  43.         function    UniqueName(C: TComponent; Name: string): string;
  44.         function    GetNewOwner: TComponent;
  45.         function    GetNewParent: TComponent;
  46.     public
  47.         procedure   SaveComponent(Stream: TStream; C: TComponent);
  48.         function    LoadComponent(Stream: TStream): TComponent;
  49.         function    CloneComponent(C: TComponent): TComponent;
  50.     published
  51.         property    OnFindUniqueName: TMMFindUniqueName read FOnFindName write FOnFindName;
  52.         property    Owner: TComponent read FOwner write FOwner;
  53.         property    Parent: TComponent read FParent write FParent;
  54.     end;
  55. implementation
  56. uses
  57.     SysUtils;
  58. {== TMMCompManager ======================================================}
  59. procedure TMMCompManager.SaveComponent(Stream: TStream; C: TComponent);
  60. var
  61.     W: TWriter;
  62. begin
  63.     W := TWriter.Create(Stream,1024);
  64.     try
  65.        W.Root := C.Owner;
  66.        W.WriteSignature;
  67.        W.WriteComponent(C);
  68.        W.WriteListEnd;
  69.     finally
  70.        W.Free;
  71.     end;
  72. end;
  73. {-- TMMCompManager ------------------------------------------------------}
  74. function TMMCompManager.LoadComponent(Stream: TStream): TComponent;
  75. var
  76.     R: TReader;
  77. begin
  78.     FResult := nil;
  79.     R := TReader.Create(Stream,1024);
  80.     try
  81.        R.OnSetName := ReaderSetName;
  82.        R.ReadComponents(GetNewOwner,GetNewParent,ComponentRead);
  83.     finally
  84.        R.Free;
  85.     end;
  86.     Result := FResult;
  87. end;
  88. {-- TMMCompManager ------------------------------------------------------}
  89. function TMMCompManager.CloneComponent(C: TComponent): TComponent;
  90. var
  91.     S: TMemoryStream;
  92. begin
  93.     S := TMemoryStream.Create;
  94.     try
  95.        SaveComponent(S, C);
  96.        S.Position := 0;
  97.        Result := LoadComponent(S);
  98.     finally
  99.        S.Free;
  100.     end;
  101. end;
  102. {-- TMMCompManager ------------------------------------------------------}
  103. procedure TMMCompManager.ComponentRead(C: TComponent);
  104. begin
  105.     FResult := C;
  106. end;
  107. {-- TMMCompManager ------------------------------------------------------}
  108. procedure TMMCompManager.ReaderSetName(Reader: TReader; Component: TComponent; var Name: string);
  109. begin
  110.     if (Reader.Root = GetNewOwner) and (GetNewOwner.FindComponent(Name) <> nil) then
  111.         Name := UniqueName(Component,Name);
  112. end;
  113. {-- TMMCompManager ------------------------------------------------------}
  114. function TMMCompManager.UniqueName(C: TComponent; Name: string): string;
  115. var
  116.     Base : string;
  117.     i    : Integer;
  118.     Sugg : string;
  119. begin
  120.     if assigned(FOnFindName) then
  121.     begin
  122.        FOnFindName(Self,C,Name);
  123.        Result := Name;
  124.     end
  125.     else
  126.     begin
  127.        Base := Copy(C.ClassName,2,MaxInt);
  128.        for i := 1 to MaxInt do
  129.        begin
  130.           Sugg := Base + IntToStr(i);
  131.           if GetNewOwner.FindComponent(Sugg) = nil then
  132.           begin
  133.              Result := Sugg;
  134.              Exit;
  135.           end;
  136.        end;
  137.        { TODO: Should be resource id }
  138.        raise Exception.Create('Not enough unique names');
  139.     end;
  140. end;
  141. {-- TMMCompManager ------------------------------------------------------}
  142. function TMMCompManager.GetNewOwner: TComponent;
  143. begin
  144.     if FOwner = nil then
  145.        Result := inherited Owner
  146.     else
  147.        Result := FOwner;
  148. end;
  149. {-- TMMCompManager ------------------------------------------------------}
  150. function TMMCompManager.GetNewParent: TComponent;
  151. begin
  152.     if FParent = nil then
  153.        Result := GetNewOwner
  154.     else
  155.        Result := FParent;
  156. end;
  157. end.