spiegel-keyman/common/windows/delphi/visualkeyboard/VisualKeyboardInfo.pas

140 lines
3.1 KiB
ObjectPascal

(*
Name: VisualKeyboardInfo
Copyright: Copyright (C) 2003-2017 SIL International.
Documentation:
Description:
Create Date: 3 May 2011
Modified Date: 3 May 2011
Authors: mcdurdin
Related Files:
Dependencies:
Bugs:
Todo:
Notes:
History: 03 May 2011 - mcdurdin - I2890 - Record diagnostic data when encountering registry errors
*)
unit VisualKeyboardInfo;
interface
uses VisualKeyboard, Contnrs;
type
TVisualKeyboardInfo = class
public
Keyboard: TVisualKeyboard;
FileName: string;
KeymanID: Integer;
KeymanName: string;
destructor Destroy; override;
end;
TVisualKeyboardInfoList = class(TObjectList)
protected
function Get(Index: Integer): TVisualKeyboardInfo;
procedure Put(Index: Integer; Item: TVisualKeyboardInfo);
public
property Items[Index: Integer]: TVisualKeyboardInfo read Get write Put; default;
function Add(Item: TVisualKeyboardInfo): Integer;
procedure Load;
end;
implementation
uses
Classes,
klog,
ErrorControlledRegistry,
RegistryKeys,
SysUtils,
Windows;
{ TVisualKeyboardInfoList }
function TVisualKeyboardInfoList.Add(Item: TVisualKeyboardInfo): Integer;
begin
Result := inherited Add(Item);
end;
function TVisualKeyboardInfoList.Get(Index: Integer): TVisualKeyboardInfo;
begin
Result := TVisualKeyboardInfo(inherited Get(Index));
end;
procedure TVisualKeyboardInfoList.Load;
procedure LoadExt(FAdmin: Boolean);
var
Path: string;
i: Integer;
begin
with TRegistryErrorControlled.Create do // I2890
try
if FAdmin then
begin
RootKey := HKEY_LOCAL_MACHINE;
Path := '\'+SRegKey_InstalledKeyboards_LM+'\';
end
else
begin
RootKey := HKEY_CURRENT_USER;
Path := '\'+SRegKey_InstalledKeyboards_CU+'\';
end;
for i := 0 to Count - 1 do
if OpenKeyReadOnly(Path+Items[i].KeymanName) then
if ValueExists(SRegValue_VisualKeyboard) then Items[i].FileName := ReadString(SRegValue_VisualKeyboard);
finally
Free;
end;
end;
var
str: TStringList;
vki: TVisualKeyboardInfo;
i: Integer;
begin
KL.Log('Loading visual keyboards');
Clear;
str := TStringList.Create;
with TRegistryErrorControlled.Create do // I2890
try
RootKey := HKEY_CURRENT_USER;
if OpenKeyReadOnly(SRegKey_ActiveKeyboards_CU) then
begin
GetValueNames(str);
for i := 0 to str.Count - 1 do
begin
vki := TVisualKeyboardInfo.Create;
vki.KeymanID := StrToIntDef(str[i], 10000);
vki.KeymanName := ReadString(str[i]);
vki.Keyboard := nil;
vki.FileName := '';
Add(vki);
end;
end;
LoadExt(False);
LoadExt(True);
for i := 0 to Count - 1 do
KL.Log('Visual Keyboard '+Items[i].KeymanName+'='+Items[i].FileName);
finally
Free;
str.Free;
end;
end;
procedure TVisualKeyboardInfoList.Put(Index: Integer; Item: TVisualKeyboardInfo);
begin
inherited Put(Index, Item);
end;
{ TVisualKeyboardInfo }
destructor TVisualKeyboardInfo.Destroy;
begin
FreeAndNil(Keyboard);
inherited Destroy;
end;
end.