Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

Создание копии (одной или нескольких) компонента RTTI   Найти похожие ветки 

 
Afonya   (2004-07-30 17:05) [0]

Добрый день!
   Пробую я сделать копию компонента (панель + на ней еще несколько других контролов).
   Записую их в поток, а вот создать копии из потока не могу, так как система крычыть, что компонент с таким именем уже существует. Пробовал перехватывать событие Reader.OnSetName - но ошибка почему то происходит раньше.

   У меня к Вам большая просьба, если кто наступал на эти грабли - помогите!


 
Digitman ©   (2004-07-30 17:15) [1]


> система крычыть, что компонент с таким именем уже существует


не ври
если система и кричит, то жалуется не на "несуществование компонента", а на отсутствие в RTTI сведений о классе


 
Afonya   (2004-07-30 17:17) [2]

В том то и дело, что перед тем как заганять компонент в поток - я его регистрирую...   И регистрация проходит на ура!
В чем еще может быть дело ума не приложу.
Видать жара влияет...  :-)


 
Digitman ©   (2004-07-30 17:25) [3]


> Afonya


код где ?


 
Afonya   (2004-07-30 17:38) [4]


function BSV_ScrollBox.DuplicateBlanks(Blank: BSV_Blank): BSV_Blank;
var
  Stream  : TMemoryStream;
  Reader  : TUniqueReader;
  NewBlank: TComponent;
begin
    Result := nil;
    try
       Stream := TMemoryStream.Create;
       Stream.WriteComponent(Blank);
       Stream.Seek(0, soFromBeginning);

       NewBlank.Parent := Blank.Parent;
       Stream.ReadComponent(NewBlank);
       Result := NewBlank;}

       while Stream.Position < Stream.Size-1 do
             begin
                  Reader := TUniqueReader.Create(Stream,4096);
                  with Reader do
                  try
                     OnSetName := Reader.SetNameUnique;
                     NewBlank := BSV_Blank.Create(Self);
                     // --  ВОТ ТУТ ТО И ОШИБОЧКА ПРОИСХОДИТ --
                     NewBlank := ReadRootComponent(Blank);
                     // ---------------------------------------  
                  finally
                     Reader.Free;
                  end;
             end;
       Result := BSV_Blank(NewBlank);
    finally
       Stream.Free;
    end;
end;

procedure TUniqueReader.SetNameUnique( Reader: TReader;
                                      Component: TComponent; // Считываемый компонент
                                      var Name: string // Имя компонента для дальнейшей модификации
                                     );
begin
    Name := GetNextName(Component)
end;

function GetNextName (MyComponent : TComponent): string;
var
 I        : Integer;
 TempName : string;
begin
    I := 0;
    TempName := "";
    if assigned(MyComponent) then
       repeat
             inc(I,1);
             TempName := Format("%s%d", [MyComponent.ClassName, I]);
       until MyComponent.Owner.FindComponent(TempName) = nil;
    Result := TempName;
end;



 
Юрий Зотов ©   (2004-07-30 17:41) [5]

Если Owner копии тот же, что и у оригинала, то, конечно, будет орать - при считывании свойства Name вызывается SetName, а оттуда - ValidateRename.

Отсюда и набор возможных решений:
1. Считывать копию из потока без ее предварительного создания.
2. Создавать копию с другим Owner"ом или вообще без него.
3. Заместить в компоненте SetName.
4. Заместить в компоненте ValidateRename.
и т.д.



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.043 c
3-1090408109
sashuly
2004-07-21 15:08
2004.08.15
текущая колонка в DBGrid


3-1090407050
Алексей
2004-07-21 14:50
2004.08.15
Вопрос по сортировке данных


4-1088605120
Paulik
2004-06-30 18:18
2004.08.15
Странность в работе с DLL под Delphi и Visual Basic


14-1090925172
Vovchik_A
2004-07-27 14:46
2004.08.15
Кстати, об отдыхе...


4-1088780499
vajo
2004-07-02 19:01
2004.08.15
процент копирования файла