Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Операции с Clipboard и крякозябры при Paste, Проблема с code page работе 
V
    Опции темы
gAlexKo
Дата 9.9.2012, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Задача: Есть прога обработки текста в её TRichEdit. Если напечатать в TRichEdit слова по русски, скопировать их в Clipboard и затем Paste например в любой текстовый редактор, то все ОК.

Но если _загрузить_ русский текст в TRichEdit и обработать его _автоматически_ (или просто не нажимать клавиш ввода текста), то после Paste в MSWord там будет крякозябры - редактор криво воспримет русский текст из Clipbord.

Прикол - если перед помещением текста в Clipboard нажать хоть одну русскую букву, то Clipboard сработает нормально и поместит в MDWORD русский текст.

Что делать? Для работы этой программы не всегда нужно жать русские буквы, а рекомендация этого шаманства как выход из положения некузяво.

 CBuilder 5.0, Windows XP SP2/3
PM MAIL   Вверх
Данкинг
Дата 9.9.2012, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



А если перед копированием принудительно активировать русскую раскладку?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
gAlexKo
Дата 10.9.2012, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Цитата(Данкинг @ 9.9.2012,  14:37)
А если перед копированием принудительно активировать русскую раскладку?

Да, это выход. Никак не думал, что проблема связана именно с включеннием русского регистра. По идее это не должно быть связано с клипбордоским копированием. Потестил на этом:


void __fastcall Tblf::bt_qt_all_to_clipboardClick(TObject *Sender)
{
char lname[100]; bool restore = false;
  GetKeyboardLayoutName(lname);
  if(AnsiString(lname) == AnsiString("00000409"))
    {
     LoadKeyboardLayout("00000419", KLF_ACTIVATE);  //rus
     restore = true;
    }
     RichEditAll2Clipboard(re_quoter);
     re_quoter->SetFocus();
  if(restore)
     LoadKeyboardLayout("00000409", KLF_ACTIVATE); //eng
}

Это сообщение отредактировал(а) gAlexKo - 10.9.2012, 21:06
PM MAIL   Вверх
artsb
Дата 11.9.2012, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(gAlexKo @  10.9.2012,  21:05 Найти цитируемый пост)
Да, это выход.

Я, конечно, подсказать ничего не могу. Но, ИМХО, это кривой выход. А если нет русской раскладки? Что тогда? Не будет работать...


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 11.9.2012, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



А вот и ответ нашёлся. Viktor Kushnir:
Цитата

Я в свое время тоже столкнулся с такой проблемой. Дело в том, что при установке IE версии 5 и выше, он заменяет Riched20.dll и riched32.dll а компаненты к Дельфе наверное со времен 4-ой не переписаны...

Решение: Найти эти DLL от WIN98+IE4 и постовлять вместе со своей прогой. Просто скопировать их в папку с прогой и не каких вопросов. Проверено на RxRichEdit.

Можно попробовать так:
Код

    // запоминаем текущую позицию курсора
    int i = RichEdit1->SelStart;
    /*
        Выделяем весь текст.

        Если вам нужно выделить только часть текста, то используйте
        RichEdit1->SelStart и RichEdit1->SelLength
    */
    RichEdit1->SelectAll();
    // копируем к буфер
    RichEdit1->CopyToClipboard();
    // восстанавливаем позицию курсора
    RichEdit1->SelStart = i;
    RichEdit1->SelLength = 0;



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
gAlexKo
Дата 11.9.2012, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Цитата(artsb @ 11.9.2012,  07:46)
Цитата(gAlexKo @  10.9.2012,  21:05 Найти цитируемый пост)
Да, это выход.

Я, конечно, подсказать ничего не могу. Но, ИМХО, это кривой выход. А если нет русской раскладки? Что тогда? Не будет работать...


Если русскую раскладку установить нельзя, то функция 
LoadKeyboardLayout("00000419", KLF_ACTIVATE);  //rus
просто вернет NULL и как бы ничего не произойдет - как была допустим английская раскладка так и будет.

Однако, если в винде вообще нет русской раскладки (винда вообще не руссифицирована), то на ней даже русский текст нельзя смотреть. А следовательно не возникнет задачи его копипастить.

Это сообщение отредактировал(а) gAlexKo - 11.9.2012, 17:14
PM MAIL   Вверх
artsb
Дата 11.9.2012, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(gAlexKo @  11.9.2012,  16:39 Найти цитируемый пост)
Если русскую раскладку установить нельзя, то функция 
LoadKeyboardLayout("00000419", KLF_ACTIVATE);  //rus
просто вернет NULL и как бы ничего не произойдет - как была допустим английская раскладка так и будет.

Однако, если в винде вообще нет русской раскладки (винда вообще не руссифицирована), то на ней даже русский текст нельзя смотреть. А следовательно не возникнет задачи его копипастить.

Это всё хорошо. Но если программой захочет воспользоваться китаец. Русского то там не будет, а вот китайский - будет. И проблема останется.

Это сообщение отредактировал(а) artsb - 11.9.2012, 18:11


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
gAlexKo
Дата 12.9.2012, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Цитата(artsb @ 11.9.2012,  18:10)
Цитата(gAlexKo @  11.9.2012,  16:39 Найти цитируемый пост)
Если русскую раскладку установить нельзя, то функция 
LoadKeyboardLayout("00000419", KLF_ACTIVATE);  //rus
просто вернет NULL и как бы ничего не произойдет - как была допустим английская раскладка так и будет.

Однако, если в винде вообще нет русской раскладки (винда вообще не руссифицирована), то на ней даже русский текст нельзя смотреть. А следовательно не возникнет задачи его копипастить.

Это всё хорошо. Но если программой захочет воспользоваться китаец. Русского то там не будет, а вот китайский - будет. И проблема останется.

Эта програ двуязычная - англо-русская. ;)
PM MAIL   Вверх
artsb
Дата 12.9.2012, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(gAlexKo @  12.9.2012,  19:28 Найти цитируемый пост)
Эта програ двуязычная - англо-русская. ;) 

Ясно. Но всё равно, это не очень хороший подход. Лучше делать так, чтобы потом было меньше исправлять.
Вы проверили код, который я вам дал?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Usper
Дата 14.9.2012, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: 15
Всего: 15



 smile Говорят, что Китай - страна с самым большим числом жителей, говорящих на английском языке, в мире. smile Вдруг англоговорящему китайцу понадобится скопировать пару иероглифов в ворд  smile.


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Данкинг
Дата 14.9.2012, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(artsb @  11.9.2012,  19:10 Найти цитируемый пост)
Но если программой захочет воспользоваться китаец.

Если захотеть намеренно вызвать ошибку в какой бы то ни было проге - то это обязательно получится. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
artsb
Дата 14.9.2012, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Да, давайте ребята, поощряйте развитие популяции аболтусов ))


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
gAlexKo
Дата 14.9.2012, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Цитата(artsb @ 12.9.2012,  20:17)
Цитата(gAlexKo @  12.9.2012,  19:28 Найти цитируемый пост)
Эта програ двуязычная - англо-русская. ;) 

Ясно. Но всё равно, это не очень хороший подход. Лучше делать так, чтобы потом было меньше исправлять.
Вы проверили код, который я вам дал?

Лучшее это враг хорошего.  А я философ. ;-)

PM MAIL   Вверх
artsb
Дата 14.9.2012, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(gAlexKo @  14.9.2012,  16:42 Найти цитируемый пост)
Лучшее это враг хорошего.  А я философ. ;-)

Ну мне то что? Как хотите. Вам же потом исправлять и доделывать )


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
gAlexKo
Дата 15.9.2012, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Цитата(artsb @ 14.9.2012,  19:43)
Цитата(gAlexKo @  14.9.2012,  16:42 Найти цитируемый пост)
Лучшее это враг хорошего.  А я философ. ;-)

Ну мне то что? Как хотите. Вам же потом исправлять и доделывать )

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

По мере добавления языка (чего не будет) можно без проблем добавить в приведенной мной функции новое условие.
 if(AnsiString(lname) == AnsiString("00000409"))
    {
     LoadKeyboardLayout("xCodePage", KLF_ACTIVATE);  //xCodePage
     restore = true;
    }
это капля в море в общем объеме прироста кода.  И кстати непонятно - это почему это старый rich edit не будет ключить при копипасте тем же самым образом, что я описывал. Он что, лучше написан?


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1401 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.