Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

Создание копии (одной или нескольких) компонента 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.033 c
14-1091027934
Knight
2004-07-28 19:18
2004.08.15
Чё-то меня последнее время всё больше тянет...


1-1091199487
Studentik
2004-07-30 18:58
2004.08.15
Стиль XP в WinXP


1-1091133724
nick_mas
2004-07-30 00:42
2004.08.15
Как в Form.Caption поместить текст с правой и левой стороны?


1-1090873061
Serge_
2004-07-27 00:17
2004.08.15
Нити потоки TThread кому интересно тыкайте.


1-1091506783
СержК
2004-08-03 08:19
2004.08.15
Как запустить внешнюю программу с параметром





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский