-
сделал контрол с коллекцией 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. Что это за карма такая? Поле-которое-нельзя-называть?
-
-
RegisterPropertyEditor(TypeInfo(Integer), TEvent, 'ImageIndex', TIntegerProperty); вроде так должно быть? P.S. Delphi XE P.P.S. Отключил пакет со стандартными компонентами - Et voila! - ImageIndex стал виден в списке свойств. Надо будет написать баг в QC...
-
Пропробуйте наследоваться от TOwnedCollection
-
Попробуйте объявить свойство ImageIndex типом не Integer, а TImageIndex
-
Уточню - у меня нет задачи показывать в ImageIndex картинку. Мне вполне достаточно установить его в дизайнере как целое число. Например, как в TreeView редактируешь элемент - ImageIndex, StateIndex и т.п.
Но в редакторе свойство банально не отображается.
-
Тогда скорее всего наследование от TOwned Collection вам поможет
-
сделал тест: http://files.mail.ru/ET9Q1VНа Д2007 и Д2010 свойство ImageIndex показывается на ДXE - свойство ImageIndex не показывается, пока не отключу пакет dclstd150.bpl
-
Проверено на DXE2, все работает. Для правильного функционирования редактора коллекции нужно переопределить function GetOwner: TPersistent; override; или же наследоваться от TOwnerCollection, в котором он уже переопределен
TOwnedCollection = class(TCollection)
private
FOwner: TPersistent;
protected
function GetOwner: TPersistent; override;
public
constructor Create(AOwner: TPersistent; ItemClass: TCollectionItemClass);
end;
-
Я решительно не понимаю, к чему этот код? редактор коллекции прекрасно работает, элементы коллекции прекрасно сохраняются в 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;
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited;
FEvents := TOwnedCollection.Create(Self, TEvent);
end;
destructor TMyComponent.Destroy;
begin
FreeAndNil(FEvents);
inherited;
end;
procedure TMyComponent.SetEvents(const Value: TCollection);
begin
FEvents.Assign(Value);
end;
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 все-равно не показывается.
-
Я привёл вам код самой Delphi, в котором и написана эта фраза
Почему свойство не отображается в коллекции - не знаю, но предполагаю что, неправильно работает редактор коллекции из=за того что не переопределён GetOwner
-
Тут кто-то определенно тупит - или я, или ты. Зачем переопределять Owner? расскажи на пальцах, как ты сталкивался с такой особенностью, что свойство не показывалось из-за Ownder'а?
-
Вы читать умеете то что написано в исходниках Delphi ????
-
Да ты не переживай, я умею читать, и буквы, и слова. Разница использования TCollection и TOwnedCollection только (насколько я смог наблюдать) в отображении "полного пути, отображаемого в ObjectInspector" (соответственно): "TCollection[0]" и "MyComponent1.Evets[0]"
Это, несомненно, очень познавательно и наглядно, спасибо что обратил на этот момент внимание - когда я буду делать компоненты с коллекциями, буду использовать TOwnedCollection.
Но, судя взволнованному тону, ты, видимо, имел в виду другой аспект? Какой-же? не томи!
-
Вы не находите что пришли сюда за помощью, а начинаете хамить и тыкать ?
Повторяю, что DXE2 - ошибки нет, какой редактор прячет ваше свойство я не знаю, может ваш собственный или постороннего компонента. Попробуйте поотключать посторонние пакеты, а не сразу dclstd150
-
Видимо, придется переходить на DXE2...
-
Зарегистрируйте свой редактор
-
Володь, вот ты сам же всех и запутал. Для начала нужно было тебе сказать что ХЕ у тебя кривая и что свойство ImageIndex не появляется не у твоего конкретного компонента, а во всех компонентах в которых оно изначально присутствует, т.е. даже у TMenuItem, в котором оно всегда было, данное свойство не отображается :) И только потом приводил бы код и все остальное :)
-
Розыч, а ты откуда знаешь ?
-
А только что за его машиной сидел, разбирались с причиной, я тоже удивился - с чего такое поведение, а там походу банально дельфя кривая (ну точнее по уаленке к его домашнему компу подрубились - это у него дома воспроизводится). Причем интересная степень кривости у Дельфи, отключаешь один из стандартных пакетов и свойство ImageIndex волшебным образом появляется там где ему и положено быть :)
-
-
> 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)
-
Ну, это методологический косяк. Странно то, что они не отметили эту функцию как obsolete, для ясности.
-
> 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. Получается, что они должны были выпустить уже устаревшую, на момент ее появления, функцию? :))))
-
не шибко мудро сравнивать 2байт-символ с 1байт-символ
-
> Cobalt © (01.06.12 15:01) [24] > не шибко мудро сравнивать 2байт-символ с 1байт-символ
Советую это объяснить напрямую разработчикам данной функции :)
-
И вдобавок разработчикам-пользователям этой функции :)
-
Вовч, опять не понял... Грамотные пользователи воспользуются оператором case, ну или на крайняк перепишут столь поразившее тебя двухбайтовое сравнение через приведение на AnsiString[Char]
|