COM-коллекции
От: vitaly_spb Россия  
Дата: 25.05.03 21:10
Оценка:
Подскажите пожалуйста: переделывал стандартный пример из Трельсена, ввел поле ID. Хотелось бы чтобы элемент коллекции удалялся не с определенными номером, а шел поиск по ID и элемент с нужным ID удалялся. Вот листинг самой функции удаления. Как мне сделать цикл по всем элементам? (я ввел для элемента функцию get_obj, котора одним из параметров выдает этот ID).

STDMETHODIMP CSquiggleCollection2::Remove(long index)
{
// Be sure we are in range.
if(index >=0 && index <= m_vecSquiggles.size())
{
// Find the correct squiggle.
IDispatch* pDisp = m_vecSquiggles[index];

// Remove it.
pDisp->Release();
m_vecSquiggles.erase(m_vecSquiggles.begin() + index);
return S_OK;
}
return E_FAIL;
}
...Ei incumbit probatio, qui dicit, non qui negat...
Re: COM-коллекции
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 26.05.03 04:52
Оценка:
Здравствуйте, vitaly_spb, Вы писали:

_>Подскажите пожалуйста: переделывал стандартный пример из Трельсена, ввел поле ID. Хотелось бы чтобы элемент коллекции удалялся не с определенными номером, а шел поиск по ID и элемент с нужным ID удалялся. Вот листинг самой функции удаления. Как мне сделать цикл по всем элементам? (я ввел для элемента функцию get_obj, котора одним из параметров выдает этот ID).


В качестве элемента вектора заводишь структуру
struct _item
{
   IDispatch* pDisp;
   long lId;
};


Удаление:
STDMETHODIMP CSquiggleCollection2::Remove(long lId)
{
    // Be sure we are in range.
    for(int i = 0; i < m_vecSquiggles.size();i++)
    {
        // Find the correct squiggle.
        if (m_vecSquiggles[i].lId == lId){
            IDispatch* pDisp = m_vecSquiggles[i];
            pDisp->Release();
            m_vecSquiggles.erase(m_vecSquiggles.begin() + i);
            return S_OK;
        }
    }
    return E_FAIL;
}


Это нужно еще Advise немного переделать.
А вообще, такие вещи на map'е делать — самое то!
Re[2]: COM-коллекции
От: vitaly_spb Россия  
Дата: 26.05.03 09:02
Оценка:
AS>В качестве элемента вектора заводишь структуру
AS>
AS>struct _item
AS>{
AS>   IDispatch* pDisp;
AS>   long lId;
AS>};
AS>


AS>Удаление:

AS>
AS>STDMETHODIMP CSquiggleCollection2::Remove(long lId)
AS>{
AS>    // Be sure we are in range.
AS>    for(int i = 0; i < m_vecSquiggles.size();i++)
AS>    {
AS>        // Find the correct squiggle.
AS>        if (m_vecSquiggles[i].lId == lId){
AS>            IDispatch* pDisp = m_vecSquiggles[i];
AS>            pDisp->Release();
AS>            m_vecSquiggles.erase(m_vecSquiggles.begin() + i);
AS>            return S_OK;
AS>        }
AS>    }
AS>    return E_FAIL;
AS>}
AS>

Честно говоря, мне не очень понятно: как lId согласовывается с моим ID у элемента?

AS>Это нужно еще Advise немного переделать.

А это что значит?

AS>А вообще, такие вещи на map'е делать — самое то!

С радостью, может подскажешь как сделать это же с помощью map?
...Ei incumbit probatio, qui dicit, non qui negat...
Re[3]: COM-коллекции
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 26.05.03 09:30
Оценка:
Здравствуйте, vitaly_spb, Вы писали:

[]

AS>>Это нужно еще Advise немного переделать.

_>А это что значит?

Это значит, что я загнался.
Имелось в виду Add — добавление объекта.

AS>>А вообще, такие вещи на map'е делать — самое то!

_>С радостью, может подскажешь как сделать это же с помощью map?

std::map<long,LPDISPATCH> m_map;

HRESULT Add(LPDISPATCH pDisp,long lId)
{
m_map[lId] = pDisp;
pDisp->AddRef();
}

HRESULT Remove(long lId)
{
  std::map<long,LPDISPATCH>::iterator ItemInMap = m_map.find(lId);
  if (ItemInMap != m_map.end()){
     ItemInMap->second->Release();
     m_map.erase(ItemInMap);
  }
}

HRESULT RemoveByNum(long idx)
{
std::map<long,LPDISPATCH>::iterator ItemInMap = m_map.begin();
std::advance(ItemInMap,idx);
ItemInMap->second->Release();
m_map.erase(ItemInMap);
}

HRESULT RemoveByRef(LPDISPATCH pDisp)
{
//тут перечислением находишь элемент и убиваешь его как в примерах выше.
}


Обработка ошибок опущена, пример писал "на коленках".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.