Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы русского языка в проектах Delphi 6-9, Или вопрос о ??????????? 
:(
    Опции темы
Fedia
Дата 3.10.2006, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

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



Я разобрался. Спросил у более опытного коллеги на работе, он удивился, что я до сих пор не в курсе, как эта проблема устраняется, и рассказал мне вот что:
1. Запускаем regedit.
2. Производим поиск значений параметров, содержащих 1252.
3. Заменяем эти значения на 1251.
4. Перезагружаемся.
5. Проводим тест и радуемся smile


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
forever
Дата 3.10.2006, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Fedia
Цитата(Fedia @  3.10.2006,  04:06 Найти цитируемый пост)
2. Производим поиск значений параметров, содержащих 1252.

Так это стародавняя проблема. Вот не думал, что она и здесь скажется. Но не нужно менять все вхождения 1252 - достаточно  
HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage\1252 заменить c_1252.nls на c_1251.nls

Цитата(Fedia @  3.10.2006,  04:06 Найти цитируемый пост)
5. Проводим тест и радуемся

Радость омрачается тем, что на других компах скомпиллированные у меня проги ведут себя по прежнему: у кого были ??? - так и остались, у кого было нормально - тоже без изменений.
PM   Вверх
Alexeis
Дата 3.10.2006, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Fedia, Это решение давно извесно и было выложено н форуме, но это не выход. Тем более у него бывают побочные эффекты связаные с использованием других языков. У некоторых установлено по 3 языка и больше, а программа должна нормально функционировать на любой машине. Проблему предлогаю решить установкой локального (внутрипрограмного) перехватчика сообщеня WM_PASTE, который будет ловить сообщения до передачи их соотв. компоненту.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romero
Дата 15.4.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как я понимаю, проблема так и не решена до конца.
Как же заставить текст правильно копироваться в буфер? Прога, скомпиленная в D6, имеет Memo с установленным RUSSIAN_CHARSET, и строка SetThreadLocale(1049) прописана. Однако, при запуске на 2000 винде скопированный ИЗ ОКНА (а не В ОКНО) программы текст вставляется в блокнот коряво. То же приложение нормально ведет себя на ХР (возможно, дело не в версиях винды, а в локализациях, но это не суть вопроса).
PM   Вверх
mai62
Дата 15.4.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня тоже были проблемы с кодировкой при копировании в буфер.  Где-то нашел такой рецепт, у меня работает.
Код

type

TLangClipboard = class(TClipboard)
private
  procedure SetCodePage(const CodePage: longint);
public
  procedure Open; override;
  procedure Close; override;
end;

implementation

procedure TLangClipboard.Close;
begin
  SetCodePage(LangManager.LanguageID);
  inherited;
end;

procedure TLangClipboard.Open;
begin
  inherited;
  SetCodePage(LangManager.LanguageID);
end;

procedure TLangClipboard.SetCodePage(const CodePage: longint);
var Data: THandle;
    DataPtr: Pointer;
begin
  Data:= GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, 4);
  try
    DataPtr := GlobalLock(Data);
    try
      Move(CodePage, DataPtr^, 4);
      SetClipboardData(CF_LOCALE, Data);
    finally
      GlobalUnlock(Data);
    end;
  except
    GlobalFree(Data);
  end;
end;

initialization

  FClipboard:= TLangClipboard.Create;
  OldClipboard:= SetClipboard(FClipboard);
  if OldClipboard <> nil then OldClipboard.Free;


LangManager.LanguageID - это у меня переключатель языка интерфейса от DKLang.
PM MAIL   Вверх
Alexeis
Дата 15.4.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Romero @  15.4.2007,  11:57 Найти цитируемый пост)
То же приложение нормально ведет себя на ХР (возможно, дело не в версиях винды, а в локализациях, но это не суть вопроса).

  Пробовали при копировании и при вставке текста переключатель языков винды установить в положение "RU"? Это позволяет винде правильно определить таблицу перекодировки юникод -> Ansi. Иначе прийдется перехватывать вставку текста и самостоятельно конвертировать юникод в анси. Это вылечить невозможно, так этими вещами управляет винда, а не сам делфи. Тоже самое происходит, например, и в редакторе от Microsoft Visual C++ 6. Тут лечить нужно программистов Microsoft от криворукости. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romero
Дата 15.4.2007, 13:22 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хм, с RichEdit таких проблем не наблюдается. При этом никаких танцев с бубном, строкой SetThreadLocale(1049) и установкой RUSSIAN_CHARSET не требуется. Странно!
PM   Вверх
Alexeis
Дата 15.4.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Romero, Ну он передает информацию в буфер обмена в формате RTF, где к для каждого символа можно узнать сопроводительную информацию, т.е. шрифт, размер, цвет, абзац, выравнивание, возможно еще и номер таблицы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
EvilsInterrupt
Дата 13.11.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Да, занятная тема ;) В вашем полку прибыло ;) 
Вобщем приведу сразу код:
Код

  procedure TfrmLog.ilmCopyToClipbrdClick(Sender: TObject);
  const
    clrf : String = Char(13)+Char(10);
  var
    Event     : PVSTEvent;
    EventTxt  : string;
    Clipbrd   : TClipboard;
  begin
    Event := vstEventLog.GetNodeData(vstEventLog.FocusedNode);
    if Assigned(Event) then
    begin
      Clipbrd := Clipboard;
      if Assigned(Clipbrd) then
      begin
        with frmAbout do
        begin
          EventTxt := 
               'Application ver.: '+lbAppVerValue.Caption+clrf+
               'Application BuildDate: '+lbBuildDate.Caption+clrf+clrf+
               'Event Information: '+clrf+clrf+
               'Date: '+FormatDateTime('yyy-mmmm-dd',Event.Date)+clrf+
               'Time: '+FormatDateTime('hh:nn:ss:ms',Event.Time)+clrf+
               'Text: '+Event.Event;
        end;
        Clipbrd.AsText := EventTxt;
        FreeAndNil(Clipbrd);
      end;
    end; // Assigned
  end;

Суть этой функции в обработчике попуп-меню окна лога закинуть в буфер обмена выделенное в VTV нод с событием. Как видно из кода, я из формы с эбаутом достаю версию и время билда, он отображается нормально! А вот когда копируется в буфер обмена, то все его русские буквы становятся, даже не вопросами, а какиме-то крякозябрами ;(
Этот же код, на другой ЭВМ отрабатывает на ура, есно после сборки на той машине.

Все что оговаривалось выше не помогает, а правка в реестре мне не подойдет, т.к. я пишу мультиязычную программу. Пока вот хочу попробовать метод от mai62, но вдруг еще какие-нибудь мысли есть?

Это сообщение отредактировал(а) EvilsInterrupt - 13.11.2007, 19:53
PM MAIL WWW ICQ Jabber   Вверх
EvilsInterrupt
Дата 13.11.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Все, проблему решил, увидел строки в DRKB:
Цитата

Как вставить русский текст в буфер обмена Windows 2000, Windows XP
 
Для указания языка текста в clipboard используется специальный формат CF_LOCALE. Данные в этом формате - это LocaleID: word. При вставке текста в формате CF_TEXT, или CF_OEMTEXT, нужно просто добавить LocaleID в формате CF_LOCALE, после чего Windows сможет правильно преобразовать имеющийся текст в недостающие форматы (например в CF_UNICODETEXT), да и просто будет корректно вставлен в самом CF_TEXT.

Сразу стало понятно, что товарищь mai62 предложил хороший способ ;) Спасибо
PM MAIL WWW ICQ Jabber   Вверх
WaReZMEN
Дата 14.11.2007, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

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



http://forum.vingrad.ru/forum/topic-180473.html

Добавлено через 9 минут и 1 секунду
Цитата(Snowy @  3.2.2006,  04:26 Найти цитируемый пост)
Именно. Поэтому я и создал новую тему, чтобы она не терялась.
Достаточно вставить эту строчку и сделать у форм RUSSIAN_CHARSET.
Это лечит все проблемы.
Плюс к этому это решает вообще все проблемы с перекодированием из юникода в ANSI и наоборот.
А это уже затрагивает Delphi 1-7.
Не затрагивает только BDS2006 - там проблем нет изначально.

а вот у меня какраз токи в 2006. Messegedlg показывает вопросы и что интересно из 50 компьютеролв тока на одном... 

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


Смышленный
***


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

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



Цитата(WaReZMEN @  14.11.2007,  02:19 Найти цитируемый пост)
что интересно из 50 компьютеролв тока на одном... 

Может там винда не русская стоит?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
EvilsInterrupt
Дата 14.11.2007, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



aktuba, Можешь подскажешь выход из такой ситуации:
Если у меня выбрана русская раскладка, то в буфер обмена копируется и последующая вставка куда-либо(к примеру сюда в окно поста сообщения на форум), то все отображается отлично и никакой крякозябрины. Но если же я выберу английскую раскладку, то после копирования в буфер и последующей вствки куда-либо(к примеру сюда в окно поста сообщения на форум), то крякозябры ;(

Я конечно догадываюсь,что англичание не должны шарить о существовании русского языка. Но как пользователю же пофиг на это! ;)
Может имеет смысл насильно перекодировать на русский в самом буфере обмена, если конечно выбран русский язык или какой-либо другой, к примеру китайский ?
PM MAIL WWW ICQ Jabber   Вверх
EvilsInterrupt
Дата 14.11.2007, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Проблема решена, MetalFan подсказал.
Код

  function TfrmLog.SetClipboardText( const AText: string ): Boolean;
  var
    hClipbrd : THandle;
  begin
    Result := True;
    Clipboard.Open;
    Clipboard.AsText := AText;
    hClipbrd := Clipboard.GetAsHandle(CF_TEXT);
    if hClipbrd = INVALID_HANDLE_VALUE then
       Result := False
    else  SetClipboardData(CF_LOCALE, hClipbrd);
    Clipboard.Close;
  end;

ведь по идее:

PM MAIL WWW ICQ Jabber   Вверх
Ymnuk
Дата 27.7.2009, 19:52 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А подскажите такой момент пожалуста.
Есть сервер с DB2 UDB 8.2. Кодировка стоит 1251 и в программе весь русский отображается прекрасно на всех компьютера без исключений, но есть 2 компа, на которых стоит Novel-клиент. На них весь русский язык отображается нормально, кроме выгрузки данных в Excel. Сам файл-шаблон отображается нормально, а вот выгруженные данные отображаются непонятной кодировкой (я так и не выяснил какая кодировка). При использовании Shell API и выборе директории с русским названием появляется та же непонятная кодировка.
Может кто знает как исправить это в программе?
PM MAIL ICQ Skype   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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