Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.49 MB
Время: 0.041 c
2-1141226299
KyRo
2006-03-01 18:18
2006.03.26
Ado Table


1-1140866456
Alex_C
2006-02-25 14:20
2006.03.26
TThread тормозит основную программу при выводе в мемо


4-1136631724
Igor_thief
2006-01-07 14:02
2006.03.26
Системный курсор


2-1141888862
Гость111
2006-03-09 10:21
2006.03.26
SQL


2-1142195886
kilop
2006-03-12 23:38
2006.03.26
Как приостановить процесс работы проги?





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