電子病歷文本編輯器中文字?jǐn)嘈屑芭虐嫠惴ㄑ芯?/h1>
分頁(yè)
分頁(yè)本質(zhì)上說(shuō)就是計(jì)算分頁(yè)線的位置。其過(guò)程如下:
1.首先計(jì)算出標(biāo)準(zhǔn)頁(yè)的高度,也就是紙張高度減去上下頁(yè)邊距的值,還需要考慮到頁(yè)眉頁(yè)腳的修正量。
2.設(shè)置當(dāng)前分頁(yè)線的位置,也就是上一個(gè)分頁(yè)線的位置加上標(biāo)準(zhǔn)頁(yè)高。
3.遍歷文檔行,若分頁(yè)線的位置在文檔行中間,說(shuō)明該行文字被分割到兩頁(yè)中,此時(shí)將分頁(yè)線的位置向上移動(dòng),使得分頁(yè)線在當(dāng)前文檔行的上邊緣和上一個(gè)文檔行下邊緣的中間。
4.如此循環(huán),使得所有的文檔頁(yè)的高度和大于等于文檔的內(nèi)容高度。
在進(jìn)行分頁(yè)時(shí),也需要判斷很多邊界條件,比如當(dāng)某個(gè)文檔行非常高,比如中間放置了一個(gè)超高的圖片,使得這個(gè)文檔行的高度大于標(biāo)準(zhǔn)頁(yè)高,此時(shí)就不能隨便移動(dòng)分頁(yè)線的位置了。
另外當(dāng)文檔中有表格時(shí),則需要深入到表格單元格內(nèi)部進(jìn)行修正分頁(yè)線位置的操作,這是一種遞歸操作。
在電子病歷業(yè)務(wù)中有著繼續(xù)打印的功能,在筆者的實(shí)現(xiàn)中,續(xù)打位置實(shí)際上就算是一種特殊的分頁(yè)線,這樣就能避免在續(xù)打時(shí)文字被分割打印的情況。
文字?jǐn)嘈泻团虐嫠惴ㄊ欠浅?fù)雜的,即使筆者經(jīng)過(guò)長(zhǎng)期的重構(gòu)再重構(gòu),優(yōu)化再優(yōu)化,也還是花費(fèi)了一萬(wàn)多行的C#代碼來(lái)實(shí)現(xiàn)這個(gè)功能,而且還有不少地方仍然需要優(yōu)化。
一些人認(rèn)為C#無(wú)法開(kāi)發(fā)高性能的程序,編輯器這樣程序應(yīng)該需要用C++開(kāi)發(fā)。筆者經(jīng)過(guò)實(shí)踐認(rèn)為,所謂C#性能不高的說(shuō)法是不對(duì)的,關(guān)鍵還是算法。C#程序只是啟動(dòng)有些慢,運(yùn)行起來(lái)后仍然可以達(dá)到很高的性能。