Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.10.2012, 12:26
Strangermx Strangermx вне форума
Прохожий
 
Регистрация: 17.10.2012
Сообщения: 1
Репутация: 10
По умолчанию Не отображается редактор TCollection

Доброго времени. Не могу понять что не так.

Код:
unit UDocOper;

interface

uses
 messages,dialogs,SysUtils, adodb,db, windows, forms,Classes, Controls, cxControls, cxPC;

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

// ---------------   тип операции документа (новый, редактирование) -----------
Type
 TTypeOperation=class (TPersistent)
 private
   FProcedureName:String;
   FParametrs:TCollection;
   Procedure SetParametrs(const Value: TCollection);
 public
    destructor Destroy; override;
    constructor Create(AOwner: TComponent);
 published
   property ProcedureName:string read FProcedureName write FProcedureName;
   property Parametrs:TCollection read FParametrs write FParametrs;

end;

//---------------------  форма документа ---------------------------------------
type
 TDocumentOperation = class(TComponent)
 private
   FopInsert:TTypeOperation;
   Procedure Setpoperation(value:TTypeOperation);
 protected
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property opInsert:TTypeOperation read FopInsert write Setpoperation;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('CxDataControls', [TDocumentOperation]);
end;

{ TTypeOperations }

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

////////////////////////////////////////////////////////////////////////////////
constructor TTypeOperation.Create(AOwner: TComponent);
begin
  FParametrs:=TOwnedCollection.Create(Self, TopParametr);

end;

destructor TTypeOperation.Destroy;
begin
 inherited;
  FreeAndNil(FParametrs);
end;

procedure TTypeOperation.SetParametrs(const Value: TCollection);
begin
FParametrs.Assign(Value);
end;

{ TDocumentOperations }

constructor TDocumentOperation.Create(AOwner: TComponent);
begin
 inherited;
  FopInsert:=TTypeOperation.Create(self);
end;

destructor TDocumentOperation.Destroy;
begin
 inherited;
 FreeAndNil(FopInsert);
end;

procedure TDocumentOperation.Setpoperation(value: TTypeOperation);
begin
 FopInsert:=value;
end;

end.

В итоге при инсталляции компонента у свойства Parametrs не отображается редактор
Ответить с цитированием
  #2  
Старый 18.10.2012, 06:19
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Strangermx
Доброго времени. Не могу понять что не так.

Код:
.....
// ---------------   тип операции документа (новый, редактирование) -----------
Type
 TTypeOperation=class (TPersistent)
 private
   FProcedureName:String;
   FParametrs:TCollection;
   Procedure SetParametrs(const Value: TCollection);
 public
    destructor Destroy; override;
    constructor Create(AOwner: TComponent);
 published
   property ProcedureName:string read FProcedureName write FProcedureName;
   property Parametrs:TCollection read FParametrs write FParametrs;

end;
.....

В итоге при инсталляции компонента у свойства Parametrs не отображается редактор
Дело скорее всего в том, что стандартный TCollectionEditor умеет работать со свойствами-коллекциями у компонентов (т.е. с классом TComponent и его потомками), а у тебя класс TTypeOperation содержащий свойство-коллекцию наследуется от TPersistent.

p.s. Можешь поизучать как работает редактор коллекций (TCollectionEditor). Его исходники находятся в "\Source\Property Editors\ColnEdit.pas"
Ответить с цитированием
  #3  
Старый 18.10.2012, 09:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
unit Unit2;

interface

uses
  Classes;

type
  TMyCollectionItem = class(TCollectionItem)
  private
    FId: Integer;
    FName: String;
  public
    constructor Create(Collection: TCollection); override;
  published
    property Id: Integer read FId write FId;
    property Name: String read FName write FName;
  end;

  TMyComponent = class(TComponent)
  private
    FMyCollection: TOwnedCollection; 
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property MyCollection: TOwnedCollection read FMyCollection write FMyCollection;
  end;

procedure Register;

implementation

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

{ TMyCollectionItem }

constructor TMyCollectionItem.Create(Collection: TCollection);
begin
  inherited Create(Collection);
  FId:=0;
  FName:='';
end;

{ TMyComponent }

constructor TMyComponent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FMyCollection:=TOwnedCollection.Create(Self, TMyCollectionItem);
end;

destructor TMyComponent.Destroy;
begin
  FMyCollection.Free;
  inherited Destroy;
end;

end.

но лучше так не делать - не удобно работать с такой коллекцией.

правильней создать свой класс коллекцию, унаследовавшись от TOwnedCollection или TCollection (реализовав GetOwner). задать свой тип у Items, Add, Insert и т.д.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 18.10.2012, 09:31
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от NumLock
Код:
.....
  TMyComponent = class(TComponent)
  private
    FMyCollection: TOwnedCollection; 
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property MyCollection: TOwnedCollection read FMyCollection write FMyCollection;
  end;
.....
Так конечно будет работать так как свойство-коллекция MyCollection находится непосредственно у компонента.
ТС нужна более хитрая конструкция: когда у компонента имеется объектное свойство и уже у этого объектного свойства есть свойство-коллекция.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter