Конференция "Компоненты" » ImageIndex в TCollectionItem не показывается
 
  • Cobalt © (27.05.12 23:30) [0]
    сделал контрол с коллекцией
    type
     TEventsCalendar = class(TCustomControl)
     ...
       property Events: TCollection read FEvents write SetEvents;
     end;

    constructor TEventsCalendar.Create(AOwner: TComponent);
    begin
     inherited;
     FEvents := TCollection.Create(TEvent);
    end;

     TEvent = class (TCollectionItem)
     private
       FDate: TDateTime;
       FCaption: string;
       FImageIndex: Integer;
       procedure SetCaption(const Value: string);
       procedure SetDate(const Value: TDateTime);
       procedure SetImageIndex(const Value: Integer);
     published
       property Caption: string read FCaption write SetCaption;
       property ImageIndex: Integer read FImageIndex write SetImageIndex;
       property Date: TDateTime read FDate write SetDate;
     end;



    При редактировании коллекции (стандартным редактором) поле ImageIndex не отображается в доступных полях.
    Зато прекрасно отображается, если его переименовать в MyImageIndex.

    Что это за карма такая? Поле-которое-нельзя-называть?
  • DimaBr © (28.05.12 08:59) [1]
    Не думаю что простое переименование решает проблему с показом ImageIndex, поскольку ImageList скорее всего у вас в компоненте, а ImgeIndex в элементе коллекции. Пишите наследника от сюда
    http://pda.delphimaster.net/?id=1184916326&n=12
  • Cobalt © (28.05.12 10:03) [2]
     RegisterPropertyEditor(TypeInfo(Integer), TEvent, 'ImageIndex', TIntegerProperty);


    вроде так должно быть?
    P.S. Delphi XE
    P.P.S. Отключил пакет со стандартными компонентами - Et voila! - ImageIndex стал виден в списке свойств.

    Надо будет написать баг в QC...
  • DimaBr © (28.05.12 10:06) [3]
    Пропробуйте наследоваться от TOwnedCollection
  • DimaBr © (28.05.12 10:08) [4]
    Попробуйте объявить свойство ImageIndex типом не Integer, а TImageIndex
  • Cobalt © (28.05.12 10:31) [5]
    Уточню - у меня нет задачи показывать в ImageIndex картинку.
    Мне вполне достаточно установить его в дизайнере как целое число.
    Например, как в TreeView редактируешь элемент - ImageIndex, StateIndex и т.п.

    Но в редакторе свойство банально не отображается.
  • DimaBr © (28.05.12 12:33) [6]
    Тогда скорее всего наследование от TOwned Collection вам поможет
  • Cobalt © (29.05.12 08:59) [7]
    сделал тест:
    http://files.mail.ru/ET9Q1V

    На Д2007 и Д2010 свойство ImageIndex показывается
    на ДXE - свойство ImageIndex не показывается, пока не отключу пакет dclstd150.bpl
  • DimaBr © (29.05.12 12:27) [8]
    Проверено на DXE2, все работает.
    Для правильного функционирования редактора коллекции нужно переопределить
    function GetOwner: TPersistent; override;

    или же наследоваться от TOwnerCollection, в котором он уже переопределен

    { Collection class that maintains an "Owner" in order to obtain property
     path information at design-time }


     TOwnedCollection = class(TCollection)
     private
       FOwner: TPersistent;
     protected
       function GetOwner: TPersistent; override;
     public
       constructor Create(AOwner: TPersistent; ItemClass: TCollectionItemClass);
     end;

  • Cobalt © (29.05.12 18:50) [9]
    Я решительно не понимаю, к чему этот код?
    редактор коллекции прекрасно работает, элементы коллекции прекрасно сохраняются в dfm, за исключением одной малости - в редакторе элементов коллекции не отображается одно свойство
    unit TMyComponentUnit;

    interface

    uses
     Classes, Controls, SysUtils;

    type
     TEvent = class (TCollectionItem)
     private
       FDate: TDateTime;
       FCaption: string;
       FImageIndex: Integer;
       procedure SetCaption(const Value: string);
       procedure SetDate(const Value: TDateTime);
       procedure SetImageIndex(const Value: Integer);
     published
       property Caption: string read FCaption write SetCaption;
       property ImageIndex: Integer read FImageIndex write SetImageIndex;
       property Date: TDateTime read FDate write SetDate;
     end;

     TMyComponent = class(TCustomControl)
     private
       FEvents: TCollection;
       procedure SetEvents(const Value: TCollection);
     public
       constructor Create(AOwner: TComponent); override;
       destructor Destroy; override;
     published
       property Events: TCollection read FEvents write SetEvents;
     end;

    procedure Register;

    implementation

    procedure Register;
    begin
     RegisterComponents('Samples', [TMyComponent]);
    end;

     { TMyComponent }

    constructor TMyComponent.Create(AOwner: TComponent);
    begin
     inherited;
     FEvents := TOwnedCollection.Create(Self, TEvent);
    //  FEvents := TCollection.Create(TEvent);
    end;

    destructor TMyComponent.Destroy;
    begin
     FreeAndNil(FEvents);
     inherited;
    end;

    procedure TMyComponent.SetEvents(const Value: TCollection);
    begin
     FEvents.Assign(Value);
    end;

    { TEvent }

    procedure TEvent.SetCaption(const Value: string);
    begin
     FCaption := Value;
    end;

    procedure TEvent.SetDate(const Value: TDateTime);
    begin
     FDate := Value;
    end;

    procedure TEvent.SetImageIndex(const Value: Integer);
    begin
     FImageIndex := Value;
    end;

    end.


    DelphiXE - свойство ImageIndex все-равно не показывается.
  • DimaBr © (29.05.12 23:31) [10]
    Я привёл вам код самой Delphi, в котором и написана эта фраза
    { Collection class that maintains an "Owner" in order to obtain property
    path information at design-time }



    Почему свойство не отображается в коллекции - не знаю, но предполагаю что,  неправильно работает редактор коллекции из=за того что не переопределён GetOwner
  • Cobalt © (30.05.12 07:41) [11]
    Тут кто-то определенно тупит - или я, или ты.
    Зачем переопределять Owner? расскажи на пальцах, как ты сталкивался с такой особенностью, что свойство не показывалось из-за Ownder'а?
  • DimaBr © (30.05.12 08:33) [12]
    Вы читать умеете то что написано в исходниках Delphi ????
  • Cobalt © (30.05.12 09:36) [13]
    Да ты не переживай, я умею читать, и буквы, и слова.
    Разница использования
    TCollection и
    TOwnedCollection
    только (насколько я смог наблюдать) в отображении "полного пути, отображаемого в ObjectInspector" (соответственно):
    "TCollection[0]"
    и
    "MyComponent1.Evets[0]"

    Это, несомненно, очень познавательно и наглядно, спасибо что обратил на этот момент внимание - когда я буду делать компоненты с коллекциями, буду использовать TOwnedCollection.

    Но, судя взволнованному тону, ты, видимо, имел в виду другой аспект?
    Какой-же? не томи!
  • DimaBr © (30.05.12 10:52) [14]
    Вы не находите что пришли сюда за помощью, а начинаете хамить и тыкать ?

    Повторяю, что DXE2 - ошибки нет, какой редактор прячет ваше свойство я не знаю, может ваш собственный или постороннего компонента. Попробуйте поотключать посторонние пакеты, а не сразу dclstd150
  • Cobalt © (30.05.12 12:35) [15]
    Видимо, придется переходить на DXE2...
  • DimaBr © (30.05.12 13:02) [16]
    Зарегистрируйте свой редактор
  • Rouse_ © (30.05.12 14:58) [17]
    Володь, вот ты сам же всех и запутал.
    Для начала нужно было тебе сказать что ХЕ у тебя кривая и что свойство ImageIndex не появляется не у твоего конкретного компонента, а во всех компонентах в которых оно изначально присутствует, т.е. даже у TMenuItem, в котором оно всегда было, данное свойство не отображается :)
    И только потом приводил бы код и все остальное :)
  • DimaBr © (30.05.12 15:21) [18]
    Розыч, а ты откуда знаешь ?
  • Rouse_ © (30.05.12 15:28) [19]
    А только что за его машиной сидел, разбирались с причиной, я тоже удивился - с чего такое поведение, а там походу банально дельфя кривая (ну точнее по уаленке к его домашнему компу подрубились - это у него дома воспроизводится). Причем интересная степень кривости у Дельфи, отключаешь один из стандартных пакетов и свойство ImageIndex волшебным образом появляется там где ему и положено быть :)
 
Конференция "Компоненты" » ImageIndex в TCollectionItem не показывается
Есть новые Нет новых   [118477   +39][b:0][p:0.003]