// alle zum Erzeuger gehörenden Abfälle locken int CAbfSet::LockReckord (BOOL bLock, CWnd *pWnd, const char *pNummer) { int iRes = LockFailed; // noch nichts getan COleVariant varOldPos; try { CMutex mt; if (!m_bCanUpDate) // war durch anderen Nutzer return NothingToLock; // gesperrt if (m_RecordInfoList.IsEmpty ()) return Locked; ASSERT (IsOpen ()); CWaitCursor wc; // ak. Satz immer zuerst behandeln iRes = CDaoRecordsetExt :: LockReckord (bLock, pWnd, pNummer); if ((LockFailed == iRes) || // wenn Fehler beim Locken oder (bLock && (NothingToLock == iRes))) // durch anderen Nutzer gesperrt return iRes; varOldPos = GetBookmark (); // alte Pos. speichern CRecordInfo *pInfo = NULL; // jetzt durch alle Sätze bewegen POSITION pos = m_RecordInfoList.GetHeadPosition (); while (NULL != pos) { pInfo = m_RecordInfoList.GetNext (pos); ASSERT (NULL != pInfo); if (pInfo -> m_varBookMark == varOldPos) // diesen Satz nicht noch mal continue; SetBookmark (pInfo -> m_varBookMark); // akt. Satz setzen iRes = CDaoRecordsetExt :: LockReckord (bLock, NULL, pNummer); if ((LockFailed == iRes) || // wenn Fehler beim Locken oder (bLock && (NothingToLock == iRes))) // durch anderen Nutzer gesperrt break; } } catch (CDaoException *e) { :: DisplayDaoException (e); e -> Delete (); } catch (CException *e) { e -> ReportError (); e -> Delete (); } if (varOldPos.vt != VT_EMPTY) SetBookmark (varOldPos); // wieder auf alte Position return iRes; }
int PoeditListCtrl::OnGetItemImage(long item) const { if (!m_catalog) return IMG_NOTHING; auto d = ListIndexToCatalogItem((int)item); if (d->GetBookmark() != NO_BOOKMARK) return IMG_BOOKMARK; else if (d->HasComment() || d->HasExtractedComments()) return IMG_COMMENT; else if (d->IsAutomatic()) return IMG_AUTOMATIC; else return IMG_NOTHING; }
/// Returns true if the item has a bookmark bool HasBookmark() const {return (GetBookmark() != NO_BOOKMARK);}
BOOL CAbfSet::SearchNummer (const char *pNummer, BOOL bOutErrMsg /*=TRUE*/) { // wenn der Erzset noch leer ist ist alles getan if (NULL == g_pErzSet) return TRUE; // JG den default Parameter handeln if (NULL == pNummer) pNummer = (g_pErzSet->m_Nummer); ASSERT (pNummer != NULL && AfxIsValidString (pNummer)); BOOL bOk = FALSE; // noch nichts getan try { // Satz bereits geladen ? // das will ich ja gerade provozieren // if (!*pNummer || (m_Nummer == pNummer)) // return TRUE; CMutex mt; CWaitCursor wc; COutputLockError le (this); // akt. Satz entriegeln und speichern if (!LockReckord (FALSE)) return FALSE; // akt. Pos. merken COleVariant BookMark = GetBookmark (); bOutErrMsg = false; // neue Nummer suchen if (MoveExt ("=", AFX_DAO_NEXT, pNummer)) { bOk = TRUE; } else { if (bOutErrMsg) { CGakApp *pApp = (CGakApp *) AfxGetApp (); ASSERT (pApp != NULL); CString strInfo; AfxFormatString1 (strInfo, IDS_ABF_NOT_FOUND, pNummer); pApp -> OutputMessage (strInfo); // Nachricht an Nutzer ausgeben } SetBookmark (BookMark); // alten Satz einstell. } // akt. Satz sperren return LockReckord(); } catch (CException *e) { // e -> ReportError (); // bereits ausgegeben e -> Delete (); } return bOk; }
// überlagerte MoveNext-Funktion // die Funktion geht davon aus, daß der Index "Nummer" gesetzt ist BOOL CAbfSet::MoveExt (const char *pS, int iDir, const char *pErzNr /* = NULL */) { ASSERT_VALID (this); ASSERT (IsOpen ()); ASSERT (NULL != pS && AfxIsValidString (pS)); ASSERT ((0 == strcmp (pS, ">")) || (0 == strcmp (pS, "<")) || (0 == strcmp (pS, "="))); ASSERT ((AFX_DAO_NEXT == iDir) || (AFX_DAO_PREV == iDir) || (AFX_DAO_FIRST == iDir) || (AFX_DAO_LAST == iDir)); COleVariant varOldErz; // alter Erzeuger BOOL bResOp = FALSE; // noch nichts getan try { CMutex mt; // dieses Codestück thread sicher machen CWaitCursor wc; varOldErz = GetBookmark (); // Marke von altem Erzeuger // zur nächsten Abfallgruppe BOOL bFirstOp = FALSE; switch (iDir) { case AFX_DAO_NEXT: case AFX_DAO_PREV: { // JG einfach den synchronen DS finden if (NULL == pErzNr && NULL != g_pErzSet) pErzNr = (g_pErzSet->m_Nummer); ASSERT ((NULL != pErzNr && *pErzNr) || !m_Nummer.IsEmpty ()); #pragma MSG("JG Clean up this") // Das wäre die Version mit Abfrage /* // m_strFilter strFilter; m_strFilter = "[Nummer] = """; m_strFilter += pErzNr && *pErzNr ? pErzNr : m_Nummer; m_strFilter += """"; Requery(); */ COleVariant VarNr (pErzNr && *pErzNr ? pErzNr : m_Nummer, VT_BSTRT); bFirstOp = Seek (pS, &VarNr); } break; case AFX_DAO_FIRST: case AFX_DAO_LAST: { CDaoRecordset :: Move (iDir); if (AFX_DAO_FIRST == iDir) iDir = AFX_DAO_NEXT; else iDir = AFX_DAO_PREV; bFirstOp = TRUE; } break; default: ASSERT (FALSE); } // 1. Satz gefunden ? if (bFirstOp) { // Buchmarken sammeln CRecordInfoList NewList; // neue Liste anlegen CRecordInfo *pInfo = NULL; // Zeiger int. CString strNummer (m_Nummer); do { // Infos speichern CRecordInfo *pInfo = new CRecordInfo (m_Abfallnummer, GetBookmark ()); NewList.AddTail (pInfo); try { CDaoRecordset :: Move (iDir); } catch (CDaoException *e) { :: DisplayDaoException (e); e -> Delete (); break; } catch (CException *e) { e -> Delete (); break; } } while ((m_Nummer == strNummer) && !IsEOF () && !IsBOF ()); // ggf. Lockmeldung ausgeben OutputLockErrorMessage (); // jetzt auf 1. Erzeuger gehen POSITION pos; if (AFX_DAO_NEXT == iDir) pInfo = NewList.GetHead (); else { // letzter Satz soll 1. werden pos = NewList.FindIndex (NewList.GetCount () - 1); pInfo = NewList.GetAt (pos); } ASSERT (NULL != pInfo); SetBookmark (pInfo -> m_varBookMark); pInfo -> m_bFirst = TRUE; // jetzt Liste umkopieren m_RecordInfoList.RemoveAll (); // alte Liste zuvor löschen pos = NewList.GetHeadPosition (); while (NULL != pos) m_RecordInfoList.AddTail (NewList.GetNext (pos)); NewList.CPtrList::RemoveAll (); bResOp = TRUE; // JG #pragma MSG("m_bValid accessing function") // m_bValid = TRUE; // alles OK } // Seek failed else { // hier wird zu dem alten Satz gegangen SetBookmark (varOldErz); // es wurde kein weiterer Erzeuger gefunden } } catch (CException *e) { if (e -> IsKindOf (RUNTIME_CLASS(CDaoException))) ::DisplayDaoException ((CDaoException*) e); else e -> ReportError (); if (varOldErz.vt != VT_EMPTY) SetBookmark (varOldErz); throw; // Exception weiterleiten } return bResOp; // Operationflag setzen }