У меня возникла следующая проблема:
У меня есть класс, который был сгенерирован из файла xsd с помощью мастера привязки данных XML Delphi 7 (New -> Other -> XML Databindng).
Мне нужно найти способ добавить методы в сгенерированный код:
IXMLGlobeSettingsType = interface(IXMLNode)
['{9A8F5C55-F593-4C70-85D2-68FB97ABA467}']
{ Property Accessors }
function Get_General: IXMLGeneralSettingsType;
function Get_Projector: IXMLProjectorSettingsType;
function Get_LineMode: IXMLLineDrawingSettingsType;
{ Methods & Properties }
property General: IXMLGeneralSettingsType read Get_General;
property Projector: IXMLProjectorSettingsType read Get_Projector;
property LineMode: IXMLLineDrawingSettingsType read Get_LineMode;
//procedure SetDefault; {To be added}
end;
Интерфейс реализован соответствующим классом, который также генерируется мастером:
TXMLGlobeSettingsType = class(TXMLNode, IXMLGlobeSettingsType)
protected
{ IXMLGlobeSettingsType }
function Get_General: IXMLGeneralSettingsType;
function Get_Projector: IXMLProjectorSettingsType;
function Get_LineMode: IXMLLineDrawingSettingsType;
public
procedure AfterConstruction; override;
end;
И чтобы определить мои собственные расширения для сгенерированного кода, я определил следующий интерфейс:
IDefaultable = interface
procedure SetDefault;
end;
Со следующим классом реализации:
DefaultableXMLGlobeSettingsType = class(TXMLGlobeSettingsType, IDefaultable)
public
procedure SetDefault;
end;
Однако я только что понял, что Delphi 7 не позволяет мне преобразовывать один интерфейс в другой (или даже из интерфейса в объект). Таким образом, следующий код вызовет ошибку:
defaultSettings : IDefaultable;
FGlobeSettingsIntf: IXMLGlobeSettingsType; // FGlobeSettingsIntf is in fact a DefaultableXMLGlobeSettingsType
// some code
defaultSettings := FGlobeSettingsIntf as IDefaultable; // error: operator not applicable to this operand type
Я в значительной степени застрял здесь. Как можно обойти эту ошибку? Есть ли способ (даже уродливый) в Delphi 7 привести интерфейс к объекту, а затем обратно к другому интерфейсу.
as
приведет к вызову QI с передачей идентификатора GUID, связанного с интерфейсом. Фактически, единственный способ устранить ошибку, не изменяя код, использующийas
, - это добавить GUID в интерфейс. 22.07.2017