Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

KeyboardLayout   Найти похожие ветки 

 
GanibalLector ©   (2006-05-24 01:10) [0]

Некие данные помещаю в буффер,а далее вставляю например в Excel. Так вот,если при копировании раскладка клавиатуры была не русская,то данные примут вид иероглифов.
Понятно,что нужно изменить раскладку. Вот собственно и вопрос : как правильно сделать???
1 вариант) использовать LoadKeyboardLayout. Но по непонятным причинам MemProf кричит,что нужно еще и UnloadKeyboardLayout.
См.Help и вижу обратное :

Функция может потерпеть неудачу по следующим причинам:
Был послан недопустимый дескриптор раскладки символов на клавиатуре.
Раскладка была предварительно загружена.
Раскладка находится в использовании.

Это получается,что пацаны из MemProf ошиблись???

2 вариант) используя ActivateKeyboardLayout и GetKeyboardLayoutName добраться до русского. Но google говорит,что это "правило плохого тона"... Кстати,непонятно кому такой тон не понравился ;)


З.Ы. И еще вопрос...в силу того,что ф-ции ActivateKeyboardLayout и LoadKeyboardLayout ведут себя по разному в 95 и NT.
Такое же будет поведение с Excel и буффером в 95/98?

Спасибо!


 
MBo ©   (2006-05-24 10:05) [1]

в буфер помещай юникод (CF_UNICODETEXT)


 
GanibalLector ©   (2006-05-24 18:41) [2]

2 MBo ©   (24.05.06 10:05) [1]
>в буфер помещай юникод (CF_UNICODETEXT)

Помещал.Только в этом случае при вставке  в Excel"е вместо иероглифов будут вопросительные знаки. Если же вставлять в блокнот,то все нормально.
Поэтому и пошел по пути : ActivateKeyboardLayout и LoadKeyboardLayout


 
GanibalLector ©   (2006-05-25 00:10) [3]

???


 
MBo ©   (2006-05-25 07:20) [4]

У меня при обычной вставке в Excel идет такое: "Ôûâà ïðîëä"

А при использовании следующей функции (Alex Konshin) всё нормально:

procedure SetClipboardText(const AText: string);
var
 len, ulen: Integer;
 hClip: THandle;
 pClip: Pointer;
begin
 if Win32Platform = VER_PLATFORM_WIN32_NT then begin
   len := Length(AText) + 1;
   ulen := len + len;
   hClip := GlobalAlloc(GMEM_MOVEABLE, ulen);
   if hClip = 0 then
     raise Exception.Create(SysErrorMessage(GetLastError))
   else try
     pClip := PWideChar(GlobalLock(hClip));
     if pClip = nil then
       raise Exception.Create(SysErrorMessage(GetLastError))
     else begin
       try
         MultiByteToWideChar(1251, 0, PChar(AText), len, pClip, ulen);
       finally
         GlobalUnlock(hClip);
       end;
       Clipboard.SetAsHandle(CF_UNICODETEXT, hClip);
     end;
   except
     GlobalFree(hClip);
     raise;
   end;
 end
 else begin
   Clipboard.SetTextBuf(PChar(AText));
   SetClipboardData(CF_LOCALE, LANG_RUSSIAN);
 end;
end;


 
GanibalLector ©   (2006-05-25 09:07) [5]

2 MBo ©   (25.05.06 07:20) [4]
Да,именно этим кодом и пробовал. Версия Excel 2003 SP1.
При вставке получаю : ðóññêàÿ äåìîêðàòèÿ


 
GanibalLector ©   (2006-05-26 09:07) [6]

Странно...Неужели мой вопрос никому не интересен???


 
GrayFace ©   (2006-05-26 10:56) [7]

Я так делал:

type
 ptr=pointer;
 int=LongInt;

procedure SendKeyboardLayout(Wnd, Msg:int; lParam:int=0; wParam:int=0);
var a:HKL; s:string;
begin
 SetLength(s,8);
 Win32Check(GetKeyboardLayoutName(ptr(s)));
 if s="00000409" then // If English
 begin
   a:=ActivateKeyboardLayout(
        LoadKeyBoardLayout(ptr(intToHex(GetUserDefaultLangID,8)),0),0);
   if a=0 then RaiseLastOSError;
   SendMessage(Wnd, Msg, lParam, wParam);
   if ActivateKeyboardLayout(a,0)=0 then RaiseLastOSError;
 end else
   SendMessage(Wnd, Msg, lParam, wParam);
end;

procedure TForm1.Copy1Click(Sender: TObject);
begin
 SendKeyboardLayout(GetFocus, WM_COPY);
end;

procedure TForm1.Cut1Click(Sender: TObject);
begin
 SendKeyboardLayout(GetFocus, WM_CUT);
end;


 
Alarm ©   (2006-05-26 11:54) [8]

Не знаю насколько корректно, но в своих приложениях, я делаю так:

Var russian, latin: HKL;
...

 russian := LoadKeyboardLayout("00000419", 0);
 latin   := LoadKeyboardLayout("00000409", 0);

...

ActivateKeyboardLayout(russian, 0);


 
GrayFace ©   (2006-05-26 12:10) [9]

> Alarm ©   (26.05.06 11:54) [8]
В приведенном коде не видно восстановления раскладки. И привязка к русскому языку - это криво.


 
Alarm ©   (2006-05-26 12:19) [10]

>GrayFace ©   (26.05.06 12:10) [9]

Действительно, восстановления раскладки не видно:(
у меня только переключения - для восстановления латиницы:

ActivateKeyboardLayout(latin, 0);


 
GanibalLector ©   (2006-05-27 01:34) [11]

2 GrayFace ©   (26.05.06 12:10) [9]
Можно подумать у тебя ровно ;) А если у меня еще французкий и немецкий??? Что тогда???


if s<>"00000419" then // если НЕ русский


 
GrayFace ©   (2006-05-27 06:45) [12]

Ну, чтоб edit"а разрулить французский и немецкий можно только зная кое-что о charset"е edit"а. У меня если французский и немецкий и включен один из них, то с английского будет переключение на язык по умолчанию, а между французским и немецким уже никак. Если все charset"ы = DEFAULT_CHARSET, наверное, можно заменить if s="00000409" then // If English на if StrToInt("$"+s)<>GetUserDefaultLangID then.


 
GrayFace ©   (2006-05-27 06:58) [13]

Да нет, у меня вроде все нормально кроме того, что идет работа со стоками. Если Charset=DEFAULT_CHARSET, то все будет чисто. VCL итак накладывает ограничение - можно видеть только язык указанный в Charset и английский. Конечно, в этой ситуации мой код не спасет, но и ничего не испортит. Неправильная работа возможна только если установлен английский Charset и в Memo имеются спец. символы этого Charset"а - всякие буквы сточками над ними.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.014 c
15-1157973519
Чехонте
2006-09-11 15:18
2006.10.01
Однажды на берегу Великого Северного моря. лит.миниатюра


3-1154443970
Neo Trinitron
2006-08-01 18:52
2006.10.01
Что есть БД MS Access для ADO?


2-1158223978
megasecure
2006-09-14 12:52
2006.10.01
Проблема с ADO


2-1157703974
P2P
2006-09-08 12:26
2006.10.01
Помогите перевести конструкцию с C++


15-1157606029
Ega23
2006-09-07 09:13
2006.10.01
С Днём рождения! 7 сентября





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский