Форум: "Основная";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
Внизполная загрузка компонента Найти похожие ветки
← →
perov (2002-12-26 07:37) [0]есть два неких компонента (невизуальных) с1 и с2. с2 имеет свойство, указывающее на с1. В дизайнере указано, что с1 должен создватья раньше, чем с2. Для правильного функционирования компонента с2 нужно, чтобы на момен создания с2 компонет с1 уже существовал и были установлены все его свойства. (компонент с1 создает среду для работы с2).
При загрузке формы создание компонентов идет в следующем порядке:
1. Создается компонент с1
2. Создается компонент с2
3. Считываются и устанавливаются свойства с2
4. Считываются и устанавливаются свойства с1
в результате чего имеем неверное функционирование с2.
Можно ли "заставить" компонент с1 загрузиться полностью кроме как поместив компонентсы с1 и с2 на разные формы (ф1 и ф2 соответсвено) и обеспечив создание ф1 раньше, чем ф2?
← →
Юрий Зотов (2002-12-26 09:30) [1]Посмотрите метод Loaded. Он вызывается у каждого компонента после полной загрузки всей формы.
← →
perov (2002-12-26 09:39) [2]я его и юзаю, в методе Loaded компонента с1 как раз и подготавливается среда. Но дело в том, что с1.loaded вызывается только после того как с2 полностью загружен.
Попутный вопрос (ради интереса). В каком порядке считываются свойства? В алфавитном? В порядке описания? Или еще как-то? Менял порядок описания свойст, их названия, но они считываются в любом случае в определнном порядке...
← →
Юрий Зотов (2002-12-26 09:52) [3]1. В этом и ошибка. Для с1, как и для всех других компонентов, метод Loaded вызывается после полной загрузки всей формы - то есть, после загрузки c2. Среду нужно готовить раньше - например, в конструкторе c1.
2. Свойства загружаются в порядке их следования в DFM. Или (что то же самое) в порядке их объявления в описании класса. Сначала свойства предков (начиная с самого дальнего), потом собственные (но потомок может переобъявить свойство предка и тем самым изменить порядок его загрузки).
← →
perov (2002-12-26 10:02) [4]то есть схема загрузки компонентов выглядит так (упрощенно)?
C1.create
C2.create
.....
Cn.create
Cn.loaded
......
C2.Loaded
C1.Loaded
порядок может быть нарушен при разрешении ситуации csFixups.
или такая схема возникакет как раз при разрешении csFixups, а если связей нет, то
C1.create
C1.loaded
c2.reate
c2.loaded
......
???
← →
Юрий Зотов (2002-12-26 10:12) [5]Самое простое и наглядное - расставьте брейкпойнты и запустите программу. Брейкпойнты ставьте:
1. В конструкторах C1 и c2.
2. В каком-нибудь методе SetProp для C1 и C2 (в тех Prop, которые гарантированно есть в DFM).
3. В Loaded С1 и С2.
← →
Anatoly Podgoretsky (2002-12-26 10:36) [6]Да и не стоит расчитывать, что порядок обязательно будет такой же в других версиях компилятора, надо уходить от зависимости.
← →
perov (2002-12-26 10:41) [7]я таким образом и определил, что загрузка идет, как я описал в первом посте...
попробую под отладчиком посмотреть, как форма загружает компонеты, мож что и пойму :)
p.s.
Есть в VCL "темные" места. Например, при уничтоженни формы сначала у дочерних компонентов очищается свойство Parent и только потом вызывается BeforeDestroying и Destroy...
а я на праздники голову ломал - как это у дочернего компонента нет родителя, когда дочерний компонент еще существует :)
← →
perov (2002-12-26 10:51) [8]компоненты должны работать тандемом. если только в c2 поместить сам с1 а не ссылку на него...а это мысль...
← →
Anatoly Podgoretsky (2002-12-26 10:52) [9]Ну это нормально, в любой сомент можно присвоить nil
← →
Юрий Зотов (2002-12-26 22:30) [10]Все и так должно работать. Это же стандартная связка. В VCL огромная куча примеров, когда свойство одного компонента ссылается на другой компонент (напр. DBGrid-DataSource-DataSet, Label.FocusControl и пр.). И все нормально работает. Перекрывается Notification, пишется SetProp (для FreeNotification), вот и все.
← →
perov (2002-12-27 06:17) [11]Разобрался :)
Ошибка была у меня в коде, не делал нужных проверок в коде установки свойств (понадеялся что нужные свойства будут правильно установлены).
Вот теперь возник другой вопрос.
Возникла необходимость у элемента коллекции ввести событие. (Тут проблем нет, все элементрано). Потом в дизайнере пробую создать обработчик этого события и выходит ошибка "Cannot create a method for an unnamed component" (что вполне логично, так как элемент коллекции не имеет имени). При ручном создании обработчика он нормально выбирается. Как мне в элемент коллекции ввести свойство Name, которое взаимодействовало со средой? Сгенерировать уникальное имя не проблема.
← →
Юрий Зотов (2002-12-28 18:08) [12]Или я что-то не так понял, или что-то Вы перемудрили. Только что проверил - ввел событие в элемент коллекции. При двойном клике по нему в Инспекторе объектов прекрасненько, автоматически, без всяких проблем и без всяких моих усилий создается обработчик этого события. Имя он получает следующее:
Имя_компонента + Имя_его_свойства-коллекции + Индех_элемента + Имя_события_без_приставки_On
Например:
type
TMyItem = class(TCollectionItem);
...
published
property OnMyEvent: TNotifyEvent...
end;
TMyCollection = class(TCollection)
...
public
property Items[Index: integer]: TMyItem...
end;
TMyComp = class(...);
...
published
property MyCollection: TMyCollection...
end;
TForm1 = class(TForm)
MyComp1: TMyComp;
// Вот оно (сгенерено средой без моего участия):
procedure MyComp1MyCollection0MyEvent(Sender: Tobject);
procedure MyComp1MyCollection1MyEvent(Sender: Tobject);
...
end;
Не замещали ли Вы, часом, у коллекции и/или ее элементов методы GetOwner? Похоже, IDE рулит как раз по ним.
← →
perov (2002-12-29 06:14) [13]Наверное это я перемудрил...так как ввел у элемента коллекции свойство Name (для своих нужд), GetOwner не перекрывал.
Попробую его переименовать. Просмотрел текст TComponent, связанное с этим свойством и никаких специальных действий не заметил (кроме разрешения ссылок). Видимо IDE его как-то по-своему обрабатывает...
← →
Юрий Зотов (2002-12-29 09:59) [14]Свойство Name у элемента коллекции я тоже делал. Оно ничему не мешает.
Далее. У элемента коллекции GetOwner перекрывать не нужно. А вот у самой коллекции, наоборот, нужно (он должен вернуть ссылку на компонент - владелец коллекции). Альтернатива - отнаследовать коллекцию от TOwnedCollection, там это уже реализовано.
Рекомендую статью:
http://www.delphikingdom.com/helloworld/tcollection.htm
Никаких особых откровений там нет, но методология показана.
P.S.
Только что заметил, что в предыдущем своем сообщении вместо слова "Индекс" я написал "Индех". Эдакая "смесь французского с нижегородским" получилась. Рефлексы, однако...
:о)
← →
Дмитрий К.К. (2002-12-29 10:55) [15]Юрий, а мона вопрос?
Вот Вы сказали:
> Юрий Зотов © (26.12.02 09:52)
> 2. Свойства загружаются в порядке их следования в DFM. Или
> (что то же самое) в порядке их объявления в описании класса.
А если этот порядок не совпадает? То есть, допустим, я (воспользовавшись клавишами Ctrl + X, а затем Ctrl + V), меняю (в редакторе среды) местами порядок объявлений компонентов в описании класса формы. Было так:
Label: TLabel;
Button: TButton;
а стало наоборот.
Причем в DFM порядок остался прежним (то есть сначала компонент-надпись, а потом компонент-кнопка).
З.Ы. С наступающим Вам Новым годом!
← →
Юрий Зотов (2002-12-29 12:47) [16]> Дмитрий К.К. © (29.12.02 10:55)
1. Речь идет о свойствах, а не о полях.
2. Порядок полей в PAS не имеет значения. Форма грузится из DFM.
← →
Дмитрий К.К. (2002-12-29 12:49) [17]
> Юрий Зотов © (29.12.02 12:47)
Спасибо за ответ.
← →
vuk (2002-12-29 13:33) [18]Немного по поводу событий в элементах коллекций. Если используется версия Delphi ниже 6, то нужно иметь ввиду, что в дизайнере существовал баг, из-за которого такие обработчики нужно было применять весьма осторожно. Проявлялся этот баг при наследовании форм и при работе с фреймами и выражался в том, что при считывании таких обработчиков из DFM возникало нарушение доступа (Access Violation).
← →
perov (2002-12-29 13:44) [19]Спасибо.
Коллекцию писал руководствуясь книгой Ксавье Пачеко и Стив Тейксейра "Delphi 5 для разработчиков". А там про Owned ничего не сказано :(
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c