Форум: "Компоненты";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
ВнизTOwnedCollection и стандартный редактор. Найти похожие ветки
← →
Schooler (2005-09-27 13:41) [0]Вот такая ситуация:
Пишу компонент TEstringGrid = class(TStringGrid).
Добавляю свойство Columns:TOwnedCollection.TColumn=class(TCollectionItem)
...
TColumns=class(TOwnedCollection)
public
...
function Add:TColumn;
...
end;
...
TEStringGrid = class(TStringGrid)
...
published
...
property Columns:TColumns read FColumns write SetColumns;
...
end;
Для коллекции Columns в design-time использую стандартный редактор.
Когда в этом редакторе добавляю/удаляю в коллекцию элемент, необходимо синхронизировать значение свойствTEstringGrid.ColCount = TEstringGrid.Columns.Count.
Вот незадача, не могу увязать изменения сделанные в стандартном редакторе:function TColumns.Add:TColumn;
begin
{
Такое чувство, что редактор не пользуется этим методом :(
Тогда каким ?
}
Self.FEStringGrid.ColCount:=Self.Count+1;
result :=TColumn(inherited Add);
end;
Чего не так делаю ?
← →
jack128 © (2005-09-27 21:18) [1]Не очень понял, что имеется ввиду, но может поможет..
if (csDesigning in FEStringGrid.ComponentState) then
GetParentForm(FEStringGrid).Designer.Modified;
← →
GuAV © (2005-09-27 23:25) [2]
> Когда в этом редакторе добавляю/удаляю в коллекцию
> элемент, необходимо синхронизировать значение свойствtype
TColumns=class(TOwnedCollection)
...
protected
...
procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override;
...
end;
← →
Schooler (2005-09-28 09:58) [3]To jack128 & GuAV
Вот работаем мы со стандартным TDBGrid:
Вазываем редактор колонок (стандартный) и добавляем колонку:Что мы видим на форме? Правильно, колонка немедленно добавляется в экземпляр TDBGrid"a. Я то разумел, что ответственен за это следующий кусок кода:
function TColumns.Add:TColumn;
begin
{
Такое чувство, что редактор не пользуется этим методом :(
Тогда каким ?
Конкретно заявляю: Владельцу коллекции немедленно увеличить
число колонок!!!
}
Self.FEStringGrid.ColCount:=Self.Count+1;
result :=TColumn(inherited Add);
end;
Ан нет, результат - полный игнор! ПОЧЕМУ???
Более того, если я буду использовать свой редактор коллекции, и там пропишу Владельцу такую инструкцию, то все будет, по-видимому, выполнено.
Конкретно to GuAV
Щас попробую!
← →
Schooler (2005-09-28 14:10) [4]Блин, это надо делать в Контсрукторе/Деструкторе TCollectionItem !
Офигеть!
← →
Юрий Зотов © (2005-09-28 14:52) [5]> Schooler (28.09.05 14:10) [4]
Похоже, Вы пытаетесь перекрыть статический метод - но, поскольку редактор работает не с Вашим классом TColumn, а с общим TCollectionItem, то, естественно, вызывается старый метод, а не Ваш.
Посмотрите метод TCollection.Update - похоже, это то, что Вам нужно.
← →
Юрий Зотов © (2005-09-28 15:35) [6]А решение [2], пожалуй, действительно наилучшее.
← →
Schooler (2005-09-28 15:53) [7]To Юрий Зотов ©
TCollection.Update я посмотрю, спасибо. Решение [2] - Notify ? Я просто не въезжаю, честно говоря, как его использовать. Т.е. у меня полное непонимание! Может прокомментируете кодом? Честно - аналогии посмотрел в исходниках DELPHI, попробовал у себя, но ничего не добился:(
Как этот Notify работает ?
Что скажете про [4]? Вроде работает...
И еще. В стандартном редакторе меняю положение TCollectionItem. Как узнать/прореагировать об этом светлом деянии???
← →
Юрий Зотов © (2005-09-28 16:47) [8]> Schooler (28.09.05 15:53) [7]
> Как этот Notify работает?
Описано в справке. Просто вызывается при добавлении или удалении элемента коллекции. Есть тонкость: в отличие от Update, который вызывается ПОСЛЕ добавления или удаления, Notify вызывается ПОСЛЕ добавления, но ПЕРЕД удалением - это надо учесть. Еще надо учесть, что Update может вызываться не только при добавлении или удалении элементов, и что Update может срабатывать не сразу, а ПОСЛЕ последнего вызова EndUpdate.
> Что скажете про [4]? Вроде работает...
Пишу: TColumn.Create(nil) - и не сработает. Или переназначаю свойство Collection (т.е., перебрасываю элемент в другую коллекцию) - и тоже не сработает. А Update (или Notify) сработают всегда.
> В стандартном редакторе меняю положение TCollectionItem. Как
> узнать/прореагировать об этом светлом деянии???
Перекрыть SetIndex у элемента коллекции, или все тот же Update у самой коллекции.
← →
Schooler (2005-09-29 09:57) [9]To Юрий Зотов ©
В какой версии DELPHI появился TCollection.Notify ?
← →
Юрий Зотов © (2005-09-29 13:45) [10]В D7 точно есть, в какой появился - не помню.
← →
Schooler (2005-09-29 14:19) [11]To Юрий Зотов ©
Вот и я в D5 не вижу такого.
← →
GuAV © (2005-09-29 14:38) [12]I>
> Вот и я в D5 не вижу такого.
Значит, [2] не получится.
Существуют методы Added и Deleting. В D7 они помеченны как deprecated, верятно они и испльзуются вместо Notify в D5.
Можно также использвать Update.
← →
Schooler (2005-09-29 14:58) [13]To GuAV ©
В D5 не вижу методы Added и Deleting.
Просвятите, пож., про deprecated.
> Можно также использвать Update.
Хорошо, как внутри Update распознать cnAdded, cnDeleting ?
← →
Юрий Зотов © (2005-09-29 15:04) [14]> Schooler (29.09.05 14:58) [13]
> как внутри Update распознать cnAdded, cnDeleting ?
А зачем распознавать? Просто синхронизируем счетчики, да и все, а уж по какой там причине был вызван Update - для этой задачи неважно.
← →
Schooler (2005-09-29 15:22) [15]To Юрий Зотов ©
Согласен, для текущей задачи пока необходимости не видно.
СПАСИБО БОЛЬШОЕ ВСЕМ!
← →
GuAV © (2005-09-29 15:23) [16]
> В D5 не вижу методы Added и Deleting.
Значит тоже нет :(
> Просвятите, пож., про deprecated.
deprecated означает, что идентификатор сохранён в целях обеспечения братной совместимсти.
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c