неполучается грузить ресурс inherited субкомпонента.

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

неполучается грузить ресурс inherited субкомпонента.

Сообщение alexrayne » 01.10.2009 22:03:41

Драсте шаманам.
написал компонент контейнер (FilterSet) - который в собственном списке содержит набор субкомпонентов (baseEventFilter). листинг ниже.
данный контейнер нормально сериализуетсяв базовой форму, но уже нехочет грузиться в унаследованой.
причина в том что немогут найтись предки субкомпонентов в предковой форме. насколько я понял ето потому что поиск предка идет по имени компонента в корне - тоесть в самой форме, а не в контейнере в котором они лежат.

если кто воевал, подскажите как лечица.

FiltersSet = class(TComponent)
protected
//FItems : LogTracks;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent);override;
function GetChildOwner: TComponent; override;
procedure Notification(AComponent: TComponent;
Operation: TOperation); override;
public

constructor Create(aOwner : TComponent);override;
destructor Destroy;override;
end;

implementation
uses AdressPaleteFrame
, sysutils
, strutils
;


{****************************************************************************
FiltersSet
******************************************************************************}
constructor FiltersSet.Create(aOwner : TComponent);
begin
inherited;
end;

destructor FiltersSet.Destroy;
begin
inherited;
end;
procedure FiltersSet.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
I: Integer;
OwnedComponent: TComponent;
begin
for I := 0 to ComponentCount - 1 do
begin
OwnedComponent := Components[I];
if not OwnedComponent.HasParent then Proc(OwnedComponent);
end;
end;

function FiltersSet.GetChildOwner: TComponent;
begin
result := self;
end;

procedure FiltersSet.Notification(AComponent: TComponent;Operation: TOperation);
var
SubComp : boolean;
begin
SubComp := (assigned(AComponent) and (AComponent.Owner = Self));
inherited;
if SubComp then begin
if assigned(FOnChange) then
FOnChange(Self, AComponent, Operation);
if Operation = opInsert then
AComponent.SetSubComponent(true)
else{ opRemove }
AComponent.SetSubComponent(false);
end;
end;
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: неполучается грузить ресурс inherited субкомпонента.

Сообщение carrots » 01.10.2009 22:19:30

alexrayne, вы не могли бы конкретнее писать о том что имеете ввиду под словом сериализация.
Потому что слово сериализация (в программировании) означает процесс перевода какой-либо структуры данных в последовательность битов, то есть, это может означать что угодно.

Я так понял вы хотите добавлять субкомпоненты в режиме дизайна и чтоб они оставались в runtime режиме?

Добавлено спустя 51 минуту 57 секунд:
что cаcается имен компонентов - их им можно давать
Код: Выделить всё
  TComponent.Create(self).Name:= 'test';


Добавлено спустя 23 минуты 11 секунд:
Я в подобных случаях в основном вручную записываю компонент и все дочерные компоненты в стрим (в свой формат файла).
Последний раз редактировалось carrots 02.10.2009 01:48:54, всего редактировалось 1 раз.
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: неполучается грузить ресурс inherited субкомпонента.

Сообщение alexrayne » 02.10.2009 00:26:21

Забыл уточнить - работаю в D7

Добавлено спустя 8 минут 36 секунд:
carrots писал(а):Я так понял вы хотите добавлять субкомпоненты в режиме дизайна и чтоб они оставались в runtime режиме?

да я создаю контейнер в форме, закладываю в него субкомпоненты отдельным редактором свойств, и ожидаю чтобы все сохранялось и загружалось.
оно и загружается, беда в том что если я делаю унаследованую\inherited форму, для субкомпонентов ненаходятся ancestorы по всей видимости по причине описаной в начале, дельфа материца по етому поводу и предлагает либо отбросить неудачные компоненты либо положить их на форму.

carrots писал(а):Я в подобных случаях в основном вручную записываю компонент и все дочерные компоненты в стрим (в свой формат файла).

я об етом и ранее подумывал, но понадеялся что стандартаная сериализация предоставит свой fixup, и ето былоб нелишнее.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: неполучается грузить ресурс inherited субкомпонента.

Сообщение Inferno » 02.10.2009 06:16:13

Храните всё ссылки на компоненты в элементах коллекции и будет вам счастье
Аватара пользователя
Inferno
новенький
 
Сообщения: 78
Зарегистрирован: 20.03.2009 14:40:20
Откуда: Тюмень

Re: неполучается грузить ресурс inherited субкомпонента.

Сообщение alexrayne » 02.10.2009 11:13:05

с коллекций я начал, и от них ушел - кода больше в разы а траблы тежесамые если небольше.
коллекции для других вещей предназначены.

если отказаться от хранения в контейнере самого компонента, а держать ссылку его, то появляется проблема с заданием имен компонентов - мне нужно чтобы подкомпонент имел уникальное имя в пределах контейнера, а если собственником компонента будет форма то имя должно быть уникальным в пределах формы. впринципе ето можно решить введя еще одно поле имени субкомпонента, может быть это и был бы более легкий выход, еслибы достаточно было держать только ссылку.
но компонент это не контрол - у него кто собственник, тот и хозяин.
может перебазировать свои типы с компонентов на контролы?

Добавлено спустя 2 часа 52 минуты 54 секунды:
уря!. лечение оказалось простым как 2капли:

@@ -52,6 +52,7 @@
constructor FiltersSet.Create(aOwner : TComponent);
begin
inherited;
+ SetInline(true);
end;

destructor FiltersSet.Destroy;
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

Рейтинг@Mail.ru
cron