Einzelnen Beitrag anzeigen

Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#18

Re: Unterproperty in Objektinstpektor

  Alt 3. Sep 2003, 12:48
Also zur Vollständigkeit auch noch ein einfacher Propertyeditor, der zeigt, wie man zur Entwurfszeit in der IDE die Auswahl von möglichen Werten für ein Property einschränkt (Code so nicht funktional - fehlt z.b.Create/Destroy von TMeineKomponente etc) aber sollte das Prinzip veranschaulichen:

Delphi-Quellcode:
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;
voila - Nun könnte man eine Komponente TMeineKomponente bauen, die zur entwurfszeit auf ein Panel "geworfen", im Objektinspektor im Property "MeinKumpel" nur all die Controls zur auswahl anbietet, die:
1. Kein TButton sind (willkürlich gewähltes Beispiel ohne Sinn)
2. Nicht vom Typ TMeineKomponente sind, und
3. noch keinen Freund vom Typ TMeineKomponente haben, bei dem sie als "MeinKumpel" aufgeführt sind.

hoffe, das hilft ein wenig weiter, bei der Entwicklung von eigenen saugeilen Komponenten
Tim Leuschner
  Mit Zitat antworten Zitat