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
FPar: TComPar;
FDesigner: IDesigner;
procedure
AddSubcomponentClass(
const
ACaption:
String
; ATag:
Integer
);
procedure
EnumerateSubcomponentClasses;
function
MakeSubcomponent(AOwner: TComponent; ATag:
Integer
): TComponent;
procedure
Refreshlist;
public
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
;
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;
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
.