概述
串表(string table)是一個存放應用程序要顯示的錯誤信息、提示或任何其他文本串的表。可以在工程文件中存放多個串表。一般地,可以為程序的每個邏輯組定義一個獨立的串表。例如,可以設計與所有由File菜單中的命令調用的菜單相關的串。
將文本串定義為獨立的資源就可以很方便地在不修改源代碼的情況下編輯文本。例如,如果需要將某一Windows程序的界面翻譯成外語,那么將大部分文本放在串表中就可以簡化這個過程。(但仍需要翻譯其他資源如對話框中的文本。)
當處理串表時,要執(zhí)行的四項主要任務是:
·啟動串編輯器
·創(chuàng)建并編輯串表
·保存串表
·測試串表1
啟動串編輯器如何啟動串編輯器與是要創(chuàng)建一個新的串表還是要編輯一個已經(jīng)存在的串表有關。
啟動串編輯器以創(chuàng)建一個新的串表的步驟如下:
(1)打開希望將串表加入其中的工程。
(2)選擇Resource |New。
(3)在New Resource對話框中,在Resource Type列表框中選擇STRINGTABLE后再選擇OK。
Resource Workshop打開串編輯器并在工程窗口中放入一個對新串表敝引用。
啟動串編輯器以編輯一個已經(jīng)存在的串表的步驟如下:
(1)打開包含希望編輯的串表的工程。
(2)在工程窗口中找出該串表。
(3)在該串表入口項上按兩次鼠標鈕,或者先選擇它再選擇Resource|Edit。
所選擇的串表就會出現(xiàn)在串編輯器中。
處理串表當打開串編輯器時就出現(xiàn)一個串表。如果剛剛創(chuàng)建了一個新串表,則不會見到任何串入口項,因為還沒有輸入任何串表。如果正在編輯一個已經(jīng)存在的串表,那么就將見到與圖差不多的串入口項。
每個串表入口項都要有一個ID Source,一個ID Value,以及串本身。
串表中的每個串都必須有一個唯一的整數(shù)ID。Windows將所有的串分成若干段,每段包含16個串。ID為0到15的串構成第一個段,ID為16至31的串構成第二個段,等等。當在編譯資源時,各個串是按段來加入到可執(zhí)行文件中的。在運行時刻,這些段被裝入內存。
當應用程序需要某個特定的串時,Windows就將包含該串的整個串段裝入內存。了解了Windows如何處理串就能仔細設計串ID的賦值,以節(jié)約內存空間。
假設要為應用程序定義32個串。如果將從0到31的ID賦給這些串,則需向可執(zhí)行文件中加入兩個段。每當應用程序需要一個串時就有16個串被裝入內存,其中的一些可能是不需要的。
一種更好的辦法是對所有的串進行邏輯分組。例如,如應用程序的一個部分需要五個串,將它們編號為0到4。如果應用程序的第二部分需要九個串,則將它們編號為16至24,將它們放在第二個段中。這樣Windows就可以將相關的串一起裝入,而不會裝入其他不需要的串。雖然全部的段仍將被裝入,但每個未用的ID僅占用一個字節(jié)的內存。所以,如果五個串放在一個段中,其他未用的ID僅占用11個字節(jié)的內存。如果被裝入的段包含11個未用的串,則使用的空間就要多很多。
當指定一個唯一的串ID時,可以使用一個整數(shù)或一個字母數(shù)字標識符(即C或C++中的#define,或Pascal中的常量說明),后者代表一個整數(shù)。如果選用字母數(shù)字標識符以使得串ID更容易記憶,就很可能希望將標識符存放在一個標識符文件中(對C和C++來說是個頭文件,對Pasesl來說是個單元文件或包含文件)。要確保當在串編輯器內保存標識符時這些文件中的一個是存在的。1
加人新串注意串編輯器頭部的標題:
一個ID Source包含與該串相關的一個整數(shù)。如果將一個標識符賦為該ID,它就在這兒出現(xiàn)。否則,將看到整數(shù)ID。
一個ID Value總是包含該串的整數(shù)ID。
一個String是一個文本串。它在串表中存儲為一個Pascal串;亦即,在該串的文本之前有一個字節(jié)指示該串的長度。一個串可包含255個文本字符。
欲向串表中插入一個新串,如果這個表是個新表,則可按下面的步驟為該串輸入信息,如第3,4,5步中所描述的那樣;如果打算將一個串加入一張表,則從第1步開始。
(1)選擇希望加入新串處的上一行中的串。
(2)按Ins或選擇Stringtable|New Item。
(3)鍵入該串的一個ID Source或接受串編輯器寫入這個域的數(shù)字。基于鍵入的ID Source,串編輯器找出ID Value的適當整數(shù)值(為將ID Source恢復至原始設置,在按Tab或 Enter之前按Esc)。
可以鍵入一個整數(shù)或一個代表整數(shù)的字母數(shù)字標識符。如果鍵入了一個不代表整數(shù)的字母數(shù)字標識符,則串編輯器就在按Enter或選擇一條菜單時提示創(chuàng)建一個新的標識符。
創(chuàng)建一個新的標識符的步驟如下:
a.選擇Yes。New Identifier對話框出現(xiàn)。
b.為標識符鍵入一個新值并指定將它存儲在何處。選擇OK。
(4)按Tab或在String之下的框中按鼠標鈕并鍵入文本串。
每個串最長可達255個字符,并可以包含任何C一類型的escape轉義序列,包括\n(換行),\t(制表),\r(回車),\\(反斜杠),\”(雙引號)。
當Resource Workshop編輯器在一個串入口項中遇到一個C類型轉義序列時,它就在目標代碼中產(chǎn)生相應的ASCII 十六進制值,并由程序負責正確地解釋該值。例如,當編譯器分析\b\040\x7F時,它就產(chǎn)生十六進制序列07207F。代碼可能將這一序列解釋為ASCII字符BEL,SPC和DEL,或者它可以給這些十六進制值賦予另外的意義:
(5)按Enter(接受新值)或Ins(接受并插入一個新值)。1
編輯已經(jīng)存在的串利用串編輯器可以很方便地修改每個串。為用鼠標來選擇一個串,在希望編輯的串上按一下鼠標鈕即可。若是利用鍵盤,則按Tab,↑,或↓以在表中移動。將光標定位于希望編輯的串上。
修改串可以刪除任何串的ID Source和String值并鍵入新的值。不能直接修改ID Value域中所顯示的內容,而應由串編輯器根據(jù)在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。
此時將出現(xiàn)資源腳本文本,供編輯用。
修改串編輯一個串的步驟如下:
(1)找出準備編輯的串并對它做必要的修改。注意僅可修改出現(xiàn)在引號之間的正文。
(2)在編輯器的控制菜單框內按兩次鼠標鈕。
(3)在回答提示“Resource has changed.Compile?”時選擇Yes。
Resource Workshop編輯所有的修改并將它們保存起來。如果出現(xiàn)語法錯誤,Resource Workshop便退回文本編輯器以改正錯誤。 ’
修改標識符對串入口項的另一個成分(即標識符)的修改要更復雜些,因為標識符可能還不存在,或者需要修改成一個新的整數(shù)值。如果在串編輯器中修改一個標識符,編輯器就會提示輸入一個新值。然而,如果是在一個文本編輯器中對它進行修改的,就應該已將該標識符插入了一個適當?shù)臉俗R符文件中。如果還沒有這樣做,編譯器就試圖編譯串表并返回這樣的錯誤信息:“Expecting unsigned short integer.”。說明編譯器試圖解釋該標識符名,但不能找到一個與之相關的標識符。
當然,總可以在ID Source域中插入標識符的實際整數(shù)值,但這樣做的話就會使串表和程序的可讀性和靈活性都受到影響。
如果編譯器由于某個標識符不存在而找不到它,就可以按如下步驟來插入一個新的標識符:
(1)使工程窗口為活動窗口。
(2)選擇Resource | Identifiers。
(3)選擇New鈕。
(4)在New|dentifier對話框中,輸入新的標識符名和值。
(5)如果必要的話,滾動File列表直到找出希望將標識符存入其中的文件,選擇它后再選OK。
(6)在工程窗口中選擇Stringtable入口項,再一次選擇Resource | Edit As Text。
(7)再在控制菜單框中按兩次鼠標鈕,然后選OK以重新編譯。編譯器找到該標識符并成功地完成編譯。
可以看出,利用串編輯器來為串修改或增加標識符是很容易的。1
保存串表當做完所有的修改后應將它們保存起來,不要等待Resource Workshop在關閉工程時再提示。在創(chuàng)建一個新的串表資源時,Resource Workshop自動地在工程窗口的資源腳本中插入一個STRINGTABLE入口項。為保存串表,應該保存整個的工程。
為保存整個工程,選擇File | Save Project。1
測試串表為測試串表,需要將資源腳本編譯文件編譯成一個可執(zhí)行文件。然后,可以運行該可執(zhí)行文件以觀察各個串是否像所想象中的出現(xiàn)。1