Главная страница
    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.47 MB
Время: 0.031 c
3-1089967516
Trofimov
2004-07-16 12:45
2004.08.15
Экспорт из FastReport


6-1087196537
Separator
2004-06-14 11:02
2004.08.15
закачка на FTP


14-1091271685
Sharknet.Ru
2004-07-31 15:01
2004.08.15
Есть у кого-нибудь хорошая работающая прграмма?


4-1088869764
AlexZ
2004-07-03 19:49
2004.08.15
Transparent label on WinAPI


1-1091090587
ksu
2004-07-29 12:43
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский