So fügt Delphi Eigenschaften hinzu
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.