|
#1
|
||||
|
||||
Два вопроса
Всем привет!
У меня два вопроса: 1. Как опредилить раскладки, которые поддерживает клавиатура и как можно ее поменять; 2. Как узнать часовой пояс. Заранее большое спасибо! |
#2
|
||||
|
||||
1.
Список установленных раскладок клавиатуры выводится в ListBox. При выборе в нем, раскладка меняется. Код:
procedure GetKLList(List: TStrings); var AList : array [0..9] of Hkl; AklName: array [0..255] of Char; i: Longint; begin List.Clear; for i := 0 to GetKeyboardLayoutList(SizeOf(AList), AList) - 1 do begin GetLocaleInfo(LoWord(AList[i]), LOCALE_SLANGUAGE, AklName, SizeOf(AklName)); List.AddObject(AklName, Pointer(AList[i])); end; end; procedure TForm1.FormCreate(Sender: TObject); begin GetKLList(ListBox1.Items); end; procedure TForm1.ListBox1Click(Sender: TObject); begin with Sender as TListBox do ActivateKeyboardLayout(Hkl(Items.Objects[ItemIndex]), 0); end; Как программно переключить раскладку клавиатуры Код:
//На русский procedure TForm1.Button1Click(Sender: TObject); var Layout: array[0.. KL_NAMELENGTH] of char; begin LoadKeyboardLayout( StrCopy(Layout,'00000419'),KLF_ACTIVATE); end; //На английский procedure TForm1.Button2Click(Sender: TObject); var Layout: array[0.. KL_NAMELENGTH] of char; begin LoadKeyboardLayout(StrCopy(Layout,'00000409'),KLF_ACTIVATE); end; 2. Список часовых поясов: Код:
uses Registry; procedure TForm1.Button1Click(Sender: TObject); var reg : TRegistry; ts : TStrings; i : integer; begin reg := TRegistry.Create; reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKey( 'SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones', false); if reg.HasSubKeys then begin ts := TStringList.Create; reg.GetKeyNames(ts); reg.CloseKey; for i := 0 to ts.Count -1 do begin reg.OpenKey( 'SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones\' + ts.Strings[i], false); Memo1.Lines.Add(ts.Strings[i]); Memo1.Lines.Add(reg.ReadString('Display')); Memo1.Lines.Add(reg.ReadString('Std')); Memo1.Lines.Add(reg.ReadString('Dlt')); Memo1.Lines.Add('----------------------'); reg.CloseKey; end; ts.Free; end else reg.CloseKey; reg.free; end; Чтобы узнать часовой пояс, пользуйся GetTimeZoneInformation(). Какие значения возвращает функция GetTimeZoneInformation()? Код:
const TIME_ZONE_ID_UNKNOWN = 0; const TIME_ZONE_ID_STANDARD = 1; const TIME_ZONE_ID_DAYLIGHT = 2; А изменить - SetTimeZoneInformation THE CRACKER IS OUT THERE Последний раз редактировалось 4kusNick, 10.08.2007 в 12:09. |
#3
|
||||
|
||||
Большое спасибо, 4kusNick!
|
#4
|
||||
|
||||
Хочу немного добавить к ответу 4kusNick.
Не советую слишком увлекаться сменами раскладок. Лично мне не нравятся те программы которые без моего участия переключают раскладки, и думаю что в этом я не одинок. |
#5
|
||||
|
||||
Полностью согласен с Aristarh Dark, но сам чато сталкивался с ситуациями, когда это переключение очень полезно и не надоедает пользователю. Как-то я использовал Grid стороннего разработчика, и там было неудобно реализовано нажатие точек и запятых, точнее, при нажатии на запятую в англ. раскладке она ставилась, а в русской - нет, причем при нажатии именни русской запятой тоже ничего не происходило, тогда мне приходилось менять раскладку на англ. на время изменения чисел в том Grid'е, а сразу при окончании редактирования, включать обратно ту, что была до радактирования, т.о. я добивался удобства ввода точек (запятых) в числах и сам переключал обратно на исходную раскладку, чем не давал пользователю повода для беспокойства =) В общем, да, не стоит забывать о том, что пользвателю может быть не удобно такое переключение, но этого можно избежать, если переключение необходимо лишь на время - переключать в исходное состояние....
THE CRACKER IS OUT THERE |
#6
|
||||
|
||||
Всем спасибо!
|