// -------------------------------------------------------------------------------------------- STDMETHODIMP CRegOperatPropAct::EndAction (DWORD, IDataObject** ppDataOut) { _ASSERTE (m_ObjsIter != m_InObjs.end()); *ppDataOut = 0; try { WEnumLONG wEnumInObj (*m_ObjsIter); // die zu bearbeitenden Objekte WEnumLONG wEnumOutObj; // Ergebnisobjekte der ausgewählten Operation // Optionen abfragen DWORD dwOptions = 0x00; if (SUCCEEDED(EnsureOptionsIF())) { _ASSERTE(m_wOperOptions.IsValid()); m_wOperOptions->GetOptions (&dwOptions); } // im Dialog ausgewählte Operation ausführen THROW_FAILED_HRESULT (m_pRegOperDlg->ExecuteOperation (m_hPr, wEnumInObj, dwOptions, wEnumOutObj.ppi())); m_ObjsIter++; if (wEnumOutObj.IsValid()) { // IDataObject abfragen WDataObject IDO (CLSID_DataTransferObject); // Ergebnisobjekte im DataObjekt IDO speichern THROW_FAILED_HRESULT (SetEnumLONGData ( (IEnum<LONG>*)(IEnumLONG*)wEnumOutObj, IDO)); // Resultat setzen *ppDataOut = IDO.detach(); if (0 == wEnumOutObj->Count()) { ResString resTitel (ResID (IDS_LONGCLASSNAME, pRF), 50); ResString resText (ResID (IDS_BOXTEXT1, pRF), 200); MessageBox (__hWndM, resText.Addr(), resTitel.Addr(), MB_ICONINFORMATION | MB_OK); } } } catch (_com_error& hr_result) // 23.09.99 { DELETE_OBJ (m_pRegOperDlg); // bei Fehler Dialog wieder freigeben return _COM_ERROR(hr_result); // 23.09.99 } if (m_ObjsIter != m_InObjs.end()) // es kommen noch weitere Daten return S_FALSE; DELETE_OBJ (m_pRegOperDlg); // es kommen keine Daten mehr return S_OK; } // EndAction
// -------------------------------------------------------------------------------------------- STDMETHODIMP CAreaBuildPropAct::EndAction (DWORD, IDataObject** ppDataOut) { _ASSERTE (m_ObjsIter != m_InObjs.end()); *ppDataOut = 0; COM_TRY { WEnumLONG wEnumInObj (*m_ObjsIter); // die zu bearbeitenden Objekte WEnumLONG wEnumOutObj; // Ergebnisobjekte der ausgewählten Operation // Optionen abfragen DWORD dwOptions = 0x00; if (m_wOperOptions.IsValid()) m_wOperOptions->GetOptions (&dwOptions); // im Dialog ausgewählte Operation ausführen THROW_FAILED_HRESULT (m_pAreaBuildDlg->ExecuteOperation (m_hPr, wEnumInObj, dwOptions, wEnumOutObj.ppi())); m_ObjsIter++; if (wEnumOutObj.IsValid()) { // IDataObject abfragen WDataObject IDO (CLSID_DataTransferObject); // Ergebnisobjekte im DataObjekt IDO speichern THROW_FAILED_HRESULT (SetEnumLONGData ((IEnum<LONG>*)(IEnumLONG*)wEnumOutObj, IDO)); // Resultat setzen *ppDataOut = IDO.detach(); if (0 == wEnumOutObj->Count()) { ResString resTitel (ResID (IDS_LONGCLASSNAME, pRF), 50); ResString resText (ResID (IDS_BOXTEXT7, pRF), 200); MessageBox (__hWndM, resText.Addr(), resTitel.Addr(), MB_ICONINFORMATION | MB_OK); } } } COM_CATCH_OP( delete m_pAreaBuildDlg; // bei Fehler Dialog wieder freigeben );
// Object bearbeiten ---------------------------------------------------------- int end_previous_object (void) { long irc = 0L; lgi++; /* Geometriezaehler korrigieren */ if (lgi < koord_paare) return (db_error (EGCNT, ASCPARSER, yylineno)); // bevor irgend etwas passiert Header neu einlesen if (g_fReReadHeader) { DEXN_ReReadHeader(); DEXN_ReScale(); g_fReReadHeader = false; // nur einmal } // auswerten ob Komplexobjekt if (lgi == 0) { if (RelCount() == 0) return db_error (EBADKO, ASCPARSER, yylineno); if (!r_flag) return EOKAY; // keine Relationen, keine KomplexObjekte sta[0] = K_OBJEKT; // Status setzen sta[1] = 0; } HPROJECT hPr = DEX_GetDataSourceHandle(); _ASSERTE(NULL != hPr); irc = CreateObject (on, id, sta, mi, lgi, gxi, gyi); if (g_flag) { // evtl. ObjectGuid setzen if (irc && '\0' != guid[0]) { OBJECTGUID OUID; INITSTRUCT (OUID, OBJECTGUID); OUID.lONr = on; if (SUCCEEDED(CLSIDFromString (WideString(guid), &OUID.guid))) { // versuchen über GUID zu finden if (FAILED(DEX_FindObjectFromGuidEx (hPr, OUID))) { // alten Guid wieder setzen HRESULT hr = DEX_SetObjectGuid (OUID); // if (FAILED(hr) && HRESULT_FROM_ERRCODE(S_DUPLICATE) == hr) { // TX_ASSERT(0 != OUID.lONr); // Objekt muß existieren // // // GUID bereits in GeoDB vorhanden !!?? // irc = S_DUPLICATE; // // // neu erzeugtes Objekt löschen // DEX_DeleteObject (on); // CountObjects (sta[1], false); // // // Geometrie an existierendem Objekt korrigieren // on = OUID.lONr; // hier spielt die Musik // irc = CreateObject (on, id, sta, mi, lgi, gxi, gyi); // } } } } } else irc = UpdateFeatures (hPr, on, id, sta, mi); // evtl. zur AusgabeObjektmenge hinzufügen if (irc && g_Enum.IsValid()) g_Enum -> AddItem (on); // Protocoll, Relationen etc. bool fBreak = false; if (NULL != g_pDlg) { if (irc) g_pDlg -> SetPos (ftell (yyin), on); fBreak = g_pDlg -> Break(); } if (fpProt) fprintf (fpProt, "Satz %5ld, Objekt %5ld: Irc = %3ld\n", satz_nr, on, irc); if (irc && r_flag) { if (RelCount()) { // Relationen aufbauen long lONr, lRCode; short iRTyp; ResetList(); while (RetrieveNextFromList (&lONr, &lRCode, &iRTyp)) CreateRelation (on, lONr, lRCode, iRTyp); ClearList(); } // Zuordnung Objekt <--> SatzNummer für Relationen merken StoreInTree (on, satz_nr); } return fBreak; }