Метод IModelObject::AddParentModel (dbgmodel.h)

Метод AddParentModel добавляет новую родительскую модель в заданный объект . Такая модель может быть добавлена в конце цепочки поиска (аргумент переопределения указан как false) или в передней части цепочки поиска (аргумент переопределения указан как true). Кроме того, каждая родительская модель может при необходимости настроить контекст (семантический указатель) для любого свойства или концепции данного родительского объекта (или любого пользователя в его родительской иерархии). Корректировка контекста используется редко, но позволяет использовать некоторые мощные понятия, такие как внедрение объектов, создание пространств имен и т. д.

Если родительская модель имеет корректировку контекста, базовая модель данных будет выполнять эту настройку автоматически от имени вызывающего объекта. По сути, для экземпляра объекта с родительской моделью родительской модели, имеющей настройку контекста для newContext, вызов

instance->GetKeyValue("someKey", &pValue, nullptr);

в конечном итоге изменит контекст или указатель с экземпляра на newContext перед вызовом метода GetValue someKey, так как доступ к someKey передается через настройщик контекста.

Любой объект IModelObject , добавляемый в качестве родительской модели к другому объекту, должен по отдельности поддерживать концепцию IDataModelConcept . Неспособность реализовать эту концепцию может привести к сбою вызова метода AddParentModel.

Синтаксис

HRESULT AddParentModel(
  IModelObject *model,
  IModelObject *contextObject,
  bool         override
);

Параметры

model

Объект IModelObject, который будет добавлен в цепочку родительской модели заданного объекта. Этот объект IModelObject должен поддерживать концепцию IDataModelConcept .

contextObject

Если с моделью данных связана корректировка контекста, сюда можно передать скорректированный контекст (или метод доступа к свойству, возвращающий скорректированный контекст).

override

Указание того, размещается ли родительская модель, указанная аргументом модели, в передней или конечной части линейной цепочки родительских моделей. Значение false (обычно указанное) указывает конец цепочки. Значение true указывает на переднюю часть цепочки.

Возвращаемое значение

Этот метод возвращает HRESULT, указывающее на успех или сбой.

Комментарии

** Пример кода**



ComPtr<IDataModelManager> spManager; /* get the data model manager */
ComPtr<IModelObject> spObject;       /* get an object */

// A data model *MUST* implement IDataModelConcept.  Create an implementation of this and a string conversion.
class MyDataModel :
    public Microsoft::WRL::RuntimeClass<
        Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::RuntimeClassType::ClassicCom>,
        IDataModelConcept,
        IStringDisplayableConcept
        >
{
public:
 
    IFACEMETHOD(InitializeObject)(_In_ IModelObject * /*pModelObject*/, 
                                  _In_opt_ IDebugHostTypeSignature * /*pMatchingSignature*/,
                                  _In_opt_ IDebugHostSymbolEnumerator * /*pWildcardMatches*/)
    {
        return S_OK;
    }

    IFACEMETHOD(GetName)(_Out_ BSTR *pModelName)
    { 
        return E_NOTIMPL;
    }

    IFACEMETHOD(ToDisplayString)(_In_ IModelObject * /*pContextObject*/, 
                                 _In_opt_ IKeyStore * /*pMetadata */, 
                                 _Out_ BSTR *pDisplayString)
    {
        *pDisplayString = SysAllocString(L"Hello World");
        return *pDisplayString == nullptr ? E_OUTOFMEMORY : S_OK;
    }
};

// Create the data model, an object for it, set concepts, and add it as a parent to spObject.
ComPtr<MyDataModel> spDataModel = Microsoft::WRL::Make<MyDataModel>();
ComPtr<IModelObject> spDataModelObject;
if (spDataModel != nullptr &&
    SUCCEEDED(spManager->CreateDataModelObject(spDataModel.Get(), &spDataModelObject)) &&
    SUCCEEDED(spDataModelObject->SetConcept(__uuidof(IStringDisplayableConcept),
                                            static_cast<IStringDisplayableConcept *>
                                                (spDataModel.Get()), 
                                            nullptr)))
{
    if (SUCCEEDED(spObject->AddParentModel(spDataModelObject.Get(), nullptr, false)))
    {
        // spObject has been *EXTENDED* to have a display string.  It has a parent model 
        // which has that concept.  That extension (and whatever else was added 
        // on spDataModelObject) can be removed with a single RemoveParentModel call.
    }
}

Требования

Требование Значение
Заголовок dbgmodel.h

См. также раздел

Интерфейс IModelObject