1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
   |  
//---------------------------------------------------------------------------
#pragma hdrstop
 
#include "Unit_Duplicate_Instance.h"
 
//---------------------------------------------------------------------------
 
#pragma package(smart_init)
 
 
class TUniqueReader : public TReader
{
private:
  void __fastcall SetNameUnique(TReader *Reader, TComponent *Component, AnsiString  &Name);
public:
  TComponent *LastRead;
  void __fastcall ComponentRead(TComponent *Component);
  __fastcall virtual TUniqueReader(TStream *Stream, int BufSize);
};
 
//----------------------------------------------------------------------------------------------
__fastcall TUniqueReader::TUniqueReader(TStream *Stream, int BufSize): TReader(Stream, BufSize)
{
  OnSetName = SetNameUnique;
  LastRead = NULL;
}
//----------------------------------------------------------------------------------------------
void __fastcall TUniqueReader::ComponentRead(TComponent *Component)
{
  LastRead = Component;
}
//----------------------------------------------------------------------------------------------
void __fastcall TUniqueReader::SetNameUnique(TReader *, TComponent *Component, AnsiString  &Name)
{
  int i = 0;
  AnsiString tempname = Name;
  while(Component->Owner->FindComponent(Name)!= NULL)
  {
    i++;
    TVarRec v[2] = {tempname, i};
    Name = Sysutils::Format("%s%d", v, 2);
  }
}
//----------------------------------------------------------------------------------------------
void RegisterComponentClasses(TComponent *AComponent)
{
   int i;
   TWinControl *C;
   RegisterClass(AComponent->ClassType());
   if(dynamic_cast<TWinControl*>(AComponent)!= NULL)
   {
      C = dynamic_cast<TWinControl*>(AComponent);
      if(C->ControlCount > 0)
      {
         for (i=0; i< C->ControlCount-1; i++)
         {
            RegisterComponentClasses(C->Controls[i]);
         }
      }
   }
}
//----------------------------------------------------------------------------------------------
TComponent* DuplicateComponents(TComponent *AComponent)
{
  TMemoryStream *Stream       = NULL;
  TUniqueReader *UniqueReader = NULL;
  TWriter       *Writer       = NULL;
  TComponent    *MyComponent  = NULL;
  try
  {
    Stream = new TMemoryStream;
    RegisterComponentClasses(AComponent);
    try
      {
        Writer =  new TWriter(Stream, 4096);
        Writer->Root = AComponent->Owner;
        Writer->WriteSignature();
        Writer->WriteComponent(AComponent);
        Writer->WriteListEnd();
      }
    __finally
    {
        delete(Writer);
    }
    Stream->Position = 0;
    try
    {
      TWinControl *C = NULL;
      UniqueReader = new TUniqueReader(Stream, 4096);
      if(dynamic_cast<TWinControl*>(AComponent)!= NULL )
      {
         C = dynamic_cast<TWinControl*>(AComponent);
         UniqueReader->ReadComponents(C->Owner, C->Parent, UniqueReader->ComponentRead);
      }else UniqueReader->ReadComponents(AComponent->Owner, NULL, UniqueReader->ComponentRead);
      MyComponent = UniqueReader->LastRead;
    }
    __finally
    {
      delete(UniqueReader);
    }
  }
  __finally
  {
    delete(Stream);
  }
  return(MyComponent);
} | 
Partager