type
TMeinPropertyTyp = TWinControl;
TMeinPropertyEditor =
class(TComponentProperty)
public
function GetAttributes: TPropertyAttributes;
override;
procedure GetValues(Proc: TGetStrProc);
override;
end;
TMeineKomponente =
Class(TWincontrol)
private
FKumpel : TMeinPropertyTyp;
published
property MeinKumpel :TMeinPropertyTyp
read FKumpel
write FKumpel;
end;
function LieferPropertyString(EinControl: TControl):
String;
// wird vom Editor aufgerufen
procedure Register;
implementation
function LieferPropertyString(EinControl: TControl):
String;
// wird vom Editor aufgerufen
begin
if Assigned(EinControl)
then Result := EinControl.
Name
else Result := '
';
end;
function TMeinPropertyEditor.GetAttributes: TPropertyAttributes;
begin
Result := [paMultiSelect, paValueList, paSortList, paRevertable];
end;
procedure TMeinPropertyEditor.GetValues(Proc: TGetStrProc);
var
i,j: Integer;
SchonDa : Boolean;
UnserParent : TWinControl;
WirSelbst : TComponent;
DerKonkurent : TComponent;
DerKandidat : TControl;
begin
WirSelbst :=
nil;
// wir gehen alle Componenten des
// Designers durch, bis wir uns selbst
// gefunden haben...
for i := 0
to Designer.Form.ComponentCount - 1
do begin
WirSelbst := Designer.Form.Components[i];
if (WirSelbst
is TMeineKomponente)
and
((WirSelbst
as TComponent)=GetComponent(0))
then break;
// wir haben uns selbst gefunden
end;
// nun suchen wir nach möglichen Kumpels für uns,
// aber nur wenn sie das selbe Parent haben (z.B.
// WirSelbst liegen auf einem Panel und wollen nur
// Komponenten als Kumpel zulassen, die auch auf diesem
// Panel liegen...
UnserParent := (WirSelbst
as TMeineKomponente).Parent;
for i := 0
to UnserParent.ControlCount-1
do begin
DasControl := UnserParent.Controls[i];
if (DasControl
is TWincontrol)
and not
((DasControl
is TMeinPropertyEditor)
or // keine Inzucht!
(DasControl
is TButton))
// Buttons sollen es auch nicht seein!
then begin
// Nun checken wir, ob unser potentieller Kumpel schon einen anderen
// Freund unserer Art hat - wenn ja, dann fliegt er aus der Auswahl...
SchonDa := False;
for j := 0
to Designer.Form.ComponentCount-1
do begin
DerKonkurent := Designer.Form.Components[j];
if (DerKonkurent
is TMeineKomponente)
then begin
if ((DerKonkurent
as TMeineKomponente).MeinKumpel = (DerKandidat
as TWincontrol))
then begin
SchonDa := True;
end;
end;
end;
// wenn der Kandidat noch keinen Freund unserer Art hat,
// dann kommt er in die Liste des Objectinspetors:
if not SchonDa
then Proc(LieferPropertyString(DasControl));
end;
end;
Proc(LieferPropertyString(
nil));
// bin gerade nicht sicher, ob das nötig ist
end;
// nun noch den PropertyEditor bei der IDE anmelden:
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TMeinPropertyTyp),
TMeineKomponente,
//sagt IDE, für welche Komponentenklasse
//der Editor zu verwenden ist
'
MeinKumpel',
// sagt IDE wie das Property dort heisst
TMeinPropertyTyp);
end;