Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > В мемо отображется ????? вместо слов


Автор: RinOSpro 5.11.2007, 20:56
Когда в мемо копируют из блокнота вместо букв одни ????????????? вопросы? Что это такое? И как это исправить?

Автор: Bose 5.11.2007, 21:09
Цитата(RinOSpro @  5.11.2007,  20:56 Найти цитируемый пост)
Когда в мемо копируют из блокнота вместо букв одни ????????????? вопросы? Что это такое? И как это исправить?

Это ошибка. =)

Это с любыми языками происходит? 


п.с. здесь не раз обсуждалась похожая проблема: лечилась она путём смены языка для ввода перед копированием. Т.е. если надо скопировать русский текст, то достаточно перед копированием изменить язык для ввода(Ctrl+Shift) на русский - как проблема изчезает. Это оно?

Автор: Alexeis 5.11.2007, 21:12
Или использовать юникодные контролы, который пока что нет в делфях  smile 

Автор: RinOSpro 5.11.2007, 21:56
Нет у меня нормально. Я дал другу прогу. Он говорит типа копирует из блокнота в мемо ctrl-c ctrl-v и вот такие закарючки. У меня все норм. Я както давно слышал что вроде в реестр чтото надо добавить. Только что и куда хз.

Автор: Alexeis 5.11.2007, 23:57
RinOSpro, не не поможет тут реестр. Винда должна знать при помощи какой кодовой таблицы юникод в анси перекодировать. Где-то тут я показывал решение проблемы с ручным извлечением из буфера текста.

Автор: RinOSpro 7.11.2007, 00:00
Цитата(Alexeis @  5.11.2007,  23:57 Найти цитируемый пост)
Где-то тут я показывал решение проблемы с ручным извлечением из буфера текста. 

Дай пожалуста ссылочку не найду никак.

Добавлено через 10 минут и 15 секунд
Цитата(Bose @  5.11.2007,  21:09 Найти цитируемый пост)
п.с. здесь не раз обсуждалась похожая проблема: лечилась она путём смены языка для ввода перед копированием. Т.е. если надо скопировать русский текст, то достаточно перед копированием изменить язык для ввода(Ctrl+Shift) на русский - как проблема изчезает. Это оно? 

Да это оно. Только как это программно лечить?

Это случайно не то:
function GetKeyboardState(var KeyState: TKeyboardState): BOOL; stdcall;
function SetKeyboardState(var KeyState: TKeyboardState): BOOL; stdcall;

Автор: WaReZMEN 7.11.2007, 08:18
Проблема решается просто нужно в реестре в ключе HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\CodePage заменить с параметр 1251 по 1255 значение поставить c_1251.nls. Перезапустить комп и рабоватся smile 

Автор: Rennigth 7.11.2007, 15:19
гм... а 
Код

  SetThreadLocale(1049);

тут не поможет?

Добавлено через 49 секунд
http://forum.vingrad.ru/forum/topic-82093/hl/setthreadlocale/index.html

Автор: RinOSpro 7.11.2007, 15:49
Цитата(WaReZMEN @  7.11.2007,  08:18 Найти цитируемый пост)
Проблема решается просто нужно в реестре в ключе HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\CodePage заменить с параметр 1251 по 1255 значение поставить c_1251.nls. Перезапустить комп и рабоватся   

А никаких последствий не будет. Типа другие приложения начнут показывать ????  ?????? ????   ?????

Автор: Rennigth 7.11.2007, 16:05
RinOSpro, попробуй SetThreadLocale, все должно быть пучком smile Нефиг реестр корячить. smile

Автор: WaReZMEN 8.11.2007, 02:11
Rennigth, проблем не будет... более того я тебе скажу что это не тока с memo косяк такои получается но и фотошоп руские буквы не видет пока в реестре не подправиш...

Автор: Bose 8.11.2007, 13:24
Цитата(WaReZMEN @  8.11.2007,  02:11 Найти цитируемый пост)
Rennigth, проблем не будет... более того я тебе скажу что это не тока с memo косяк такои получается но и фотошоп руские буквы не видет пока в реестре не подправиш...

Ты не поверишь, но помимо русских кодовых страниц существует масса других. И именно их ты и похеришь своими правками в реестре.

Автор: Snowy 8.11.2007, 13:55
WaReZMEN, таким "мастерам" нужно руки отрывать.
После такого "исправления" в 98-х виндах не будет и ???. Вообще никаких знаков не будет.
В частности в том же фотошопе. Только пустота, вместо русских символов (и не только русских).
И во вторых, тебя пользователь просил менять ЕГО настройки системы?
Нужно подстраивать программу под систему, а не систему под свою программу.

Автор: Alix 8.11.2007, 14:40
Цитата(Snowy @  8.11.2007,  13:55 Найти цитируемый пост)
После такого "исправления" в 98-х виндах не будет и ???. Вообще никаких знаков не будет.
В частности в том же фотошопе. Только пустота, вместо русских символов (и не только русских).

Ты не прав. Для 5 и 6го фотошопа под 98 виндой это был реально рабочий метод добавить ему поддержку кириллицы при написании надписей (а, возможно, и названий слоев). Версии CS* (8-10) под XP никаких исправлений не требуют. 
В остальном я с тобой согласен.

Автор: Snowy 8.11.2007, 15:17
Цитата(Alix @  8.11.2007,  14:40 Найти цитируемый пост)
Ты не прав. Для 5 и 6го фотошопа под 98 виндой это был реально рабочий метод добавить ему поддержку кириллицы при написании надписей
Такой, да не этот.
В 9х файлы называются не c_1251.nls, а cp_1251.nls (или что-то в этом роде.)
Соответственно, указывая c_1251.nls мы указываем то, чего нет.
И получаем соответствующий эффект...
И как итог - угробим систему.
Откуда юзеру знать, что в таком-то месте реестра не хватает буквочки?
Ему придётся сносить винду и радостно в матерной форме благодарить автора программы.
Не знали об этом? Тогда мой вам совет - лучше не трогайте систему - не создадите проблем.
Пользователь вообще может не знать русского. А просто захотел запустить - посмотреть что там.
И после этого его немецкая винда будет оккупирована кирилицей. Вот радость то...

Автор: Alexeis 8.11.2007, 16:54
Вот тут есть тот метод http://forum.vingrad.ru/index.php?show_type=forum&showtopic=82093&st=30&hl=%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%B0#

Автор: Akella 8.11.2007, 21:27
WinXP + SP
D2007 + Upd3

re1 это TcxRichEdit, в котором находится русский текст
tlf2 типа string

Код

      if tlf2 <> '' then begin
        Grid1.DataController.append;
        Grid1.Columns[1].EditValue := tlf2;
        Grid1.Columns[4].EditValue :=  re1.lines[i];
        Grid1.DataController.post;
      end;


user posted image

Код

begin
  SetThreadLocale(1049);
  Application.Initialize;

Не помогает

Добавлено через 7 минут и 53 секунды
помогло это:
Цитата

HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage\1252 заменить c_1252.nls на c_1251.nls


всё-таки приходится подстраивать систему под программу :(

Автор: WaReZMEN 12.11.2007, 01:12
Наконецто бан сняли....

Цитата(Akella @  9.11.2007,  05:27 Найти цитируемый пост)
помогло это:

Цитата

HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage\1252 заменить c_1252.nls на c_1251.nls



всё-таки приходится подстраивать систему под программу :(


Вот вот...

А все начали кричать 
Цитата(Snowy @  8.11.2007,  21:55 Найти цитируемый пост)
WaReZMEN, таким "мастерам" нужно руки отрывать.


я просто дал совет как я с этим борюсь. Я не говорил что это панацея от всех бед... Но в результате правки в реестре ни разу за 5 лет касиков не видел... Если ему мои способ не понравится пусть не пользуется...  Я канечно согласен что систему под программу не стоит настраивать.... но иногда нужно...

Автор: aktuba 12.11.2007, 03:17
Цитата(Akella @  8.11.2007,  22:27 Найти цитируемый пост)
всё-таки приходится подстраивать систему под программу :(

А теперь попробуй, дай программу тому, у кого используется 1252-кодировка. Много нового о себе узнаешь  smile 

Цитата(WaReZMEN @  12.11.2007,  02:12 Найти цитируемый пост)
Но в результате правки в реестре ни разу за 5 лет касиков не видел...

А я видел. Когда за границей мою программу запустили. И скажу, что это очень не хорошо! Пишешь для себя и никаких проблем? Ок. Но не надо плохому учить других!!!

Автор: WaReZMEN 12.11.2007, 09:07
aktuba,  речи не было о том что на другом компе ему запускать.... он спросил про свои комп... И если ты за границу пишеш то нахрен на руском??? с Английскои кодировкокой то все ок. 

Автор: Akella 12.11.2007, 09:07
aktuba,  smile так предложи другой способ  smile 
 smile

Добавлено через 3 минуты и 38 секунд
WaReZMEN, программы в основном создаются НЕ для своего компа, но всё равно на др. компах, как правило установлены точно такие же ОСи.

Уважаемые, а может вернёмся к теме? Может всё-таки есть варианты для более старших версий Delphi, нежели 5-7

Добавлено через 3 минуты и 51 секунду
хотелось бы поиметь для 2007

Автор: WaReZMEN 12.11.2007, 09:17
Akella, Спасибо за поддержку. smile я тока этот способ знаю... срадостью узнаю еще какоинибудь...

Автор: MetalFan 12.11.2007, 09:36
афигенные проблемы будут у пользователя, если понадобится работать с кодовыми страницами, которые "добрые" программисты таким образом похерили. я уже столкнулся с такой проблемой.
Цитата(Alexeis @  5.11.2007,  23:57 Найти цитируемый пост)
решение проблемы с ручным извлечением из буфера текста

самый не травмирующий ОС вариант

Автор: Alexeis 12.11.2007, 11:49
Цитата(MetalFan @  12.11.2007,  09:36 Найти цитируемый пост)
афигенные проблемы будут у пользователя, если понадобится работать с кодовыми страницами, которые "добрые" программисты таким образом похерили. я уже столкнулся с такой проблемой.

  Я тоже, у меня были проблемы с румынским языком. 

Ручное извлечение совсем не изящное :( , но работает. Изящно только на KOL с использованием юникодных контролов.

Автор: aktuba 12.11.2007, 12:52
Цитата(WaReZMEN @  12.11.2007,  10:07 Найти цитируемый пост)
aktuba,  речи не было о том что на другом компе ему запускать.... он спросил про свои комп... И если ты за границу пишеш то нахрен на руском??? с Английскои кодировкокой то все ок.  


Цитата(RinOSpro @  5.11.2007,  22:56 Найти цитируемый пост)
Нет у меня нормально. Я дал другу прогу. Он говорит типа копирует из блокнота в мемо ctrl-c ctrl-v и вот такие закарючки.


Может все-таки начнем читать другие посты в топе тоже? Этот всего лишь 4-й... А насчет за границу по-русски... Видишь ли, и за рубежом иногда живут русские ;)

Цитата(Akella @  12.11.2007,  10:07 Найти цитируемый пост)
aktuba,  smile так предложи другой способ  smile 


Цитата(Alexeis @  6.11.2007,  00:57 Найти цитируемый пост)
решение проблемы с ручным извлечением из буфера текста. 


Вроде как дали уже хороший способ ;) Еще один способ - использовать юникодные контролы. Хватит?

Цитата(MetalFan @  12.11.2007,  10:36 Найти цитируемый пост)
я уже столкнулся с такой проблемой.


Аналогично. 
AkellaWaReZMEN, из 11 человек, которые отписали в этом топе - 3 сталкивались с проблемой после правки реестра. 3/11 = 27%, как мне кажеться весомый аргумент против данного способа.

Автор: Akella 12.11.2007, 21:44
я согласен, что весомые, а также согласен, что нехорошо менять 1252 на 1251  smile 
Но программа (снимок см. выше) работает со сравнительно большими объемами текстов, как минимум 5 метров в каждом файле. А файлов нужно обработать около 4-5 за одно утро. Файл нужно загрузить в мемо, потом пробежаться по всем строкам мемо и нужные выдернуть в нижнюю таблицу. Поэтому оперирование данными через буфер замедлит работы программы ещё больше.

Автор: WaReZMEN 13.11.2007, 01:20
Народ ну скажите деиствующий способ!!!! не меняя 1252 на 1251.

Автор: Alexeis 13.11.2007, 02:10
Akella, то что у тебя это просто глюк какой-то. Может в мемо просто чарсет не руский стоит и все.

Автор: WaReZMEN 13.11.2007, 04:30
У меня такои косят был не только когда в мемо вставляеш... но и просто в редактор кода на Дельфе...

Автор: aktuba 13.11.2007, 05:10
Цитата(WaReZMEN @  13.11.2007,  02:20 Найти цитируемый пост)
Народ ну скажите деиствующий способ!!!! не меняя 1252 на 1251. 


Цитата(Alexeis @  12.11.2007,  12:49 Найти цитируемый пост)
учное извлечение совсем не изящное :( , но работает. 


Цитата(Alexeis @  12.11.2007,  12:49 Найти цитируемый пост)
Изящно только ... с использованием юникодных контролов. 


Автор: WaReZMEN 13.11.2007, 09:47
Не вы скажите как исправит чтоб showmessege не показывал "???? ??????????"

Автор: Alexeis 13.11.2007, 10:28
Цитата(WaReZMEN @  13.11.2007,  04:30 Найти цитируемый пост)
У меня такои косят был не только когда в мемо вставляеш... но и просто в редактор кода на Дельфе...

  Можно до посинения вопить, но такие проблемы по-любому будут для контролов созданных при помощи функции CreateWindowA/CreateWindowExA и в делфи и вижаулке шестой и во многих других мемах. в системах NT анси строки приводятся к юникоду, а при получении от них результата (если это функции оканчивающиеся а "А") происходить обратное преобразование Юникод -> Анси, вот тут то и происходят все проблемы, поскольку в юникоде букав многа а в анси мало, потому как их интерпретировать зависит от чарсета. Чарсет определяет какой же символ будет у символа с данным кодом. 
  1) При работе с буфером обмена чарсет определяется текущим языком.
  2) В мемо и др. компонентах чарсет можно установить (свойство Font). Если чарсет не верный, то вместо русских символов будут символы другой кодировкой. Если в системе нет такого РУССКОГО шрифта, то винде рисовать будет нечего, в лучшем случае она попытается заменить его другим кирилистическим шрифтом, но не всегда. SetThreadLocale устанавливает дефолтную локаль для преобразования юникод -> Анси, это тоже что и установка в реестре.
  3) ShowMessage это тоже VCL форма, т.е. Windows окно, потому решение см. 2

Автор: Snowy 13.11.2007, 12:45
Цитата(WaReZMEN @  13.11.2007,  09:47 Найти цитируемый пост)
Не вы скажите как исправит чтоб showmessege не показывал "???? ??????????"
Код

MessageBoxW(Handle, 'Привет!', 'Это мессадж', 0);

Автор: Akella 14.11.2007, 09:15
Цитата(Alexeis @  13.11.2007,  02:10 Найти цитируемый пост)
Akella, то что у тебя это просто глюк какой-то. Может в мемо просто чарсет не руский стоит и все. 

RUSSIAN_CHARSET

Добавлено через 3 минуты и 24 секунды
Цитата(Alexeis @  13.11.2007,  10:28 Найти цитируемый пост)
1) При работе с буфером обмена чарсет определяется текущим языком.

а я не работаю с буфером обмена

Добавлено через 5 минут и 49 секунд
Значит такая идея возникла:
1. вначале работы процедуры запоминаем язык
2. переключаемся на русский программно
3. выполняем процедуру
4. переключаемся обратно

Недостаток: если нет русского, могут будут проблемы, может быть даже AV из-за того, что нет русского.

У кого-нибудь ещё есть предложения?

Добавлено через 6 минут и 29 секунд
Цитата(Alexeis @  13.11.2007,  10:28 Найти цитируемый пост)
 2) В мемо и др. компонентах чарсет можно установить (свойство Font).

так установлено ещё в дизайнере при проектировании приложенияч

Автор: Alexeis 14.11.2007, 10:18
Akella, попробуй шрифт сменить на какой-нибудь стандартный. 

Автор: Akella 14.11.2007, 10:28
у меня так получилось, используя http://www.cyberguru.ru/programming/win32/win32-keyboard-functions-page15.html

Код

Var
 Layout: array[0.. KL_NAMELENGTH] of char;

begin
  //как запомнить? не знаю, надеюсь другие помогут
  try
    //устанавливаем русский язык программно
    LoadKeyboardLayout(StrCopy(Layout,'00000419'),KLF_ACTIVATE);
   
    //что-то выполняем
  finally
    //восстанавливаем 
    LoadKeyboardLayout(StrCopy(Layout, вставить запомненный язык),KLF_ACTIVATE);  
  end;


Добавлено @ 10:37
т.е. по идее если даже нет в системе русского, то LoadKeyboardLayout загрузит и активирует, возможно что только для данного сеанса программы, а это именно то, что нам и нужно

так можно узнать http://www.delphisources.ru/pages/faq/base/keyboard_layouts.html

Автор: Rennigth 14.11.2007, 11:16
Цитата(Akella @  14.11.2007,  10:28 Найти цитируемый пост)
//как запомнить? не знаю, надеюсь другие помогут

http://msdn2.microsoft.com/ru-ru/library/ms646296.aspx

Автор: Akella 14.11.2007, 12:19
кстати сам шрифт, используемый в контроле тоже влияет, я вот вышеописанный пример попробовал с разными, нормально работает с Lucidia Console

Добавлено через 49 секунд
Rennigth,  smile  smile 

Автор: Rennigth 14.11.2007, 13:19
Цитата(Akella @  14.11.2007,  12:19 Найти цитируемый пост)
Rennigth,      

Как-то так:
Код

var
  Layout: array[0.. KL_NAMELENGTH] of char;
  lSaveLangID: DWORD;
begin
  lSaveLangID := GetKeyboardLayout(GetCurrentThreadId);
  try
    LoadKeyboardLayout(StrCopy(Layout,'00000419'),KLF_ACTIVATE);

  finally
    ActivateKeyboardLayout(lSaveLangID, 0);
  end;


Автор: Akella 18.11.2007, 16:08
Вот ещё пример вставки текста из буфера обмена. Очень похож на предыдущий.
Код

uses ClipBrd;
var
      CYR : PCHAR = '00000419';
      keys : array [0..99] of char;
begin
...
      GetKeyboardLayoutName(keys);
      LoadKeyboardLayout(CYR, KLF_ACTIVATE);
      Memo1.Text := Clipboard.AsText;
      LoadKeyboardLayout(keys, KLF_ACTIVATE);
...

Автор: Akella 21.11.2007, 11:05
при объявлении строковых типом можно ещё воспользоваться не String, а Widestring

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)