2009-05-27 5 views
1

Вот мой код, который работал в Delphi до 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 с помощью escape-последовательностей. Выражения символов имеют два типа: экранирование экранов страницы и экранирование Unicode. В escape-последовательности кода две шестнадцатеричные цифры после апострофа используются для обозначения символа, взятого с кодовой страницы Windows. Например, если присутствуют управляющие коды, определяющие Windows-1256, последовательность \ c8 будет кодировать арабский символ букв (ب).

Если требуется escape-код Unicode, используется слово управления \ u, за которым следует 16-разрядное знаковое десятичное целое число, указывающее номер кода Unicode. Для программ без поддержки Unicode это должно сопровождаться ближайшим представлением этого символа на указанной кодовой странице. Например, \ u1576? даст арабский буквенный характер, указав, что более старые программы, не поддерживающие Unicode, должны сделать это как знак вопроса.

Так что ваша идея использования AnsiString хорошо, но вы также должны заменить все символы, которые не являются ASCII и не являются частью текущей кодовой страницы Анси Windows, с Unicode ускользает. В идеале это должна быть другая функция. Ваш код для записи данных в буфер обмена может оставаться неизменным, с единственным изменением для использования типа строки Ansi.

+0

К сожалению, я попробовал это. В моей строке нет однозначно символов юникода, просто происходит использование нового типа String в Delphi и, следовательно, моя проблема. Я обновил проблему, чтобы показать альтернативу, которую вы предложили. –

+0

Хорошо, буфер обмена не пуст, программа, которую я вставлял, была глючной. Вставляет в Word штраф. Но это должен быть AnsiString –

Смежные вопросы