Главная / FAQ по Builder'у / 144 При помещении текста в ClipBoard...

144 При помещении текста в ClipBoard, в приложениях Office XP -текст помещается в искажённом виде. Как этого избежать?



bool SendToClipboard(const String& S)
{
   HGLOBAL Data;
   void* DataPtr;
   TOSVersionInfo Version;
   int Size;
   Version.dwOSVersionInfoSize = sizeof(TOSVersionInfo);
   GetVersionEx(&Version);
   if (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) {
      Size = S.Length() * sizeof(WideChar) + 2;
      Clipboard() ->Open();
      try {
         Data = GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, Size);
         try {
            DataPtr = GlobalLock(Data);
            try {
               MultiByteToWideChar(CP_ACP, 0, S.c_str(), 
                                   S.Length(), (wchar_t*) DataPtr, Size);
               Clipboard() ->Clear();
               SetClipboardData(CF_UNICODETEXT, Data);
            }
            __finally
            {
               GlobalUnlock(Data);
            }
         }
         catch (...) {
            GlobalFree(Data);
         }
      }
      __finally
      {
         Clipboard() ->Close();
      }
   }
   else
      Clipboard() ->SetTextBuf(S.c_str());
   return true;
}

Pavel Pimenov
--- *Примечание от Victor Kazakov: Функция полезная, но имхо лучше добавить необязательный параметр - кодировку посылаемой строки. А то при нерусских локалях имеем крякозяблы :-). Лучше добавить параметр в функцию: bool SendToClipboard(const String& S, UINT CodePage = CP_ACP) ... MultiByteToWideChar(CodePage, ... Тогда, вызывая SendToClipboard( MyString, 1251), можно быть уверенным, что в офисе будут вставлены именно русские буквы, независимо от настроек системы пользователя. Кстати, в VCL класс TFont имеет свойство Charset, которое для русской кодовой страницы принимает значение 204. Как из 204 получить 1251 ? В идеальном случае пользователь выбирает параметры шрифта интерфейса, а программа должна сама определять кодовую страницу и вызывать SentToClipboard с соответствующим параметром.

Предыдущий вопрос   |  Список вопросов   |   Следующий вопрос

источник      На главную      by jenyok
Copyright © 2003 JTSOFT
Сайт управляется системой uCoz