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

Вниз

Форма 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.013 c
3-1130968170
step[B.M.]
2005-11-03 00:49
2005.12.25
А какое железо по базу?


3-1131177971
nikk
2005-11-05 11:06
2005.12.25
слэшь в запросе MySql


8-1121674933
FXeS
2005-07-18 12:22
2005.12.25
Управление Winamp


5-1117623851
Skip
2005-06-01 15:04
2005.12.25
Создание компонентов с нуля. Киньте ссылку plz.


2-1133884135
VitGun
2005-12-06 18:48
2005.12.25
QuickReport. Печать текущей записи.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский