2009-05-27 70 views
1

這是我在2009年德爾福工作的代碼嗎?它只是最終拋出一個堆錯誤SetAsHandle。 如果我改變它使用AnsiString類型按原來,即如何將RTF字符串複製到delphi 2009中的剪貼板?

procedure RTFtoClipboard(txt: string; rtf: AnsiString); 

Data := GlobalAlloc(GHND or GMEM_SHARE, Length(rtf)*SizeOf(AnsiChar) + 1); 

那麼有沒有錯誤,但剪貼板是空的。

全碼:

unit uClipbrd; 

interface 

procedure RTFtoClipboard(txt: string; rtf: string); 

implementation 

uses 
    Clipbrd, Windows, SysUtils, uStdDialogs; 
VAR 
    CF_RTF : Word = 0; 

//------------------------------------------------------------------------------ 
procedure RTFtoClipboard(txt: string; rtf: string); 
var 
    Data: Cardinal; 
begin 
    with Clipboard do 
    begin 
    Data := GlobalAlloc(GHND or GMEM_SHARE, Length(rtf)*SizeOf(Char) + 1); 
    if Data <> 0 then 
     try 
     StrPCopy(GlobalLock(Data), rtf); 
     GlobalUnlock(Data); 
     Open; 
     try 
      AsText := txt; 
      SetAsHandle(CF_RTF, Data); 
     finally 
      Close; 
     end; 
     except 
     GlobalFree(Data); 
     ErrorDlg('Unable to copy the selected RTF text'); 
     end 
    else 
     ErrorDlg('Global Alloc failed during Copy to Clipboard!'); 
    end; 
end; 

initialization 
    CF_RTF := RegisterClipboardFormat('Rich Text Format'); 
    if CF_RTF = 0 then 
    raise Exception.Create('Unable to register the Rich Text clipboard format!'); 
end. 

回答

0

引述Wikipedia

RTF是一個8位格式。這會將其限制爲ASCII,但RTF可以通過轉義序列對超出ASCII的字符進行編碼。字符轉義有兩種類型:代碼頁轉義和Unicode轉義。在代碼頁轉義中,撇號後面的兩個十六進制數字用於表示從Windows代碼頁取得的字符。例如,如果存在指定Windows-1256的控制代碼,序列\'c8將編碼阿拉伯字母beh(ب)。

如果需要Unicode轉義,則使用控制字\ u,後跟一個16位帶符號的十進制整數,以提供Unicode碼點編號。爲了沒有Unicode支持的程序的好處,這必須在指定的代碼頁中最接近這個字符的表示。例如,\ u1576?會給阿拉伯文字母beh,指定那些沒有Unicode支持的舊程序應該把它作爲問號來代替。

因此,您使用AnsiString的想法很好,但您也需要用Unicode轉義替換所有不是ASCII的字符,也不是當前Ansi Windows代碼頁的一部分。理想情況下,這應該是另一個功能。將數據寫入剪貼板的代碼可以保持不變,只需使用Ansi字符串類型即可。

+0

不幸的是,我確實嘗試過。在我的字符串中沒有特殊的Unicode字符,只是碰巧使用了Delphi的新字符串類型,因此也是我的問題。我已經更新了該問題,以顯示您提出的替代方案。 – 2009-05-27 20:42:07

相關問題