-
сделал контрол с коллекцией 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 волшебным образом появляется там где ему и положено быть :)
|