OÜet°enφ udßlostφ (ActiveX)

Mß-li u₧ivatelskß aplikace reagovat na n∞kterou udßlost, je t°eba vytvo°it obslu₧nou rutinu a napojit ji na p°φsluÜnou udßlost. V Microsoft Visual Basicu nebo Borland Delphi se o napojenφ postarß automaticky v²vojovΘ prost°edφ. Pro zvolen² objekt nabφdne seznam udßlostφ, kterΘ jsou k dispozici a po tΘ, co si v²vojß° n∞jakou vybere, vygeneruje v²vojovΘ prost°edφ rßmec obslu₧nΘ rutiny, do kterΘho staΦφ doplnit pouze vlastnφ p°φkazy. V HTML se obslu₧nß rutina napojφ na udßlost pomocφ parametru FOR a EVENT v prvku <SCRIPT>. Nap°φklad oÜet°enφ udßlosti OnNextRecord (v²pis Φφsla zßznamu (internφho i externφho) na status bar browseru) m∙₧e v JavaScriptu vypadat nap°φklad takto:

<OBJECT
CLASSID="clsid:32F34910-9288-101B-96B8-04021C007002"
ALIGN=CENTER WIDTH=275 HEIGHT=156 BORDER=1 HSPACE=5
ID=Formular>

<SCRIPT FOR=Formular EVENT="OnNextRecord(iRec, eRec, Subf)" LANGUAGE="JavaScript">
  window.status = iRec.toString(10) + "/" + eRec.toString(10);
</SCRIPT>

Ve VBScriptu lze vedle tΘto pou₧φt takΘ syntaxi:

<SCRIPT LANGUAGE="VBScript">
  Sub Formular_OnNextRecord(iRec, eRec, Subf)
    window.Status  = Cstr(iRec) + "/" + Cstr(eRec)
  end sub
</SCRIPT>

V C++ je t°eba obslu₧nΘ rutiny udßlostφ ôzabalitö do rozhranφ IDispatch. V inicializaΦnφ Φßsti aplikace se po aktivaci komponenty najde pomocφ metody IconnectionPointContainer::FindConnectionPoint jejφ styΦn² bod a tomu se p°edß ukazatel na rozhranφ IDispatch. Udßlosti komponenty 602SQL PohledX majφ ID rovno {32F34913-9288-101B-96B8-04021C007002}. Inicializace obsluhy udßlostφ m∙₧e vypadat nap°. takto:

DEFINE_GUID(WBFORM_EVENT_ID, 0x32F34913L, 0x9288, 0x101B, 0x96,
            0xB8, 0x04, 0x02, 0x1C, 0x00, 0x70, 0x02);

void CWBFormItem :: InitEventHandler()
{
    LPCONNECTIONPOINTCONTAINER lpConPtCont = NULL;

    if (m_lpObject->QueryInterface(IID_IConnectionPointContainer,
        (LPVOID *)&lpConPtCont) != NOERROR)
        return;
    if (lpConPtCont->FindConnectionPoint(WBFORM_EVENT_ID,
        &m_EVConPt) == NOERROR)
        m_EVConPt->Advise((LPDISPATCH)this, &m_EVCookie);
    if (lpConPtCont)
        lpConPtCont->Release();
}

Komponenta pak vyvolßvß jednotlivΘ udßlosti prost°ednictvφm metody IDispatch::Invoke.

STDMETHODIMP CWBFormItem :: Invoke(DISPID dispid, REFIID riid,
    LCID lcid, WORD Flags, DISPPARAMS *Params, VARIANT *pRes,
    EXCEPINFO *pexcepinfo, UINT *puArgErr)
{
    if (Flags == DISPATCH_METHOD)
    {
        switch (dispid) 
        {
        case DID_ONNEXTRECORD:
            .
            .
            .
            break;
     case DID_ONITEMCHANGED:
            .
            .
            .
            break;
       .
       .
       .
    }
    return(NOERROR);
}

V rßmci uvol≥ovßnφ komponenty je t°eba styΦn² bod uvolnit:

void CWBFormItem :: ReleaseEventHandler()
{
    if (m_EVConPt)
    {
        if (m_EVCookie)
            m_EVConPt->Unadvise(m_EVCookie);
        m_EVConPt->Release();
    }
}