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


Автор: Bog d`An 26.7.2005, 03:07
При вставке в TEdit моего приложения текста из буфера обмена вместо русских букв отображаются знаки вопроса, что не есть правильно. Как сделать правильно? Если можно, кусок кода. Зарание спасибо.


Автор: Rrader 26.7.2005, 03:41
Откуда скопирован текст?

Автор: RA 26.7.2005, 04:03
Это баг самого XP.

Автор: ТоляМБА 26.7.2005, 06:02
Не знаю, у меня всё правильно вставляется, но одно время такой же косяк был (не помню как исправил), могу только посоветовать:
1. В свойствах Edit1 (TEdit) попробуй разные значения Font\Charset (по умолчанию там стоит Defaut_Charset)
2. Такой косяк возникает и с другими прогами, там делается следующий обход: при копировании и вставке русских символов должная стоять русская раскладка клавиатуры.

Автор: RA 26.7.2005, 09:14
ТоляМБА не поможет, это чисто XP-шный баг. Где-то на форуме этот вопрос уже обсуждался.

Автор: ТоляМБА 27.7.2005, 05:02
Цитата(RAdmin @ 26.7.2005, 09:14)
ТоляМБА не поможет, это чисто XP-шный баг. Где-то на форуме этот вопрос уже обсуждался.

RAdmin, ну сегодня я утром дома посмотрел
Винда ХР русифицированная без сервис паков. Делфя 7 Enterprise, не русифицированная. Создал форму с эдитом, скомпилировал, запускил экзэшник: если из ворда копировать, то даже на английской раскладке русские буквы в эдит копируются без проблем, а если из блокнота копировать или имя файла из папки, то при англий ской раскладке действительно "??????? ?????", но если переключить на русскую раскладку, скопировать, вставить, то всё читается нормально.
smile
Значит всё-таки грабли не в ХР или может в ней но в английской версии?

Автор: Song 27.7.2005, 07:30
Bog d`An
Просто перед копированием в буфер переведи раскладку на RU

Автор: RA 27.7.2005, 11:34
ТоляМБА Грабли в XP, так как текст в виде "???????" ты получишь даже при вставке его в блокнот.

Автор: Bes 27.7.2005, 11:55
см ответ Song-a

Автор: Bog d`An 28.7.2005, 06:06
Цитата(Song @ 27.7.2005, 07:30)
Bog d`An
Просто перед копированием в буфер переведи раскладку на RU

Это конечно выход smile
Теперь серьёзно: те же исходные но теперь текст уже в буфере.
Типа юзер что-то делает а прога пытается перехватить буфер обмена...

Автор: RA 28.7.2005, 07:36
Поставить хук на копирование в буфер, и перед копирование менять раскладку активному окну.

Автор: Romikgy 28.7.2005, 08:37
Возможно даже будет работать smile
однак я в ХР для решения данной проблемы , где только можно , в ее настройках, ставил русские локали, и все работало. Хотя мож эт только у меня все так хорошо smile smile

Автор: RA 28.7.2005, 08:51
Romikgy Это всё как пропрёт, у меня после установки SP2 этот баг то проявляется то нет, закономерность немогу понять. smile

Автор: Bog d`An 1.8.2005, 04:18
Цитата

RAdmin Дата 28.7.2005, 08:51
  Romikgy Это всё как пропрёт, у меня после установки SP2 этот баг то проявляется то нет, закономерность немогу понять. 

эх... попрет не попрёт... а стабильность работы проге не помешает smile
Цитата

RAdmin Дата 28.7.2005, 07:36
  Поставить хук на копирование в буфер, и перед копирование менять раскладку активному окну. 

Хорошая идея! Не скажешь как сделать наиболее просто ловушку на буфер? В смысле оказать гуманитарную помощь куском кода smile

Как я понимаю, надо поставить общий хук и перехватывать сообщения о копировании в буфер? Тогда возникают вопросы:
1. Какие сообщения на это дело генерит винда?
2. Это сообщение генерится ДО копирования в буфер или ПОСЛЕ smile
3. Нельзя ли это сделать проще? smile

Ну и от себя: работающий код для переключения/определения раскладки.
Код


procedure SetLenguage(CodePage:String);
var
  Layout: array[0.. KL_NAMELENGTH] of char;
begin
  LoadKeyboardLayout(StrCopy(Layout,PChar(CodePage)),KLF_ACTIVATE);//На русский  00000419 // На английский 00000409 // На украинский 00000422
end;
//------------------------------------------------------------------------------

Function GetLenguage:String;
var
  RA: Array[0..$FFF] of Char;
begin
 GetKeyboardLayoutName(RA) ;
 Result:= StrPas(RA);
end;
//------------------------------------------------------------------------------


Сейчас скопировал этот кусок сюда с делфи - тот же глюк токо вместо знаков вопроса крокозяблики smile
ЗЫ: Лечится, как и было сказано Song`ом, переключением раскладки, спасибо...

Автор: Romikgy 1.8.2005, 08:14
А не в том ли проблема , что винда при копировании в буфер конвертит текст в юникод????

Автор: Song 1.8.2005, 09:36
Конкретно с едит-контролами дельфей не могу добиться знаков вопроса smile
Так бы можно было пободаться

Автор: RA 1.8.2005, 12:34
Цитата(Song @ 1.8.2005, 09:36)
Конкретно с едит-контролами дельфей не могу добиться знаков вопроса
Так бы можно было пободаться


Яж говорю как пропрёт винду. У меня вопросы где-то раз в месяц.

===============================
Напутствие пыонэрам:

Ловить вам нужно не бабочек и не буфер а WM_COPY посланное в окно, далее
определить кодировку этого окна, а потом уже решать менять ему language или нет.

Автор: Bog d`An 2.8.2005, 03:56
Цитата(RAdmin @ 1.8.2005, 12:34)
Цитата(Song @ 1.8.2005, 09:36)
Конкретно с едит-контролами дельфей не могу добиться знаков вопроса
Так бы можно было пободаться


Яж говорю как пропрёт винду. У меня вопросы где-то раз в месяц.

===============================
Напутствие пыонэрам:

Ловить вам нужно не бабочек и не буфер а WM_COPY посланное в окно, далее
определить кодировку этого окна, а потом уже решать менять ему language или нет.

У меня XP проявляет достойное похвал постоянство на этот счёт smile

WM_COPY посылаетссся... поссылается... а куда? Не в моё же приложение smile

Есть ли более простой способ отследить это дело, кроме общего хука? Спасибо.

Автор: Song 2.8.2005, 07:46
Bog d`An
Зато WM_PASTE в твоё.

Автор: Bog d`An 3.8.2005, 04:05
Цитата(Song @ 2.8.2005, 07:46)
Bog d`An
Зато WM_PASTE в твоё.

Копирую в буфер русский текст:
Вариант 1. При английской раскладке
а. Вставляю в TEdit - в результате знаки вопроса
б. Переключаю раскладку на русскую и вставляю в TEdit - в результате знаки вопроса
Вариант 2. ПЕРЕД КОПИРОВАНИЕМ переключаю раскладку (т.е. копирую при руской раскладке)
а. Вставляю в TEdit - в результате РУССКИЙ ТЕКСТ - THE BEST!!!
б. Переключаю раскладку на английскую и вставляю в TEdit - в результате РУССКИЙ ТЕКСТ - THE BEST!!!

И кто после этого ставит хук на вм_паст? А главное смысл? Тем более наЮга хук если паст в твоём приложении???

Добавлено @ 04:14
Цитата(Romikgy @ 1.8.2005, 08:14)
А не в том ли проблема , что винда при копировании в буфер конвертит текст в юникод????

Нельзя ли рассказать подробнее? pls smile

ЗЫ: "THE BEST!!!" - это не русский текст, а эмоция такая, вроде смайлика ":)"

ЗЗЫ: Может всё-таки кто-нибудь посоветует, как обойтись без общего хука?

ЗЗЗЫ: Той вместо такого, к-й сканит все сообщений винды на предмет вм_копи?

Автор: Song 3.8.2005, 07:32
Bog d`An
у меня такого нет, поэтому не могу и лекарство поэксперементировать.
А что у тебя за система?

Автор: Bog d`An 3.8.2005, 07:46
профессиональная свинья
Добавлено @ 07:47
с сервиспаком1 русифицированная
Добавлено @ 07:52
с сервиспаком1 русифицированная


Song, а у тебя?

Автор: Romikgy 3.8.2005, 08:24
Цитата(Bog @ 3.8.2005, 04:05)
Нельзя ли рассказать подробнее?

У меня стоит английская версия ХР без руссификации, в настройке--регионы и языки --
понял на русский регион, и самое главное в закладке advanced (у меня так, она третья) поменять на русский , вроде как я понял не-Юникод раскладки, как я понимаю, если винда не догоняет какая раскладка она ее представляет как юникод, отсюда и вопросики smile

Автор: Song 3.8.2005, 08:25
SP2 native english

Автор: Bog d`An 4.8.2005, 08:09
Цитата(Romikgy @ 3.8.2005, 08:24)
закладке advanced (у меня так, она третья) поменять на русский

у меня там тоже русский выбран
Добавлено @ 08:13
если русская раскладка, винда догоняет что за кодировка, если английская -//- нет?

Автор: Romikgy 4.8.2005, 08:19
Попробуй еще ниже , этого выбраного все таблицы перекодировок русского языка выбрать, более я и сам не знаю smile че знал то сказал, хотя и странная ситуёвина smile
Добавлено @ 08:22
Цитата(Bog @ 4.8.2005, 08:09)
если русская раскладка, винда догоняет что за кодировка, если английская -//- нет?

Может быть , где то винда прописала , что кирилица это кодировка анси , а англ. это юникод , у меня такого небыло, так догадки, мож шрифт по умолчанию поменять надо ???

Автор: Bog d`An 5.8.2005, 06:59
Цитата(Romikgy @ 4.8.2005, 08:19)
Попробуй еще ниже , этого выбраного все таблицы перекодировок русского языка выбрать, более я и сам не знаю smile че знал то сказал, хотя и странная ситуёвина smile
...
Может быть , где то винда прописала , что кирилица это кодировка анси , а англ. это юникод , у меня такого небыло, так догадки, мож шрифт по умолчанию поменять надо ???

Ладно, щас полезу ставить галочки на китайские языки smile

Шрифт по умолчению - напомни это где?

Автор: Bog d`An 5.8.2005, 07:12
а как програмно эти галочки проставить кто-нибудь в курсе?

Автор: Romikgy 5.8.2005, 08:39
Цитата(Bog @ 5.8.2005, 06:59)
Шрифт по умолчению - напомни это где?

Я ж сказал , это чисто моя догадка!!! Но и по умолчанию что-то должно быть, это тоже 100%
Цитата(Bog @ 5.8.2005, 07:12)
а как програмно эти галочки проставить кто-нибудь в курсе?

Так что получилось????

Автор: Bog d`An 6.8.2005, 06:51

Цитата(Romikgy @ 5.8.2005, 08:39)
Цитата (Bog d`An @ 5.8.2005, 06:59)
Шрифт по умолчению - напомни это где?


Я ж сказал , это чисто моя догадка!!! Но и по умолчанию что-то должно быть, это тоже 100%

Цитата (Bog d`An @ 5.8.2005, 07:12)
а как програмно эти галочки проставить кто-нибудь в курсе?


Так что получилось????


Romikgy нет, не помогло smile
просто интерестно... было... Вопрос снимаю так как он не по теме... Оба...: smile

Цитата(Bog @ 5.8.2005, 06:59)
Шрифт по умолчению - напомни это где?


Цитата(Bog @ 5.8.2005, 07:12)
а как програмно эти галочки проставить кто-нибудь в курсе?


Автор: Bog d`An 7.8.2005, 08:16
Информация для размышлений: при перетаскивании файлов в приложение
Код

type
  TMainForm = class(TForm)
...
  private
    { Private declarations }
    procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES; //получение сообщений о переносе файла в окно приложения
...
Procedure TMainForm.WMDropFiles(var Msg: TWMDropFiles);
var
  CFileName: array[0..MAX_PATH] of Char; // переменная, хранящая имя файла
  NumberFiles, counter: Cardinal;
begin
  CurList:=TStringList.Create;
  try
    NumberFiles:=DragQueryFile(Msg.Drop, $FFFFFFFF, CFileName, MAX_PATH); // получение количества файлов
    for counter:=0 to Numberfiles-1 do
    Begin
      DragQueryFile(Msg.Drop, counter, CFileName, MAX_PATH);
        MainForm.Memo1.Lines.Add(CFileName); //пути к файлам
    End;
    Msg.Result := 0;
  finally
    DragFinish(Msg.Drop); // отпустить файл
  end;
end;
//------------------------------------------------------------------------------
...
procedure TMainForm.FormCreate(Sender: TObject);
begin
...
  DragAcceptFiles(Handle, True);
...
end;



а также при перетаскивании на иконку приложения (передача как параметра комадной строки)
Код

...
procedure TMainForm.FormCreate(Sender: TObject);
Var 
  counter:Integer;
begin
...
    for Counter:=1 to ParamCount do
     MainForm.Memo1.Lines.Add(ParamStr(Counter));
...
end;


РУССКИЕ БУКВЫ ОТОБРАЖАЮТСЯ ПРАВИЛЬНО. Теперь если скопировать текст из мемо при любой раскладке - то глюк пропадает - вставляется нормальный русский текст...

может кого этот факт натолкнёт на мысль?



Автор: Song 8.8.2005, 08:30
А чего тут думать? Всё дело в юникодах.

Автор: Bog d`An 9.8.2005, 04:49
Цитата(RAdmin @ 28.7.2005, 07:36)
Поставить хук на копирование в буфер, и перед копирование менять раскладку активному окну.

Наверное всё же прейдётсяя создавать глобальную ловушку... smile
поскольку это единственное предложенное решение smile

Автор: Song 9.8.2005, 08:05
Ловишь WM_PASTE, берёшь ClipBoard.asText, преобразуешь его из юникодов, так чтобы убрать кракозябры. Далее посылаешь сообщение тому же контролу асинхронно для вставки исправленноно текста.

Автор: RA 9.8.2005, 15:36
Вобщем вот то очём я писал. Не испытывал, ибо условия не позволяють.

Автор: Bog d`An 11.8.2005, 04:03
ок, проведу испытания smile если справлюсь с этой непростой задачей %) отчитаюсь...

Автор: Bog d`An 12.8.2005, 01:07
RAdmin, спасибо, но мне не всё понятно в твоём примере - например что за сообщение такое $0400 + 2
Код

...
//SendMessage( MainWnd, $0400 + 2, wParam, k );
...
и как на него отвечать smile
После прочтения ещё десятка страниц мануала от разных авторов, взял за основу статью Aleksey'я Pavlov'а (а точнее пример №3).
Так вот - или у меня руки кривые или не всё так просто и WM_COPY не обрабатывается smile
(я, конечно, предпочёл бы второй вариантsmile )
Буду признателен, если ты посмотришь код...
Так как я ещё не разобрался как прикреплять к мессажам файлы, то вышлю тебе на почту, ок?
Если не лень дать адресок...

Автор: Bog d`An 12.8.2005, 01:15
так... кажется уже разобрался с прикреплёнными файлами...
Итак вот моё "творчество"

Автор: Bog d`An 12.8.2005, 01:17
а вот то, что я переработал... присутствует статейка по ловушкам...

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