shenhotkeys.pas
来自「向程序发送热键的单元源程序」· PAS 代码 · 共 732 行 · 第 1/2 页
PAS
732 行
case W of
0: temphotkey := keylabels[0];
Ord('A'): temphotkey := keylabels[1];
Ord('B'): temphotkey := keylabels[2];
Ord('C'): temphotkey := keylabels[3];
Ord('D'): temphotkey := keylabels[4];
Ord('E'): temphotkey := keylabels[5];
Ord('F'): temphotkey := keylabels[6];
Ord('G'): temphotkey := keylabels[7];
Ord('H'): temphotkey := keylabels[8];
Ord('I'): temphotkey := keylabels[9];
Ord('J'): temphotkey := keylabels[10];
Ord('K'): temphotkey := keylabels[11];
Ord('L'): temphotkey := keylabels[12];
Ord('M'): temphotkey := keylabels[13];
Ord('N'): temphotkey := keylabels[14];
Ord('O'): temphotkey := keylabels[15];
Ord('P'): temphotkey := keylabels[16];
Ord('Q'): temphotkey := keylabels[17];
Ord('R'): temphotkey := keylabels[18];
Ord('S'): temphotkey := keylabels[19];
Ord('T'): temphotkey := keylabels[20];
Ord('U'): temphotkey := keylabels[21];
Ord('V'): temphotkey := keylabels[22];
Ord('W'): temphotkey := keylabels[23];
Ord('X'): temphotkey := keylabels[24];
Ord('Y'): temphotkey := keylabels[25];
Ord('Z'): temphotkey := keylabels[26];
Ord('1'): temphotkey := keylabels[27];
Ord('2'): temphotkey := keylabels[28];
Ord('3'): temphotkey := keylabels[29];
Ord('4'): temphotkey := keylabels[30];
Ord('5'): temphotkey := keylabels[31];
Ord('6'): temphotkey := keylabels[32];
Ord('7'): temphotkey := keylabels[33];
Ord('8'): temphotkey := keylabels[34];
Ord('9'): temphotkey := keylabels[35];
Ord('0'): temphotkey := keylabels[36];
VK_F1: temphotkey := keylabels[37];
VK_F2: temphotkey := keylabels[38];
VK_F3: temphotkey := keylabels[39];
VK_F4: temphotkey := keylabels[40];
VK_F5: temphotkey := keylabels[41];
VK_F6: temphotkey := keylabels[42];
VK_F7: temphotkey := keylabels[43];
VK_F8: temphotkey := keylabels[44];
VK_F9: temphotkey := keylabels[45];
VK_F10: temphotkey := keylabels[46];
VK_F11: temphotkey := keylabels[47];
VK_F12: temphotkey := keylabels[48];
VK_UP: temphotkey := keylabels[49];
VK_DOWN: temphotkey := keylabels[50];
VK_LEFT: temphotkey := keylabels[51];
VK_RIGHT: temphotkey := keylabels[52];
VK_ESCAPE: temphotkey := keylabels[53];
VK_TAB: temphotkey := keylabels[54];
VK_INSERT: temphotkey := keylabels[55];
VK_DELETE: temphotkey := keylabels[56];
VK_HOME: temphotkey := keylabels[57];
VK_END: temphotkey := keylabels[58];
VK_PRIOR: temphotkey := keylabels[59];
VK_NEXT: temphotkey := keylabels[60];
VK_NumPad0: temphotkey := keylabels[61];
VK_NumPad1: temphotkey := keylabels[62];
VK_NumPad2: temphotkey := keylabels[63];
VK_NumPad3: temphotkey := keylabels[64];
VK_NumPad4: temphotkey := keylabels[65];
VK_NumPad5: temphotkey := keylabels[66];
VK_NumPad6: temphotkey := keylabels[67];
VK_NumPad7: temphotkey := keylabels[68];
VK_NumPad8: temphotkey := keylabels[69];
VK_NumPad9: temphotkey := keylabels[70];
VK_ADD: temphotkey := keylabels[71];
VK_SUBTRACT: temphotkey := keylabels[72];
VK_MULTIPLY: temphotkey := keylabels[73];
VK_DIVIDE: temphotkey := keylabels[74];
VK_DECIMAL: temphotkey := keylabels[75];
VK_NUMLOCK: temphotkey := keylabels[76];
VK_SCROLL: temphotkey := keylabels[77];
else begin
Result := False;
Exit;
end;
end;
ShiftState := tempshift;
HotKey := temphotkey;
Result := True;
except
ShiftState := tempshiftold;
HotKey := temphotkeyold;
Result := False;
end;
end;
{-----------------------------------------------------------------------------
Procedure: TShenHotKeyItem.Assign
Author: slq
Date: 08-三月-2002
Arguments: Item: TPersistent
Result: None
Purpose: 安置
-----------------------------------------------------------------------------}
procedure TShenHotKeyItem.Assign(Item: TPersistent);
begin
if Item is TShenHotKeyItem then
begin
HotKey := TShenHotKeyItem(Item).HotKey;
ShiftState := TShenHotKeyItem(Item).ShiftState;
end else
inherited Assign(Item);
end;
{-----------------------------------------------------------------------------
Procedure: TShenHotKeyItem.GetDisplayName
Author: slq
Date: 08-三月-2002
Arguments: None
Result: string
Purpose: 设计期的显示名字
-----------------------------------------------------------------------------}
function TShenHotKeyItem.GetDisplayName: string;
procedure AddShift(const S: string);
begin
if Result <> '' then
Result := Result + ' + ';
Result := Result + S;
end;
begin
if HotKey = '' then
Result := inherited GetDisplayName
else if Name <> '' then
Result := Name
else begin
if ssAlt in ShiftState then
AddShift('Alt');
if ssCtrl in ShiftState then
AddShift('Ctrl');
if ssShift in ShiftState then
AddShift('Shift');
AddShift(HotKey);
end;
end;
{-----------------------------------------------------------------------------
Procedure: TShenHotKeyItem.GetNamePath
Author: slq
Date: 08-三月-2002
Arguments: None
Result: string
Purpose: 可能存在BUG,导致超过10个的时候出现小问题,
因为绝对不影响使用,也不会造成内存泄漏等,所以暂时不修正
-----------------------------------------------------------------------------}
function TShenHotKeyItem.GetNamePath: string;
function NameToSymbol(Name: string): string;
var i: Integer;
begin
Result := '';
for i := 1 to Length(Name) do
if Name[i] in ['A'..'Z', 'a'..'z', '0'..'9'] then
Result := Result + Name[i];
end;
var S: string;
begin
if Collection <> nil then
begin
S := Name;
if (S = '') and (HotKey <> '') then
S := GetDisplayName;
S := NameToSymbol(S);
if S <> '' then
Result := Format('%s[%s]', [Collection.GetNamePath, S])
else
Result := Format('%s[%d]', [Collection.GetNamePath, Index]);
end else
Result := ClassName;
end;
{-----------------------------------------------------------------------------
Procedure: TShenHotKeyItem.GetHotKey
Author: slq
Date: 08-三月-2002
Arguments: None
Result: string
Purpose:
-----------------------------------------------------------------------------}
function TShenHotKeyItem.GetHotKey: string;
begin
Result := KeyLabels[FHotKey];
end;
{-----------------------------------------------------------------------------
Procedure: TShenHotKeyItem.SetHotKey
Author: slq
Date: 08-三月-2002
Arguments: Key: string
Result: None
Purpose:
-----------------------------------------------------------------------------}
procedure TShenHotKeyItem.SetHotKey(Key: string);
var i: Integer;
begin
i := 0;
while i < High(KeyLabels) do
begin
Inc(i);
if CompareText(Key, KeyLabels[i]) = 0 then
Break;
end;
if i > High(KeyLabels) then
i := 0;
FHotKey := i;
if not (csDesigning in Manager.ComponentState) then
RegisterHotKey;
end;
{-----------------------------------------------------------------------------
Procedure: TShenHotKeyItem.SetShiftState
Author: slq
Date: 08-三月-2002
Arguments: State: TShenShiftState
Result: None
Purpose:
-----------------------------------------------------------------------------}
procedure TShenHotKeyItem.SetShiftState(State: TShenShiftState);
begin
FShiftState := State;
if not (csDesigning in Manager.ComponentState) then
RegisterHotKey;
end;
{-----------------------------------------------------------------------------
Procedure: TShenHotKeyItem.GetManager
Author: slq
Date: 08-三月-2002
Arguments: None
Result: TShenHotKeys
Purpose:
-----------------------------------------------------------------------------}
function TShenHotKeyItem.GetManager: TShenHotKeys;
begin
Result := THotKeyCollection(Collection).FOwner;
end;
{ PropEditors 属性编辑器 }
type
//
THotKeyProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure GetValues(Proc: TGetStrProc); override;
end;
{-----------------------------------------------------------------------------
Procedure: THotKeyProperty.GetAttributes
Author: slq
Date: 08-三月-2002
Arguments: None
Result: TPropertyAttributes
Purpose:
-----------------------------------------------------------------------------}
function THotKeyProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paValueList, paMultiSelect];
end;
{-----------------------------------------------------------------------------
Procedure: THotKeyProperty.GetValues
Author: slq
Date: 08-三月-2002
Arguments: Proc: TGetStrProc
Result: None
Purpose:
-----------------------------------------------------------------------------}
procedure THotKeyProperty.GetValues(Proc: TGetStrProc);
var i: Integer;
begin
for i := 1 to High(KeyLabels) do
Proc(KeyLabels[i]);
end;
type
//
THotKeyManagerEditor = class(TComponentEditor)
protected
procedure GetPropEdit(Editor: TPropertyEditor);
public
end;
{-----------------------------------------------------------------------------
Procedure: THotKeyManagerEditor.GetPropEdit
Author: slq
Date: 08-三月-2002
Arguments: Editor: TPropertyEditor
Result: None
Purpose:
-----------------------------------------------------------------------------}
procedure THotKeyManagerEditor.GetPropEdit(Editor: TPropertyEditor);
begin
if Editor.GetName = 'HotKeys' then
Editor.Edit;
end;
{$IFDEF VER100} { Delphi 3/4 }
procedure THotKeyManagerEditor.Edit;
var L: TComponentList;
begin
L := TComponentList.Create;
try
L.Add(Component);
GetComponentProperties(L, [tkClass], Designer, GetPropEdit);
finally
L.Free;
end;
end;
{$ENDIF}
{$IFDEF VER130} { Delphi 5 }
procedure THotKeyManagerEditor.Edit;
var L: TDesignerSelectionList;
begin
L := TDesignerSelectionList.Create;
try
L.Add(Component);
GetComponentProperties(L, [tkClass], Designer, GetPropEdit);
finally
L.Free;
end;
end;
{$ENDIF}
{-----------------------------------------------------------------------------
Procedure: Register
Author: slq
Date: 08-三月-2002
Arguments: None
Result: None
Purpose: 注册
-----------------------------------------------------------------------------}
procedure Register;
begin
RegisterComponents('shen', [TShenHotKeys]);
RegisterPropertyEditor(TypeInfo(string), TShenHotKeyItem, 'HotKey',
THotKeyProperty);
RegisterComponentEditor(TShenHotKeys, THotKeyManagerEditor);
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?