So fügt Delphi Eigenschaften hinzu

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu ActiveX-Steuerelemente verwenden - Index

Die ActiveX-Wrapper-Klasse implementiert Eigenschaften in ihrer Schnittstelle über die Zugriffsmethoden Read und Write. Dies bedeutet, dass die Wrapper-Klasse über COM-Eigenschaften verfügt, die auf einer Schnittstelle als Getter- und/oder Setter-Methoden erscheinen. Im Gegensatz zu VCL-Eigenschaften ist auf der Schnittstelle für COM-Eigenschaften keine "Property"-Deklaration sichtbar. Vielmehr erscheinen Methoden, die als Eigenschaftszugriffsmethoden gekennzeichnet sind. Wenn Sie der Standardschnittstelle des ActiveX-Steuerelements eine Eigenschaft hinzufügen, erhält die Wrapper-Klasse (die in der _TLB-Unit erscheint, die vom Typbibliothekseditor aktualisiert wird) ein oder zwei neue Methoden (einen Getter und/oder Setter), die Sie implementieren müssen. Dies entspricht dem Hinzufügen einer Methode zur Schnittstelle, bei dem eine Wrapper-Klasse eine entsprechende Methode erhält, die Sie implementieren müssen. Aus diesem Grund ist das Hinzufügen von Eigenschaften zur Schnittstelle der Wrapper-Klasse im Wesentlichen dasselbe wie das Hinzufügen von Methoden: Die Definition der Wrapper-Klasse erhält neue Strukturen von Methodenimplementierungen, die Sie ausfüllen müssen.

Anmerkung:  Einzelheiten darüber, was in der generierten _TLB-Unit erscheint, finden Sie unter Quelltext, der beim Importieren von Typbibliotheksinformationen generiert wird.

Nehmen Sie zum Beispiel eine Caption-Eigenschaft vom Typ TCaption im zugrunde liegenden VCL-Objekt. Um diese Eigenschaft der Schnittstelle des Objekts hinzuzufügen, geben Sie den folgenden Quelltext ein, wenn Sie eine Eigenschaft der Schnittstelle über den Typbibliothekseditor hinzufügen.



 property Caption : TCaption read Get_Caption write Set_Caption;



Delphi fügt die folgenden Deklarationen der Wrapper-Klasse hinzu:



 function Get_Caption: WideString; safecall;
 procedure Set_Caption(const Value: WideString); safecall;



 STDMETHOD(get_Caption(BSTR* Value));
 STDMETHOD(set_Caption(BSTR Value));



Darüber hinaus werden neue Strukturen von Methodenimplementierungen hinzugefügt, die Sie ausfüllen müssen:



 function TButtonX.Get_Caption: WideString;
 begin
 end;
 procedure TButtonX.Set_Caption(Value: WideString);
 begin
 end;



 STDMETHODIMP TButtonXImpl::get_Caption(BSTR* Value)
 {
   try
   {
   }
   catch(Exception &e)
   {
     return Error(e.Message.c_str(), IID_IButtonX);
   }
   return S_OK;
 };
 STDMETHODIMP TButtonXImpl::set_Caption(BSTR Value)
 {
   try
   {
   }
   catch(Exception &e)
   {
     return Error(e.Message.c_str(), IID_IButtonX);
   }
   return S_OK;
 };



In der Regel können Sie diese Methode durch einfaches Delegieren an das entsprechende VCL-Steuerelement delegieren, auf das über das Element FDelphiControl der Wrapper-Klasse zugegriffen werden kann.



 function TButtonX.Get_Caption: WideString;
 begin
    Result := WideString(FDelphiControl.Caption);
 end;
 
 procedure TButtonX.Set_Caption(const Value: WideString);
 begin
    FDelphiControl.Caption := TCaption(Value);
 end;



 STDMETHODIMP TButtonXImpl::get_Caption(BSTR* Value)
 {
 try
 {
 *Value = WideString(m_VclCtl->Caption).Copy();
 }
 catch(Exception &e)
 {
 return Error(e.Message.c_str(), IID_IButtonX);
 }
 return S_OK;
 };
 STDMETHODIMP TButtonXImpl::set_Caption(BSTR Value)
 {
   try
   {
     m_VclCtl->Caption = AnsiString(Value);
   }
   catch(Exception &e)
   {
     return Error(e.Message.c_str(), IID_IButtonX);
   }
   return S_OK;
 };



In einigen Fällen müssen Sie Quelltext hinzufügen, um die COM-Datentypen in native Object Delphi-Typen zu konvertieren. Bei dem vorausgehenden Beispiel ist dies ohne Typklassenerstellung möglich.

Anmerkung:  Weil die Automatisierungsschnittstellenmethoden als safecall deklariert sind, müssen Sie keinen COM-Exception-Code für diese Methoden implementieren — der Delphi-Compiler generiert dafür Code um den Rumpf der safecall-Methoden herum, um Delphi-Exceptions abzufangen und sie in COM-Fehlerinfo-Strukturen und Rückgabe-Codes zu konvertieren.

Siehe auch