На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> установка кодировки в TClipboard , кодировка кривая
    Поиском по форуму поискал, нашёл только в одной теме поднятие этого вопроса, но решения там нет.
    Для чистоты эксперимента делаю так:
    ExpandedWrap disabled
      #include <clipbrd.hpp>
      void __fastcall TEST()
      {
       TClipboard *cb = new TClipboard;
       OpenClipboard(cb);
       cb->AsText = AnsiString("текст из буфера обмена");
       SetClipboard(cb);
       CloseClipboard();
       delete cb;
      }

    Далее вставляю это текст в простой блокнот... Вот результат:òåêñò èç áóôåðà îáìåíà
    Такой же результат при вставке в Word, PSPad и даже в окно любимого форума :)

    Ума не приложу почему так ... Кодировка должна, по-идее, быть Win1251 и вставляться в эти окна корректно...
      К сожалению борландовцы ошиблись в реализации метода SetBuffer (который вызывается из SetText).
      Там после непосредственной вставки (Adding) есть команда которая указывет на тип вставленный данных в буфер:
      ExpandedWrap disabled
        SetClipboardData(Format, Data);

      где Format - CF_TEXT.
      Вот тут, сразу после этого, им следовало бы еще одну команду добавить на указание локали
      ExpandedWrap disabled
        SetClipboardData(CF_LOCALE, Data);


      Поэтому мне в свое время пришлось полностью транслировать паскалевскую реализацию метода TClipboard.SetBuffer из файла clipbrd.pas добавив туда необходимую команду.
        Цитата
        Поэтому мне в свое время пришлось полностью транслировать паскалевскую реализацию метода TClipboard.SetBuffer

        Транслировать - это Вы перевели на С++? Не поделитесь результатом? :)
          ExpandedWrap disabled
            static bool __fastcall InsertIntoClipboard(const AnsiString& strData)
            {
              // open the system clipboard and delete all the data in it
              if (!OpenClipboard(NULL))
              {
                //ErrorMessage(LoadStr(S_CouldNotOpenClipboard));
                return false;
              }
              EmptyClipboard();
             
              //allocate memory in global heap for buffer
              HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, strData.Length() + 1);
              if (!hglbCopy)
              {
                CloseClipboard();
                //ErrorMessage(LoadStr(S_CouldNotAllocateMemory));
                return false;
              }
             
              //lock the memory object to guarantee that nobody can move or discard it
              LPTSTR lptstrCopy = (LPTSTR)GlobalLock(hglbCopy);
              if (!lptstrCopy)
              {
                CloseClipboard();
                GlobalFree(hglbCopy);
                //ErrorMessage(LoadStr(S_CouldNotLockMemory));
                return false;
              }
             
              // copy the buffer into locked memory object
              memcpy(lptstrCopy, strData.data(), strData.Length());
              lptstrCopy += strData.Length();
              *lptstrCopy = 0; // string null terminator
             
              //unlock the memory object
              GlobalUnlock(hglbCopy);
             
              //put the data into clipboard in text format
              HANDLE hClipData = SetClipboardData(CF_TEXT, hglbCopy);
              if (!hClipData)
              {
                CloseClipboard();
                GlobalFree(hglbCopy);
                //ErrorMessage(LoadStr(S_CouldNotWriteIntoClipboard));
                return false;
              }
             
              //set locale for text in the clipboard
              hClipData = SetClipboardData(CF_LOCALE, hglbCopy);
              if (!hClipData)
              {
                CloseClipboard();
                GlobalFree(hglbCopy);
                //ErrorMessage(LoadStr(S_CouldNotSetLocaleForData));
                return false;
              }
             
              //close the system clipboard
              CloseClipboard();
             
              return true;
            }
            Chow, огромное спасибо!!! Этой функцией чудно выполняется корректная в ставка в буфер :)
            Единственное что мне пришлось убрать в объявлении функции static и const... Ругалось как-то не очень информативно:
            Undefined symbol '_fastcall InsertIntoClipboard(const AnsiString &)'
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0729 ]   [ 15 queries used ]   [ Generated: 18.07.25, 00:21 GMT ]