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

Delphi Sources



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

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.05.2011, 20:45
nicht nicht вне форума
Прохожий
 
Регистрация: 18.05.2011
Сообщения: 17
Репутация: 12
По умолчанию Проблема с Редактором Компонентов

Привет, форумчане! Помогите, пожалуйста. Проблема вот в чем. Есть компонент, который содержит субкомпоненты TParChild, к нему прикрутил TComParEditor = class(TComponentEditor). При создании субкомпонент в design-time с помощью TComParEditor все нормально. Только в run-time все созданные ранее субкомпоненты не создаются. Ниже представляю код:

Код:
Unit ComPar;
...
*******************************
TParChild = class(TComponent)
...
***********************************
TParChildClass = class of TParChild;

TChildList = class(Tlist)
...

*****************************
TComPar = class(TCustomPanel)
FChildList: TChildList;
...
property ChildList: TChildList read FChildList;
...

var
   ParClassRegister: TStringList;
...

initialization
  ParClassRegister:= TStringList.Create;

finalization
  ParClassRegister.Free;

end.
**********************************
**********************************

unit ComParEditor;

...

type

  TComParEditor = class (TComponentEditor)
  public
    procedure Edit; override;
  end;

  TParEditorForm = class(TForm)
    ToolBar1: TToolBar;
    tbAdd: TToolButton;
    tbDel: TToolButton;
    tbUp: TToolButton;
    tbDown: TToolButton;
    ParBox: TListBox;
    MAddItem: TPopupMenu;
    procedure FormCreate(Sender: TObject);

    procedure miAddClick(Sender: TObject);
    procedure tbDelClick(Sender: TObject);
    procedure ParBoxClick(Sender: TObject);
  private
    { Private declarations }
    FPar: TComPar;
    FDesigner: IDesigner;
    procedure AddSubcomponentClass(const ACaption: String; ATag: Integer);
    procedure EnumerateSubcomponentClasses;
    function MakeSubcomponent(AOwner: TComponent; ATag: Integer): TComponent;
    procedure Refreshlist;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent; APar: TComPar; ADesigner: IDesigner); reintroduce;
  end;

procedure Register;

var
  ParEditorForm: TParEditorForm;

implementation

{$R *.dfm}

procedure Register;
begin
  RegisterComponentEditor(TComPar, TComParEditor);
end;  

{ TComParEditor }

procedure TComParEditor.Edit;
begin
  ParEditorForm:= TParEditorForm.Create(Application, (GetComponent as TComPar), GetDesigner);
  try
    ParEditorForm.ShowModal;
  finally
    ParEditorForm.Free;
  end;
  Designer.Modified;
end;

procedure TParEditorForm.AddSubcomponentClass(const ACaption: String; ATag: Integer);
var
  mi: TMenuItem;
begin
  if ACaption = '' then exit; // Empty names denote deprecated components.
  mi := TMenuItem.Create(Self);
  mi.OnClick := miAddClick;
  mi.Caption := ACaption;
  mi.Tag := ATag;
  MAddItem.Items.Add(mi);
end;

constructor TParEditorForm.Create(AOwner: TComponent; APar: TComPar; ADesigner: IDesigner);
begin
  inherited Create(AOwner);
  FPar:= APar;
  FDesigner:= ADesigner;
  EnumerateSubcomponentClasses;
  Refreshlist;
end;

procedure TParEditorForm.EnumerateSubcomponentClasses;
var
  i: Integer;
begin
 for i := 0 to SeriesClassRegister.Count - 1 do
   AddSubcomponentClass(SeriesClassRegister[i], i);
end;

procedure TGSeriesEditorForm.FormCreate(Sender: TObject);
begin
  Caption:= FPar.Name + ' editor';
end;

function TParEditorForm.MakeSubcomponent(AOwner: TComponent;
  ATag: Integer): TComponent;
begin
  Result:= TParChildClass(ChildClassRegister.Objects[ATag]).Create(AOwner);
end;

procedure TParEditorForm.miAddClick(Sender: TObject);
var
  s: TComponent;
  n: String;
begin
  s:= MakeSubcomponent(FPar.Owner, (Sender as TMenuItem).Tag);
  try
    n:= Copy(s.ClassName, 2, Length(s.ClassName) - 1);
    s.Name:= FDesigner.UniqueName(n);
    FPar.AddChild(s as TParChild);
    ParBox.AddItem(s.Name, s);
    FDesigner.Modified;
    Refreshlist;
  except
    s.Free;
    raise;
  end;
end;

procedure TParEditorForm.Refreshlist;
var
  ci: TStrings;
  i: Integer;
begin
  ci:= ParBox.Items;
  try
    ci.BeginUpdate;
    ci.Clear;
    with FPar.ChildList do
      for i:= 0 to Count - 1 do
        ci.AddObject(TComponent(Items[i]).Name, TObject(Items[i]));
  finally
    ci.EndUpdate;
  end;
end;

procedure TParEditorForm.tbDelClick(Sender: TObject);
var
  i: Integer;
  s: TComponent;
begin
  if ParBox.SelCount = 0 then exit;
  for i := ParBox.Items.Count - 1 downto 0 do
    if ParBox.Selected[i] then
    begin
      s:= TComponent(ParBox.Items.Objects[i]);
      ParBox.Items.Delete(i);
      s.Free;
    end;
  FDesigner.Modified;
  Refreshlist;
end;

procedure TParEditorForm.ParBoxClick(Sender: TObject);
begin
  FDesigner.SelectComponent((ParBox.Items.Objects[ParBox.ItemIndex]) as TPersistent);
end;

end.

Что еще нужно дописать, чтобы работало? Где я не прав? В литературе ничего подобного не нашел.
Ответить с цитированием
 


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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