Главная страница
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.044 c
3-1090448400
Viner
2004-07-22 02:20
2004.08.15
ADO и MySQL


4-1089143996
Шубин С.
2004-07-06 23:59
2004.08.15
Прав тот, у кого больше прав...


1-1091102938
Andrew
2004-07-29 16:08
2004.08.15
Сохранение файла в Excel


1-1091200060
Antonmm
2004-07-30 19:07
2004.08.15
Всплывающая подсказка


11-1079078787
Mitka
2004-03-12 11:06
2004.08.15
Можно в StatusBar(KOL) добавить кнопку?