Конференция "Компоненты" » 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 волшебным образом появляется там где ему и положено быть :)
  • DimaBr © (30.05.12 15:55) [20]
    Понятно, я наблюдал на RAD 2009 кривую работу стандартной функции Val, тоже удивлялся
    http://www.sql.ru/forum/actualthread.aspx?bid=20&tid=931379
  • Rouse_ © (30.05.12 16:55) [21]

    > DimaBr ©   (30.05.12 15:55) [20]
    >
    > Понятно, я наблюдал на RAD 2009 кривую работу стандартной
    > функции Val, тоже удивлялся

    Ну у них периодически косяки всплывают.
    В 2010-ой например, сейчас не работает CharInSet с русскими буквами, как пример:

    var
     С: Char;
    begin
     С := 'я';
     if not CharInSet(С, ['а'..'я']) then
       ShowMessage('FAILED!!!');



    ибо реализация у него:
    function CharInSet(C: WideChar; const CharSet: TSysCharSet): Boolean;
    begin
     Result := (C < #$0100) and (AnsiChar(C) in CharSet);
    end;

    передаваемая буква "я" равна #$44F и фэйл происходит на первом сравнении,
    а второе сравнение фейлит на приведении к AnsiChar-у, возвращая вместо ансишной "я" (с кодом 255) ансишное "O" (с кодом 79)
  • Cobalt © (01.06.12 13:11) [22]
    Ну, это методологический косяк.
    Странно то, что они не отметили эту функцию как obsolete, для ясности.
  • Rouse_ © (01.06.12 14:19) [23]

    > Cobalt ©   (01.06.12 13:11) [22]
    >
    > Ну, это методологический косяк.
    > Странно то, что они не отметили эту функцию как obsolete,
    >  для ясности.

    Что за методологический? Ты иногда так выражаешся, что я категорически не понимаю об чем спичь :)
    Что за метода и почему они должны отметить данную функцию как obsolete с учетом того что она только в 2010-ой дельфе была введена, как замена старому
    if C in [setdata] then.


    Об чем собственно компилер при сборке и предупреждает:
    [DCC Warning] Project1.dpr(63): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.


    Получается, что они должны были выпустить уже устаревшую, на момент ее появления, функцию? :))))
  • Cobalt © (01.06.12 15:01) [24]
    не шибко мудро сравнивать 2байт-символ с 1байт-символ
  • Rouse_ © (02.06.12 10:50) [25]

    > Cobalt ©   (01.06.12 15:01) [24]
    > не шибко мудро сравнивать 2байт-символ с 1байт-символ

    Советую это объяснить напрямую разработчикам данной функции :)
  • Cobalt © (02.06.12 22:35) [26]
    И вдобавок разработчикам-пользователям этой функции :)
  • Rouse_ © (02.06.12 23:22) [27]
    Вовч, опять не понял...
    Грамотные пользователи воспользуются оператором case, ну или на крайняк перепишут столь поразившее тебя двухбайтовое сравнение через приведение на AnsiString[Char]
 
Конференция "Компоненты" » ImageIndex в TCollectionItem не показывается
Есть новые Нет новых   [118665   +33][b:0][p:0.003]