Форум: "Компоненты";
Текущий архив: 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.012 c