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