2016-12-28 50 views
0

我試圖在符號對話框中將Microsoft Word中顯示的Wingdings字體中的符號打印爲字符代碼129至138(在圓圈中爲'1'至'10')和140到149(黑色圓圈中的白色'1'到'10'),但只有那些'1',白色'2',白色'4'&白色'5'正確顯示,其他符號出現在打印列表中覆蓋位置1至20顯示爲矩形。訪問Wingdings字體中的符號

下面的代碼按照Delphi 5和Rave Reports 4.0(pre-Unicode)的預期工作,但是按照Delphi 10.1和Rave 11.0.12的描述失敗;

with Sender as TBaseReport do 
begin 
     PushFont; 
     SetFont('Wingdings', 10); 
     FontCharSet := SYMBOL_CHARSET; 
     if NoteNo < 11 then 
     {0 - 10 = white (0) - (10).} 
     PrintTab(char(128 + NoteNo)) 
     else 
      if NoteNo < 21 then 
      {11 - 20 = black (1) - (10).} 
      PrintTab(char(128 + 1 + NoteNo)) 
      else 

我認爲現在是在Unicode的時代,我沒有通過正確的字符集步進,但由於我的一部分無知,我不知道我應該如何改變這種代碼,使得正確的符號訪問。

+0

一些閱讀: [德爾福統一人口遷移:來自前線的故事和建議](https://www.embarcadero.com/images/dm/technical-papers/delphi-unicode-migration.pdf)。 –

+0

謝謝。我將對此感興趣(並將其添加到我的收藏夾列表中,以備我需要再次參考)。 –

回答

1

從前期的Unicode遷移時,不知道有報告特殊性,但這個例子按預期工作在現代德爾福版本(顯示爲空矩形如果Char是用來代替AnsiChar

var 
    i: integer; 
begin 
    Canvas.Font.Name := 'Wingdings'; 
    Canvas.Font.Charset := SYMBOL_CHARSET; 
    for i := 128 to 128 + 21 do 
    Canvas.TextOut(0, 20 * (i - 128), AnsiChar(i)); 
+0

現貨!感謝您爲我的問題提供瞭如此快速和精確的解決方案。作品一種享受。 8 ^)始終學習... –

+0

我假設上面的代碼也應該有一個隱含的字符串轉換警告,因此它應該在西方(CP-1252)代碼頁上正常工作,但可能無法在其他人上工作。我強烈建議測試它 –

+0

我在1251檢查。我不知道'PrintTab'如何工作。 – MBo