帮酷LOGO
0 0 评论
文章标签:Ms Word  WORD  对话框  style  DIA  

Sample Image - MSWordStyleSymbolDialog.gif

介绍

如果你使用的是 to Word,你可能会熟悉符号对话框,提供许多符号插入Word文档。 在你选择 上面 Code项目时,会自动重新排列最近使用的符号的顺序,如代码项目写入器 helper 中所列的任何符号,这样就会自动重新排列当前使用的符号。

由于使用 XMLHTTP,这篇文章还演示了Web页面刷新部分,这是使用XMLHTTP的出色的刷新部分,你应该首先阅读该页面。

存储符号的数据结构

本文使用一个XML文档来存储符号 table 中列出的符号。 XML文档的DTD如下所示:

<!ELEMENTSymbols(Symbol)><!ELEMENTSymbol(SymName,SymCode)><!ELEMENTSymName(#PCDATA)><!ELEMENTSymCode(#PCDATA)><!ELEMENTSymUseTimes(#PCDATA)><!ATTLISTSymbolSymIDCDATA#REQUIRED>

每个 Symbol 元素都有一个名为 SymID的属性,三个子元素: SymName 元素指定符号的NAME,SymCode 指定符号对应的ANSI字符代码,SymUseTimes 指示符号被选中并插入到它的他文档。

使用 上面 DTD指定的内容模型,可以创建用于保留符号的XML文档,下面显示了该文档的段:

<?xmlversion='1.0'encoding='gb2312'?><Symbols><SymbolSymID="1"><SymName></SymName><SymCode>-24090</SymCode><SymUseTimes>0</SymUseTimes></Symbol><SymbolSymID="2"><SymName></SymName><SymCode>-24089</SymCode><SymUseTimes>0</SymUseTimes></Symbol><SymbolSymID="3"><SymName></SymName><SymCode>-24085</SymCode><SymUseTimes>0</SymUseTimes></Symbol></Symbols>

使用指导

当用户请求网页打开符号对话框时,服务器端VBScript调用符号 table 和最近使用的符号列。 当 ondblclick 事件被激发时,客户端JavaScript将调用函数来更新与所选符号相关的特殊符号元素。

服务器端VBScript代码

VBScript包含三个函数。

首先,MakeSymbolTable(xmlFile) 从XML文档中提取一个符号 Collection 并在表中显示它们。

Sub MakeSymbolTable(xmlFile) 
 '/* some variables used in this procdure */dim xmlDoc 
 dim oSymbols,oSymbol 
 dim strXPath,strSymID,strSymbol 
 dim intCount,intLoop,intFlag 
 dim strFullPathFile 
 '/* Load the XML document which store the symbols */Set xmlDoc = CreateObject("Msxml2.DOMDocument")
 xmlDoc.async = False xmlDoc.validateOnParse=False strFullPathFile = server.MapPath(xmlFile)
 xmlDoc.load(strFullPathFile)
 '/* Firstly, get the list of all nodes named Symbol */'/* Then access every node in the collection */'/* and get information what we need from the node */'/* Finally, show them in a table */ strXPath = "//Symbol"set oSymbols = xmlDoc.documentElement.selectNodes(strXPath)
 intCount = oSymbols.length
 intFlag = 0 
 for intLoop=0 to intCount-1
 set oSymbol = oSymbols.item(intLoop)
 strSymID = oSymbol.getAttribute("SymID")
 strSymbol = chr(oSymbol.selectSingleNode("SymCode").text)
 %> <td><div class="clsBlockItemU" xType="Update" xID="<%=strSymID%>">
 <%=strSymbol%></div></td> <%
 intFlag = intFlag + 1if(intFlag=6) then intFlag = 0%> <td class="clsNoBorder"></TD></tr> <tr>
 <% 
 EndifNextEndSub

接下来是 ShowRUSymbols(xmlFile,xslFile),选择最近使用过的符号,并在一列中显示它们:

Sub ShowRUSymbols(xmlFile,xslFile)
 '/* some variables used in this procdure */dim xmlDoc,xslDoc,xmlRstDoc
 dim oSymbols,oSymbol 
 dim strXPath,strSymID,strSymbol 
 dim intCount,intLoop,intFlag 
 dim strFullPathXmlFile,strFullPathXslFile
 '/* Load the XML document which store the symbols */Set xmlDoc = CreateObject("Msxml2.DOMDocument")
 xmlDoc.async = False xmlDoc.validateOnParse=False strFullPathXmlFile = server.MapPath(xmlFile)
 xmlDoc.load(strFullPathXmlFile)
 '/* Load the XSL document which is used to sort the XML document */Set xslDoc = CreateObject("Msxml2.DOMDocument")
 xslDoc.async = False xslDoc.validateOnParse=False strFullPathXslFile = server.MapPath(xslFile)
 xslDoc.load(strFullPathXslFile)
 '/* Sorting the XML document with the XSLT document */Set xmlRstDoc = CreateObject("Msxml2.DOMDocument")
 xmlRstDoc.async = False xmlRstDoc.validateOnParse=False xmlDoc.transformNodeToObject xslDoc, xmlRstDoc
 strXPath = "//Symbol"set oSymbols = xmlRstDoc.documentElement.selectNodes(strXPath)
 intCount = oSymbols.length
 if(intCount <14) then intSCount = intCount
 else intSCount = 14Endif intFlag = 0 
 for intLoop=0 to intCount-1
 set oSymbol = oSymbols.item(intLoop)
 strSymID = oSymbol.getAttribute("SymID")
 strSymbol = chr(oSymbol.selectSingleNode("SymCode").text)
 %> <td><div class="clsBlockItemU" xType="noUpdate" xID="<%=strSymID%>">
 <%=strSymbol%></div></td> 
 <%
 NextEndSub

last procedure IncUseTimes(strSymID,xmlFile) 元素中指定元素的文本内容,最后将子元素的文本内容转换为数字 num,最后将名为元素 Ele的子元素的文本内容转换成数字:

Sub IncUseTimes(strSymID,xmlFile)
 '/* some variables used in this procdure */dim xmlDoc
 dim oItem
 dim strXPath,strSymUsedTimes
 dim lngCount
 dim strFullPathFile
 '/* Load the XML document which store the symbols */Set xmlDoc = CreateObject("Msxml2.DOMDocument")
 xmlDoc.async = False xmlDoc.validateOnParse=False strFullPathFile = server.MapPath(xmlFile)
 xmlDoc.load(strFullPathFile)
 '/* Select the corresponding SymUseTimes element */'/* then, Get the text content of the element */'/* Convert the string to a number, and increase the number by 1 */'/* Set the text content of the element to the new number's value */'/* Save the XML document */ strXPath = "//Symbol[@SymID='"& strSymID & "']/SymUseTimes"set oItem = xmlDoc.documentElement.selectNodes(strXPath)
 strSymUsedTimes = oItem.text
 lngCount = Clng(strSymUsedTimes) + 1 oItem.text = Cstr(lngCount)
 xmlDoc.save strFullPathFileEndSub

客户端JavaScript代码

JavaScript包含六个函数。 函数的关系可以如下描述:

当触发 dblclick 事件时,doSel() 函数被调用。 这个函数非常简单,它检查是否选择了一个符号项;如果是 true,它将调用 UpdateDB() 函数来更新相应的符号元素。 在 UpdateDB() 函数的正文中,FinishUpdate() 函数将与 onreadystatechange 事件连接在一起。 当应用程序中的onreadystatechange 被激发时,FinishUpdate() 函数将被调用以决定是否更新最近使用过的符号。 如果需要,FinishUpdate() 函数将调用 UpdateMostUse() 函数来更新用户界面。

UpdateDB() 函数和 UpdateMostUse() 函数比它的他函数复杂一点,并且让我们详细讨论它们,这里:

首先,我声明为全局变量,因为它们中的每一个都使用了几乎所有函数。

/* store a collection of symbol */var arrSymbol = new Array(14);/* store a collection of symbol's ID */var arrSymID = new Array(14);/* for storing the current selected item */var gCurDivSel = null;/* for storing an XMLHTTP object */var http = null;

UpdateDB() 函数使用XMLHTTP更新Web服务器中的数据:

function UpdateDB(xID){
 /* some variables used in this function */var strFileName = "IncSymUseTimes.asp?id="+xID;
 var editdata = null;
 /* Communicate with the Web server using XMLHTTP */ http = new ActiveXObject(" Microsoft.XMLHTTP");
 http.open("POST",strFileName,true);
 /* Bind the FinishUpdate() function to the onreadystatechange event */ http.onreadystatechange = FinshUpdate;
 http.send(editdata);
}

UpdateMostUse() 函数用于重新排列最近使用的符号,使用DHTML更新用户界面,而无需刷新整个页面:

function UpdateMostUse(oDiv){
 /* some variables used in this function */var nLoop = 0;
 var nCount = arrSymbol.length;
 var nIndex = -1;
 var chrCurUse,nSymID;
 var chrTmp,nTmp;
 var oDivCur = null;
 var oTD = null;
 /* arrange the symbol array */ chrCurUse = oDiv.innerText;
 nSymID = oDiv.xID;
 for(nLoop=0;nLoop<nCount;nLoop++)
 {
 chrTmp = arrSymbol[nLoop];
 if(chrTmp==chrCurUse)
 nIndex = nLoop;
 }
 if(nIndex!=-1){
 chrTmp = arrSymbol[0];
 nTmp = arrSymID[0];
 arrSymbol[0]=arrSymbol[nIndex];
 arrSymID[0] = arrSymID[nIndex];
 arrSymbol[nIndex] = chrTmp;
 arrSymID[nIndex] = nTmp;
 }
 else{
 arrSymbol.pop();
 arrSymbol.unshift(chrCurUse);
 arrSymID.pop();
 arrSymID.unshift(nSymID);
 }
 /* update the user interface using DHTML */for(nLoop=0;nLoop<nCount;nLoop++){
 oTD = trMostUsed.cells[nLoop];
 oDivCur = oTD.firstChild;
 if(typeof(oDivCur)=="object"){
 oDivCur.innerText=arrSymbol[nLoop];
 oDivCur.xID=arrSymID[nLoop]; 
 }
 }
}

如何使用它

  • 下载源代码并解压到web服务器的网页目录中。 设置XML文件夹上的读和写访问控制。
  • 将显示为 below的代码复制到网页。
function OpenSymDlg(){
 /* some variables used in this function */var strOptions,strUrl;
 /* Configure the window omaments of the dialog box *//* and then Create a modeless dialog box
 that displays the specified Web Page */ strOptions = 
 "status:no;dialogHeight:346px;dialogWidth:446px;resizable:no;help:no;" strUrl = "SymbolDialog.asp";
 window.showModelessDialog(strUrl,null,strOptions);
}
  • 在调用函数时将 ShowSymDlg() 函数绑定到任何对象上激发的事件。
<inputtype="button"onclick="OpenSymDlg()"value="Open Symbol Dialog">
  • 将事件激发到所选对象以显示符号对话框。

结束语

在本文中创建了一个 MS Word符号对话框,所以你可以看到它似乎正常工作。 我希望你能发现。

请将你的意见,建议和问题发送给你: marryjack@hotmail.com。



文章标签:WORD  style  DIA  对话框  Ms Word  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语