/////////////////////////////////////////////////////////////////////////////////////////////// // Pendant zu wsprintf() für string-Parameter; // im Unterschied zu Format() werden hier die übergebenen Parameter auf den Stack erwartet; // der Hauptteil dieser Routine beschäftigt sich damit, die Zeichenanzahl für den char*-Puffer // pTmp zu ermitteln, der dann nur noch an die Bibliotheksfunktion _vstprintf() übergeben wird void FormatV (string& rStr, LPCTSTR lpszFormat, va_list argList) { TX_ASSERT (TIsValidString(lpszFormat, false)); va_list argListSave = argList; // make a guess at the maximum length of the resulting string int nMaxLen = 0; for (LPCTSTR lpsz = lpszFormat; *lpsz != '\0'; lpsz = _tcsinc(lpsz)) { // handle '%' character, but watch out for '%%' if (*lpsz != '%' || *(lpsz = _tcsinc(lpsz)) == '%') { nMaxLen += _tclen(lpsz); continue; } int nItemLen = 0; // handle '%' character with format int nWidth = 0; for (; *lpsz != '\0'; lpsz = _tcsinc(lpsz)) { // check for valid flags if (*lpsz == '#') nMaxLen += 2; // for '0x' else if (*lpsz == '*') nWidth = va_arg(argList, int); else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' || *lpsz == ' ') ; else // hit non-flag character break; } // get width and skip it if (nWidth == 0) { // width indicated by nWidth = _ttoi(lpsz); for (; *lpsz != '\0' && _istdigit(*lpsz); lpsz = _tcsinc(lpsz)) ; } TX_ASSERT (nWidth >= 0); int nPrecision = 0; if (*lpsz == '.') { // skip past '.' separator (width.precision) lpsz = _tcsinc(lpsz); // get precision and skip it if (*lpsz == '*') { nPrecision = va_arg(argList, int); lpsz = _tcsinc(lpsz); }
/////////////////////////////////////////////////////////////////////////////////////////////// // Pendant zu wsprintf() für string-Parameter; // die in beliebiger Anzahl übergebenen Parameter werden auf den Stack gelegt void __cdecl Format (string& rStr, LPCTSTR lpszFormat, ...) { TX_ASSERT (TIsValidString(lpszFormat, false)); va_list argList; va_start(argList, lpszFormat); FormatV(rStr, lpszFormat, argList); va_end(argList); }
///////////////////////////////////////////////////////////////////////////// // Bestimmt den konkreten TargetPointer in Abhängigkeit von dem MerkmalsTyp long GetMerkmalTarget (HPROJECT hPr, void *pTarget, short iTTyp) { switch (iTTyp) { case OBL_OLD: // direkt ObjektNummer TX_ASSERT((long)pTarget > 0); return (long)pTarget; case IDL_OLD: // Identifikator ist gegeben { long ID = (long)pTarget; ErrInstall EI (WC_NOTFOUND); DB_ADDR_IDL dbaIDL(hPr); TX_ASSERT(ID != 0L && ID != -1L); // dbaIDL.file_no = IDL; if (z_keyfind (&dbaIDL, IDN_OLD, &ID) != EC_OKAY) return -1L; return dbaIDL.rec_no; } break; case SICHT: if (pTarget != NULL) { char *pSicht = new char [41]; if (pSicht == NULL) return -1L; TX_ASSERT(TIsValidString ((char *)pTarget)); memset (pSicht, '\0', 41); strcpy (pSicht, (char *)pTarget); // AnsiToOem (pSicht, pSicht); // Zeichensatz konvertieren ErrInstall EI (WC_NOTFOUND); DB_ADDR dbaSICHT(hPr); long result = -1; dbaSICHT.file_no = SICHT; if (z_keyfind (&dbaSICHT, SICHTNAME, pSicht) == EC_OKAY) result = dbaSICHT.rec_no; DELETE_OBJ (pSicht); return result; } else return -1L; break; default: TX_ASSERT(false); break; } return -1L; }
HRESULT DatenBasisObjekt::DelPBDDataMerkmal (HPROJECT hPr, PBDDATA *pData) { TX_ASSERT(IsTRiASDBBased()); TX_ASSERT(NULL == pData -> pbdKText || TIsValidString(pData -> pbdKText)); // wenns ein Ansichtsmerkmal sein soll, dann einfach wieder raus if ((sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) && MPViewFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F)) { return S_FALSE; } TX_ASSERT(sizeof(PBDMERKMALEX) == pData -> dwSize && 0 != ((PBDMERKMALEX *)pData) -> lIdent); // Ident muß gegeben sein // Feature entweder über Code oder Namen löschen CComVariant v; if (NULL == pData -> pbdKText) v = pData -> pbdCode; else v = pData -> pbdKText; // Wiederauffinden des Objects-Objektes WTRiASFeatures Feats; WTRiASObjects Objs; INT_PTR lIdent = ((PBDMERKMALEX *)pData) -> lIdent; RETURN_FAILED_HRESULT(GetObjectsFromMap (lIdent, Objs)); // Objektmenge muß existieren RETURN_FAILED_HRESULT(Objs -> get_Features (Feats.ppi())); // erstmal nachsehen, ob das Merkmal existiert bool fExists = false; { WTRiASFeature Feat; fExists = SUCCEEDED(Feats -> Item(v, Feat.ppi())) ? true : false; } if (fExists) { // nur löschen, wenns wirklich (noch) existiert) RETURN_FAILED_HRESULT(Feats -> Remove (v)); // Notifikation rumschicken DEXN_FeatureSetModified(lIdent); } return fExists ? S_OK : S_FALSE; // S_FALSE heißt 'existiert nicht' }