Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

Форма c компонентом при ткрытии в design дает "Error creating"   Найти похожие ветки 

 
Anatoly ©   (2005-06-15 11:39) [0]

В моем компоненте есть коллекция, элементы которой имеют ссылку на гриды, в том числе на находящиеся на других формах.
Так вот, пока эти формы не будут открыты, при открытии формы с компонентом возникает ошибка.
Подскажите пожалуйста, как это обойти. ImageList вроде ведет себя корректно в данных ситуациях (на картинки ссылаться можно откуда угодно)


 
Юрий Зотов ©   (2005-06-15 12:11) [1]

Ссылка на что угодно будет давать ошибку, если это "что угодно" не существует (еще не создано или уже уничтожено), а мы пытаемся с ним работать. Будь то хоть картинки, хоть гриды.


 
Anatoly ©   (2005-06-15 16:26) [2]

Спасибо. Посмотрел, где я работаю с гридом, которого может не быть, все стало работать. Но проблема осталась. Надо видеть гриды, которых еще нет (формы с ними закрыты в дизайне)
Посмотрел, как ActionList работает с ImageList, если форма с ImageList закрыта. Если у компонента ActionList выбран ImageList, а форма с ним закрыта, то ActionList каким-то образом видит ImageList, более того, позволяет менять его свойства, как будто он его воссоздает. ПОдскажите пожалуйста, каким образом, не нашел, где это может происходить


 
-=XP=- ©   (2005-06-15 16:52) [3]

как будто он его воссоздает

Восставшие из ада - 2.

Если у компонента ActionList выбран ImageList, а форма с ним закрыта, то ActionList каким-то образом видит ImageList, более того, позволяет менять его свойства

А вот это опишите подробнее.


 
Anatoly ©   (2005-06-15 17:06) [4]

создаем две формы. На первой - ActionList (далее AL), на второй - ImageList (далее IL). В АL выбираем IL. (Что интересно, в выпадающем списке он появляется только при открытой второй форме, на которой IL собственно и сидит).
Далее закрываем форму, на которой IL.
При этом в АL остается ссылка на AL. Нажимаем на +, видим его свойства, меняем их. (Мой компонент на этом месте генерит Access Violation)
Далее открываем вторую форму с IL. Смотрим - свойства действительно поменялись.
Вот и говорю, что воссоздает. :) только каким образом??


 
Anatoly ©   (2005-06-15 17:14) [5]

Поправка - "...При этом в АL остается ссылка на IL..."


 
-=XP=- ©   (2005-06-15 17:15) [6]

Далее закрываем форму

"Закрывать" по-разному можно. В DesignTime она просто скрывается (Hide), и продолжает существовать.


 
Anatoly ©   (2005-06-15 17:16) [7]

Закрываем именно модуль, а не только форму.


 
-=XP=- ©   (2005-06-15 17:39) [8]

Это не мешает Delphi вносить изменения в файл формы.
В исходном коде проекта закомментируйте в разделе uses вторую форму, сохраните проект и переоткройте.


 
Anatoly ©   (2005-06-15 17:59) [9]

закомментировал, сохранил, переоткрыл.
Действительно, ссылка на IL пропала. Открываю модуль с IL - появляется.
Но мой компонент ссылается на формы с гридами, которые включены в проект. Почему же у меня не работает?


 
-=XP=- ©   (2005-06-15 18:21) [10]

Почему же у меня не работает?

Вам сказать, в какой строке ошибка?


 
Юрий Зотов ©   (2005-06-15 22:35) [11]

> Anatoly

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

type
 TMyComp = class;

 TMyItem = class(TCollectionItem)
 private
   FGrid: TDBGrid;
   procedure SetGrid(const Value: TDBGrid);
   function GetMyComp: TMyComp;
 protected
   procedure Notification(AComponent: TComponent; Operation: TOperation); dynamic;
 public
   property MyComp: TMyComp read GetMyComp;
 published
   property Grid: TDBGrid read FGrid write SetGrid;
 end;

 TMyItems = class(TOwnedCollection)
 private
   function GetMyComp: TMyComp;
 protected
   procedure Notification(AComponent: TComponent; Operation: TOperation); dynamic;
 public
   property MyComp: TMyComp read GetMyComp;
 end;

 TMyComp = class(TComponent)
 private
   FMyItems: TMyItems;
   procedure SetMyItems(const Value: TMyItems);
 protected
   procedure Notification(AComponent: TComponent; Operation: TOperation); override;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property MyItems: TMyItems read FMyItems write SetMyItems;
 end;

implementation

{ TMyItem }

function TMyItem.GetMyComp: TMyComp;
begin
 Result := TMyItems(GetOwner).MyComp
end;

procedure TMyItem.Notification(AComponent: TComponent; Operation: TOperation);
begin
 if (Operation = opRemove) and (AComponent = FGrid) then
   SetGrid(nil)
end;

procedure TMyItem.SetGrid(const Value: TDBGrid);
begin
 if FGrid <> Value then
 begin
   if FGrid <> nil then
     FGrid.RemoveFreeNotification(MyComp);
   FGrid := Value;
   if FGrid <> nil then
     FGrid.FreeNotification(MyComp)
 end
end;

{ TMyItems }

function TMyItems.GetMyComp: TMyComp;
begin
 Result := TMyComp(GetOwner)
end;

procedure TMyItems.Notification(AComponent: TComponent; Operation: TOperation);
var
 i: integer;
begin
 for i := 0 to Count - 1 do
   TMyItem(Items[i]).Notification(AComponent, Operation)
end;

{ TMyComp }

constructor TMyComp.Create(AOwner: TComponent);
begin
 inherited;
 FMyItems := TMyItems.Create(Self, TMyItem)
end;

destructor TMyComp.Destroy;
begin
 FMyItems.Free;
 inherited
end;

procedure TMyComp.Notification(AComponent: TComponent; Operation: TOperation);
begin
 inherited;
 if Operation = opRemove then
   FMyItems.Notification(AComponent, Operation)
end;

procedure TMyComp.SetMyItems(const Value: TMyItems);
begin
 FMyItems.Assign(Value)
end;



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
14-1133638993
Piter
2005-12-03 22:43
2005.12.25
Российские комманды в европейских кубках


3-1131016316
oleggar
2005-11-03 14:11
2005.12.25
Clipper


2-1134139169
Zilog
2005-12-09 17:39
2005.12.25
ShellExecute


9-1122435799
olorint
2005-07-27 07:43
2005.12.25
Модальные формы и OpenGL


14-1133527749
Максим
2005-12-02 15:49
2005.12.25
Все решено