Поделиться через


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

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

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

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

в конечном итоге измените контекст /этот указатель с экземпляра на newContext перед вызовом метода GetValue некоторыхKey, так как доступ к 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