1

2009 年より前の Delphi で動作していた私のコードは次のとおりです。SetAsHandleでヒープエラーをスローするだけです。元のようにAnsiStringを使用するように変更すると、つまり

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.
4

1 に答える 1

0

ウィキペディアを引用するには:

RTFは8ビット形式です。これによりASCIIに制限されますが、RTFはエスケープシーケンスによってASCII以外の文字をエンコードできます。文字エスケープには、コードページエスケープとUnicodeエスケープの2種類があります。コードページエスケープでは、アポストロフィに続く2つの16進数が、Windowsコードページから取得された文字を示すために使用されます。たとえば、Windows-1256を指定する制御コードが存在する場合、シーケンス\'c8はアラビア文字のbeh(ب)をエンコードします。

Unicodeエスケープが必要な場合は、制御ワード\ uが使用され、その後にUnicodeコードポイント番号を示す16ビットの符号付き10進整数が続きます。Unicodeをサポートしていないプログラムの利益のために、これの後に、指定されたコードページでこの文字の最も近い表現を続ける必要があります。たとえば、\ u1576?Unicodeをサポートしていない古いプログラムは、代わりに疑問符としてレンダリングする必要があることを指定して、アラビア文字のbehを与えます。

したがって、AnsiStringを使用するという考えは適切ですが、ASCIIではなく、現在のAnsiWindowsコードページの一部ではないすべての文字をUnicodeエスケープに置き換える必要もあります。これは理想的には別の関数である必要があります。クリップボードにデータを書き込むためのコードは同じままで、Ansi文字列型を使用するように変更するだけです。

于 2009-05-27T20:10:39.127 に答える