时间: 2021-07-31 作者:daque
lotus公司推出的lotus domino/notes动作办公室机动化体例的平台连年来在海内获得了普遍的运用,很多的当局主管部分、金融单元、企工作单元都运用了notes以及在notes上开拓的百般办公室体例,处事功效获得了极大的普及。 在本质的运用中,为了存档以及供没安置notes体例的部分博览,很多在notes体例中流转的电子文书档案须要打字与印刷出来。悲惨的是,notes供给的打字与印刷功效很弱,一个文书档案只能依照给定表单的版式举行打字与印刷。但在本质的运用中,如当局部分,实质沟通的一个文书档案,其下行公函和下行公函的版式是不一律的,这就须要将同一文书档案用多种款式打字与印刷。最径直的办法固然是在designer中窜改表单的版式,但因为运用系一致般是湮没安排的,表单没辙窜改。再有即是最后用户的计划机程度有限,径直窜改表单从本领上讲也行不通。 这时候一个可行的做法即是:用vc++给用户供给一个"所见即所得"的编纂界面,并列出notes文书档案中各局部的实质,让用户以拖放的办法将关系实质放到符合的场所上,同声还不妨介入笔墨、图片等化装实质,而后依照最后的版式在notes外部径直天生一个notes表单,并用此表单举行打字与印刷。这种本领既绕过了湮没安排的妨碍,又贬低了对最后用户的本领诉求。固然这十足都成绩于notes供给的api因变量。 因为只需一个nsfitemscan因变量就能搜集到notes文书档案中一切的域,而又有多种精巧的办法实行"所见即所得"的排版功效,所以在提出上述的思绪后,正文将重要引见怎样结构notes表单。 一 notes表单构造简介 一个表单中有三个必定的域:$title、$info和$body,扶助性的再有$fields域及属性为placeholder的各域。 1.$title域 $title域的典型为type_text,个中生存表单的称呼,notes存户端窗口中"创造"菜单下列出的各表单名即为各表单note中$title域的值。在notes供给的c api头文献"stdnames.h"中有预订义的恒量item_name_template_name代办表单note的称呼域,为保护步调的向后兼容,倡导运用恒量而制止径直运用$title。 2.$info域 因为表单和文书档案的创造相关,$info域设置了经过此表单创造的文书档案的少许属性。本质上$info域中保存的是一个名为cddocument的构造体,对天生文书档案属性的设定即是经过对该构造体中各重量的各别赋值实行的。构造体cddocument 的设置及证明见lotus c api 的参考文书档案。 $info域的典型为type_composite,对应的预订义恒量为item_name_document。 3. $body域 $body域是表单note中的中心域,所有表单表露和打字与印刷时的方法,再有经过此表单天生的文书档案所包括的域及其典型,都是在本域中设置的。因为$body域的构造特殊搀杂,正文将在第二局部特意引见。$body域也是type_composite典型的,称呼预订义恒量为item_name_template。 4. $fields域 $fields域是一个type_text_list典型的域,个中包括了用此表单天生的文书档案包括的一切域。但专为打字与印刷天生的表单中不妨没有此域。 5. "placeholder"域 对$body域中设置的未来文书档案中要含有的每一个域,在表单中都对应一个典型为type_invalid_or_unknown而标记为item_placeholder的域,域名和$body域中设置的一律,而其值为null。标记为item_placeholder的域将被介入到"域名表"中,如许当用户采用了存户端中的"安排"菜单中的"视图"子菜单后,在弹出的对话框中采用"增添域"时,该域名才会被表露出来。同样,那些域在打字与印刷的表单中不是必定的。二 $body域详解 $body域中不妨包括百般notes东西,如文本、域、图像、热门、链接等,再有少许扶助性东西,如段设置、段援用等。为简单处置,一切那些东西的设置都是经过各别的构造体实行的。notes中设置东西的构造体都以"cd"发端,如cdtext设置静态文本、cdfield设置域等,其余东西的简直设置请查看lotus c api 的参考文书档案。 常常,一个$body域的完全构造是如许的: cdpabdefinition cdpabdefinition ... cdparagraph cdpabreference cdtext text ... cdparagraph cdpabreference cdbeginrecord cdfield cdbeginrecord ... 下面临个中的各局部辨别给予证明。 1.段落预订义局部 cdpabdefinition设置页面上一个段落的属性,在这个构造体中咱们不妨设置段落的对齐办法、页边距、段间距、行间距等。在反面的某个简直段落中,即使设置了到此段设置的援用,则该段落就具备了此处设置的各属性。 段落的设置不妨放在$body域的发端,也不妨放在中央,只有保护序号pabid不反复就不妨了。 2.静态文本的设置 上述总体构造的中央局部设置了一段文本:cdparagraph设置一段的发端,一致文本串中的一个回车换行符;cdpabreference设置一个到段设置的援用,进而本段就具备了前方设置的百般属性;cdtext是文本的头部,包括有文本的长度、字体、脸色等消息;text是本质的文本。 3.域的设置 对域的设置也是以cdparagraph和cdpabreference发端,但与文本各别的是,像域、图像等东西的设置,除去有动作头部的构造全党外,还要有一对界定构造体cdbeginrecord和cdendrecord放在东西设置的前后两头。 偶尔在域的前方还要有少许提醒性笔墨,如一个用来接受全名的域name,常常在其前方要有"全名"两个字,再不简直操作家领会此处要输出全名。简直创造域时,这局部实质以文本情势放在cdbeginrecord之前,方法如上一步中所述。 在钱币型或数值型的域中,为了对数据的方法举行更进一步的遏制,在cdbeginrecord和cdfield中央还要插入一个cdext2field构造,该构造供给了附加的方法设置。 域中的其余元素,如默许值计划公式、输出变幻公式、域名、刻画字串等放在cdfield反面,陈设程序和其长度值在cdfield构造体中的场所程序普遍。固然除域名外,其余元素如不是需要不妨简略。 在本局部中,以文本和域为例,引见了$body域中各东西的简直设置办法,其余东西与此一致。 三 创造notes表单 在领会了notes表单构造的普通上,经过api因变量创造表单就很简单了。 开始翻开一个数据库,而后在个中兴建一个空缺note,接下来就不妨向个中增添各域了。像$title如许的简单典型的域,不妨径直挪用nsfitemsettext因变量创造。而像$info和$body如许的复合典型的域,就比拟烦恼少许。常常的做法是,先请求一块充满大的外存,而后程序写入各局部实质,结果挪用nsfitemappend因变量创造域。 在向复合域中写入数据时,文本、域名等普遍字符串不妨径直写入,而百般构造体需挪用odswritememory因变量以domino典型的情势写入,其余即是域设置顶用到的百般公式,在写入前要过程nsfformulacompile变幻。四 例程 底下的步调段设置了一个带有默许值公式的名为"textfield"的域: 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 );