概述
串表(string table)是一个存放应用程序要显示的错误信息、提示或任何其他文本串的表。可以在工程文件中存放多个串表。一般地,可以为程序的每个逻辑组定义一个独立的串表。例如,可以设计与所有由File菜单中的命令调用的菜单相关的串。
将文本串定义为独立的资源就可以很方便地在不修改源代码的情况下编辑文本。例如,如果需要将某一Windows程序的界面翻译成外语,那么将大部分文本放在串表中就可以简化这个过程。(但仍需要翻译其他资源如对话框中的文本。)
当处理串表时,要执行的四项主要任务是:
·启动串编辑器
·创建并编辑串表
·保存串表
·测试串表1
启动串编辑器如何启动串编辑器与是要创建一个新的串表还是要编辑一个已经存在的串表有关。
启动串编辑器以创建一个新的串表的步骤如下:
(1)打开希望将串表加入其中的工程。
(2)选择Resource |New。
(3)在New Resource对话框中,在Resource Type列表框中选择STRINGTABLE后再选择OK。
Resource Workshop打开串编辑器并在工程窗口中放入一个对新串表敝引用。
启动串编辑器以编辑一个已经存在的串表的步骤如下:
(1)打开包含希望编辑的串表的工程。
(2)在工程窗口中找出该串表。
(3)在该串表入口项上按两次鼠标钮,或者先选择它再选择Resource|Edit。
所选择的串表就会出现在串编辑器中。
处理串表当打开串编辑器时就出现一个串表。如果刚刚创建了一个新串表,则不会见到任何串入口项,因为还没有输入任何串表。如果正在编辑一个已经存在的串表,那么就将见到与图差不多的串入口项。
每个串表入口项都要有一个ID Source,一个ID Value,以及串本身。
串表中的每个串都必须有一个唯一的整数ID。Windows将所有的串分成若干段,每段包含16个串。ID为0到15的串构成第一个段,ID为16至31的串构成第二个段,等等。当在编译资源时,各个串是按段来加入到可执行文件中的。在运行时刻,这些段被装入内存。
当应用程序需要某个特定的串时,Windows就将包含该串的整个串段装入内存。了解了Windows如何处理串就能仔细设计串ID的赋值,以节约内存空间。
假设要为应用程序定义32个串。如果将从0到31的ID赋给这些串,则需向可执行文件中加入两个段。每当应用程序需要一个串时就有16个串被装入内存,其中的一些可能是不需要的。
一种更好的办法是对所有的串进行逻辑分组。例如,如应用程序的一个部分需要五个串,将它们编号为0到4。如果应用程序的第二部分需要九个串,则将它们编号为16至24,将它们放在第二个段中。这样Windows就可以将相关的串一起装入,而不会装入其他不需要的串。虽然全部的段仍将被装入,但每个未用的ID仅占用一个字节的内存。所以,如果五个串放在一个段中,其他未用的ID仅占用11个字节的内存。如果被装入的段包含11个未用的串,则使用的空间就要多很多。
当指定一个唯一的串ID时,可以使用一个整数或一个字母数字标识符(即C或C++中的#define,或Pascal中的常量说明),后者代表一个整数。如果选用字母数字标识符以使得串ID更容易记忆,就很可能希望将标识符存放在一个标识符文件中(对C和C++来说是个头文件,对Pasesl来说是个单元文件或包含文件)。要确保当在串编辑器内保存标识符时这些文件中的一个是存在的。1
加人新串注意串编辑器头部的标题:
一个ID Source包含与该串相关的一个整数。如果将一个标识符赋为该ID,它就在这儿出现。否则,将看到整数ID。
一个ID Value总是包含该串的整数ID。
一个String是一个文本串。它在串表中存储为一个Pascal串;亦即,在该串的文本之前有一个字节指示该串的长度。一个串可包含255个文本字符。
欲向串表中插入一个新串,如果这个表是个新表,则可按下面的步骤为该串输入信息,如第3,4,5步中所描述的那样;如果打算将一个串加入一张表,则从第1步开始。
(1)选择希望加入新串处的上一行中的串。
(2)按Ins或选择Stringtable|New Item。
(3)键入该串的一个ID Source或接受串编辑器写入这个域的数字。基于键入的ID Source,串编辑器找出ID Value的适当整数值(为将ID Source恢复至原始设置,在按Tab或 Enter之前按Esc)。
可以键入一个整数或一个代表整数的字母数字标识符。如果键入了一个不代表整数的字母数字标识符,则串编辑器就在按Enter或选择一条菜单时提示创建一个新的标识符。
创建一个新的标识符的步骤如下:
a.选择Yes。New Identifier对话框出现。
b.为标识符键入一个新值并指定将它存储在何处。选择OK。
(4)按Tab或在String之下的框中按鼠标钮并键入文本串。
每个串最长可达255个字符,并可以包含任何C一类型的escape转义序列,包括\n(换行),\t(制表),\r(回车),\\(反斜杠),\”(双引号)。
当Resource Workshop编辑器在一个串入口项中遇到一个C类型转义序列时,它就在目标代码中产生相应的ASCII 十六进制值,并由程序负责正确地解释该值。例如,当编译器分析\b\040\x7F时,它就产生十六进制序列07207F。代码可能将这一序列解释为ASCII字符BEL,SPC和DEL,或者它可以给这些十六进制值赋予另外的意义:
(5)按Enter(接受新值)或Ins(接受并插入一个新值)。1
编辑已经存在的串利用串编辑器可以很方便地修改每个串。为用鼠标来选择一个串,在希望编辑的串上按一下鼠标钮即可。若是利用键盘,则按Tab,↑,或↓以在表中移动。将光标定位于希望编辑的串上。
修改串可以删除任何串的ID Source和String值并键入新的值。不能直接修改ID Value域中所显示的内容,而应由串编辑器根据在ID Source域中键入的内容来对它更新。
恢复被修改的串值可以利用Undo和Redo特性来恢复被修改了的串值。选择Edit|Undo或按Alt+BkSp以取消所做修改。如果取消了过多的修改操作,选择Edit|Redo或按Shift+Alt+BkSp以重做被取消的修改操作。
删除串为删除一个串,先选择该串再选择Edit|Cut或String|Delete Stringtable Item。1
编辑串表的资源脚本除了编辑串表中的串之外,还可以利用文本编辑器来编辑资源脚本的串。
编辑串表的资源脚本的步骤如下:
(1)在工程窗口中选择该串表。
(2)选择Resource | Edit As Text。
此时将出现资源脚本文本,供编辑用。
修改串编辑一个串的步骤如下:
(1)找出准备编辑的串并对它做必要的修改。注意仅可修改出现在引号之间的正文。
(2)在编辑器的控制菜单框内按两次鼠标钮。
(3)在回答提示“Resource has changed.Compile?”时选择Yes。
Resource Workshop编辑所有的修改并将它们保存起来。如果出现语法错误,Resource Workshop便退回文本编辑器以改正错误。 ’
修改标识符对串入口项的另一个成分(即标识符)的修改要更复杂些,因为标识符可能还不存在,或者需要修改成一个新的整数值。如果在串编辑器中修改一个标识符,编辑器就会提示输入一个新值。然而,如果是在一个文本编辑器中对它进行修改的,就应该已将该标识符插入了一个适当的标识符文件中。如果还没有这样做,编译器就试图编译串表并返回这样的错误信息:“Expecting unsigned short integer.”。说明编译器试图解释该标识符名,但不能找到一个与之相关的标识符。
当然,总可以在ID Source域中插入标识符的实际整数值,但这样做的话就会使串表和程序的可读性和灵活性都受到影响。
如果编译器由于某个标识符不存在而找不到它,就可以按如下步骤来插入一个新的标识符:
(1)使工程窗口为活动窗口。
(2)选择Resource | Identifiers。
(3)选择New钮。
(4)在New|dentifier对话框中,输入新的标识符名和值。
(5)如果必要的话,滚动File列表直到找出希望将标识符存入其中的文件,选择它后再选OK。
(6)在工程窗口中选择Stringtable入口项,再一次选择Resource | Edit As Text。
(7)再在控制菜单框中按两次鼠标钮,然后选OK以重新编译。编译器找到该标识符并成功地完成编译。
可以看出,利用串编辑器来为串修改或增加标识符是很容易的。1
保存串表当做完所有的修改后应将它们保存起来,不要等待Resource Workshop在关闭工程时再提示。在创建一个新的串表资源时,Resource Workshop自动地在工程窗口的资源脚本中插入一个STRINGTABLE入口项。为保存串表,应该保存整个的工程。
为保存整个工程,选择File | Save Project。1
测试串表为测试串表,需要将资源脚本编译文件编译成一个可执行文件。然后,可以运行该可执行文件以观察各个串是否像所想象中的出现。1