char TextFieldName[] = "TextField"; char TextDescription[] = "This is a Simple Text Field"; char TextDefValFormula[] = "\"Default\""; char far *pBufferStart, far *pBuffer; HANDLE hMem; CDPABREFERENCE CDPabRef; CDPARAGRAPH CDPara; CDBEGINRECORD CDBegin; CDENDRECORD CDEnd; CDEXT2FIELD CDExt2Field; CDFIELD CDField; FONTIDFIELDS *pFontFields;
// 申请内存并锁定内存,获得指向该块内存的指针 OSMemAlloc (0, wCDBufferLength, &hMem); pBufferStart = (char far *)OSLockObject(hMem); memset( pBufferStart, 0, (size_t) wCDBufferLength ); pBuffer = pBufferStart;
// 填写 PARAGRAPH 结构 // 结构体的长度 CDPara.Header.Length = (BYTE) ODSLength(_CDPARAGRAPH); // 结构体的类型 CDPara.Header.Signature = (BYTE)SIG_CD_PARAGRAPH; // 转换为Domino规范的形式写入申请的内存 ODSWriteMemory( (void far * far *)&pBuffer, _CDPARAGRAPH, &CDPara, 1 );
// 填写 PABREF 结构 CDPabRef.Header.Signature = (BYTE)SIG_CD_PABREFERENCE; CDPabRef.Header.Length = (BYTE) ODSLength(_CDPABREFERENCE); // 要引用的段定义的序号 CDPabRef.PABID = wPabDefNumber; ODSWriteMemory( (void far * far *)&pBuffer, _CDPABREFERENCE, &CDPabRef, 1 );
// 填写CDBEGINRECORD 结构 CDBegin.Header.Length = (BYTE)ODSLength(_CDBEGINRECORD); CDBegin.Header.Signature = SIG_CD_BEGIN; CDBegin.Version = 0; CDBegin.Signature = SIG_CD_FIELD; ODSWriteMemory( (void far * far *)&pBuffer, _CDBEGINRECORD,(void far *) &CDBegin, 1 );
// 填写CDEXT2FIELD 结构 memset(&CDExt2Field, 0, sizeof(CDEXT2FIELD)); CDExt2Field.Header.Length = (WORD)ODSLength(_CDEXT2FIELD); CDExt2Field.Header.Signature = SIG_CD_EXT2_FIELD; ODSWriteMemory( (void far * far *)&pBuffer, _CDEXT2FIELD, (void far *) &CDExt2Field, 1 );
// 填写CDFIELD 结构,定义文本域 CDField.Header.Signature = SIG_CD_FIELD; CDField.Flags = FEDITABLE; CDField.DataType = TYPE_TEXT; CDField.ListDelim = LDDELIM_SEMICOLON;
// 本域中不用数值格式参数,全部清零 CDField.NumberFormat.Digits = 0; CDField.NumberFormat.Format = 0; CDField.NumberFormat.Attributes = 0; CDField.NumberFormat.Unused = 0;
file://本域中不用时间格式参数,全部清零 CDField.TimeFormat.Date = 0; CDField.TimeFormat.Time = 0; CDField.TimeFormat.Zone = 0; CDField.TimeFormat.Structure = 0;
// 设定FontID pFontFields = (FONTIDFIELDS *)&CDField.FontID; pFontFields->Face = FONT_FACE_ROMAN; pFontFields->Attrib = 0; pFontFields->Color = NOTES_COLOR_BLACK; pFontFields->PointSize = 14;
// 编译默认值公式 NSFFormulaCompile(NULL, 0, TextDefValFormula, (WORD) strlen(TextDefValFormula), &hTextDefValFormula, &wTextDefValFormulaLen, &wdc, &wdc, &wdc, &wdc, &wdc))
// 填写CDFIELD 结构的其余部分,因为DVLength值只有公式编译后才知道 CDField.DVLength = wTextDefValFormulaLen; CDField.ITLength = 0; CDField.TabOrder = 0; CDField.IVLength = 0; CDField.NameLength = strlen(TextFieldName); CDField.DescLength = strlen(TextDescription); CDField.TextValueLength = 0; CDField.Header.Length = ODSLength(_CDFIELD) +CDField.DVLength +CDField.ITLength +CDField.IVLength +CDField.NameLength +CDField.DescLength +CDField.TextValueLength;
// 保证CDFIELD域长度为偶数 if (CDField.Header.Length % 2) CDField.Header.Length++; ODSWriteMemory( (void far * far *)&pBuffer, _CDFIELD, (void far *)&CDField, 1 );
// 获取指向编译后公式的指针 pTextDefValFormula = OSLock( char, hTextDefValFormula ); // 写入公式内容到内存 memcpy( pBuffer, pTextDefValFormula, wTextDefValFormulaLen ); pBuffer += CDField.DVLength; // 解锁并释放公式占用的空间 OSUnlockObject(hTextDefValFormula); OSMemFree(hTextDefValFormula);
// 域名部分,直接写入 memcpy( pBuffer, TextFieldName, CDField.NameLength ); pBuffer += CDField.NameLength;
// 域描述部分,直接写入 memcpy( pBuffer, TextDescription, CDField.DescLength ); pBuffer += CDField.DescLength;
// 保证整个域定义的长度为偶数 if ((pBuffer-pBufferStart) %2) pBuffer++;
// 填写CDENDRECORD结构 CDEnd.Header.Length = (BYTE)ODSLength(_CDENDRECORD); CDEnd.Header.Signature = SIG_CD_END; CDEnd.Version = 0; CDEnd.Signature = SIG_CD_FIELD; ODSWriteMemory( (void far * far *)&pBuffer, _CDENDRECORD, (void far *) &CDEnd, 1 ); |