Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
2-1157796355
max1991
2006-09-09 14:05
2006.10.01
Подскажите пожалуйста, как правильно перевести Char to STR


15-1158038544
Michael5
2006-09-12 09:22
2006.10.01
При загрузке WinXP на этапе ввода пароля пользователя


2-1157709922
Urvin
2006-09-08 14:05
2006.10.01
Отправить запрос на сервер


1-1155760157
иван8511
2006-08-17 00:29
2006.10.01
Как протестировать архив winrar из программы


2-1158133464
greengeneral
2006-09-13 11:44
2006.10.01
Помогите начинающему программисту