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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.052 c
1-1140421588
Chaser
2006-02-20 10:46
2006.03.26
Как изменить выделение строки в ListView?


2-1141668489
vital538
2006-03-06 21:08
2006.03.26
FireBird


2-1141658303
KyRo
2006-03-06 18:18
2006.03.26
Как Перевести число


2-1142085774
хочу все знать
2006-03-11 17:02
2006.03.26
изменение диапазона цикла FOR внутри цикла


15-1140039304
Piter
2006-02-16 00:35
2006.03.26
Заправка картриджей!