Привет, форумчане! Помогите, пожалуйста. Проблема вот в чем. Есть компонент, который содержит субкомпоненты 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.
Что еще нужно дописать, чтобы работало? Где я не прав? В литературе ничего подобного не нашел.