
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
![]() |
|
|
Поиском по форуму поискал, нашёл только в одной теме поднятие этого вопроса, но решения там нет.
Для чистоты эксперимента делаю так: ![]() ![]() #include <clipbrd.hpp> void __fastcall TEST() { TClipboard *cb = new TClipboard; OpenClipboard(cb); cb->AsText = AnsiString("текст из буфера обмена"); SetClipboard(cb); CloseClipboard(); delete cb; } Далее вставляю это текст в простой блокнот... Вот результат:òåêñò èç áóôåðà îáìåíà Такой же результат при вставке в Word, PSPad и даже в окно любимого форума ![]() Ума не приложу почему так ... Кодировка должна, по-идее, быть Win1251 и вставляться в эти окна корректно... |
![]() |
Сообщ.
#2
,
|
|
К сожалению борландовцы ошиблись в реализации метода SetBuffer (который вызывается из SetText).
Там после непосредственной вставки (Adding) есть команда которая указывет на тип вставленный данных в буфер: ![]() ![]() SetClipboardData(Format, Data); где Format - CF_TEXT. Вот тут, сразу после этого, им следовало бы еще одну команду добавить на указание локали ![]() ![]() SetClipboardData(CF_LOCALE, Data); Поэтому мне в свое время пришлось полностью транслировать паскалевскую реализацию метода TClipboard.SetBuffer из файла clipbrd.pas добавив туда необходимую команду. |
Сообщ.
#3
,
|
|
|
Цитата Поэтому мне в свое время пришлось полностью транслировать паскалевскую реализацию метода TClipboard.SetBuffer Транслировать - это Вы перевели на С++? Не поделитесь результатом? ![]() |
![]() |
Сообщ.
#4
,
|
|
![]() ![]() 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; } |
Сообщ.
#5
,
|
|
|
Chow, огромное спасибо!!! Этой функцией чудно выполняется корректная в ставка в буфер
![]() Единственное что мне пришлось убрать в объявлении функции static и const... Ругалось как-то не очень информативно: Undefined symbol '_fastcall InsertIntoClipboard(const AnsiString &)' |