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