![]() |
|
|
|
|
#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 Последний раз редактировалось 4kusNick, 10.08.2007 в 12:09. |
|
#3
|
||||
|
||||
|
Большое спасибо, 4kusNick!
|
|
#4
|
||||
|
||||
|
Хочу немного добавить к ответу 4kusNick.
Не советую слишком увлекаться сменами раскладок. Лично мне не нравятся те программы которые без моего участия переключают раскладки, и думаю что в этом я не одинок. |
|
#5
|
||||
|
||||
|
Полностью согласен с Aristarh Dark, но сам чато сталкивался с ситуациями, когда это переключение очень полезно и не надоедает пользователю. Как-то я использовал Grid стороннего разработчика, и там было неудобно реализовано нажатие точек и запятых, точнее, при нажатии на запятую в англ. раскладке она ставилась, а в русской - нет, причем при нажатии именни русской запятой тоже ничего не происходило, тогда мне приходилось менять раскладку на англ. на время изменения чисел в том Grid'е, а сразу при окончании редактирования, включать обратно ту, что была до радактирования, т.о. я добивался удобства ввода точек (запятых) в числах и сам переключал обратно на исходную раскладку, чем не давал пользователю повода для беспокойства =) В общем, да, не стоит забывать о том, что пользвателю может быть не удобно такое переключение, но этого можно избежать, если переключение необходимо лишь на время - переключать в исходное состояние....
|
|
#6
|
||||
|
||||
|
Всем спасибо!
|