mwkeycmdseditor.pas

来自「本人买的<<VC++项目开发实例>>源代码配套光盘.」· PAS 代码 · 共 264 行

PAS
264
字号
{+-----------------------------------------------------------------------------+
 | Unit:        mwKeyCmdsEditor
 | Version:     0.88
 | Last change: 1999-10-31
 +----------------------------------------------------------------------------+}

unit mwKeyCmdsEditor;

{$I MWEDIT.INC}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, mwKeyCmds, Menus, StdCtrls;

type
  TmwKeystrokesEditorForm = class(TForm)
    KeyCmdList: TListView;
    btnAdd: TButton;
    btnEdit: TButton;
    btnDelete: TButton;
    btnOK: TButton;
    btnCancel: TButton;
    btnReset: TButton;
    procedure FormResize(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnEditClick(Sender: TObject);
    procedure btnDeleteClick(Sender: TObject);
    procedure btnResetClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FKeystrokes: TmwKeystrokes;
    procedure SetKeystrokes(const Value: TmwKeystrokes);
    procedure UpdateKeystrokesList;
    procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    property Keystrokes: TmwKeystrokes read FKeystrokes write SetKeystrokes;
  end;

implementation

{$R *.DFM}

uses
  mwKeyCmdEditor, mwLocalStr;

{ TmwKeystrokesEditorForm }

constructor TmwKeystrokesEditorForm.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FKeystrokes := NIL;
end;

destructor TmwKeystrokesEditorForm.Destroy;
begin
  FKeystrokes.Free;
  inherited Destroy;
end;

procedure TmwKeystrokesEditorForm.SetKeystrokes(const Value: TmwKeystrokes);
begin
  if FKeystrokes = NIL then
    FKeystrokes := TmwKeystrokes.Create(Self);
  FKeystrokes.Assign(Value);
  UpdateKeystrokesList;
end;

procedure TmwKeystrokesEditorForm.UpdateKeystrokesList;
var
  x: integer;
begin
  KeyCmdList.Items.BeginUpdate;
  try
    KeyCmdList.Items.Clear;
    for x := 0 to FKeystrokes.Count-1 do
    begin
      with KeyCmdList.Items.Add do
      begin
        Caption := EditorCommandToCodeString(FKeystrokes[x].Command);
        if FKeystrokes[x].ShortCut = 0 then
          SubItems.Add(MWS_ShortCutNone)
        else
          if FKeystrokes[x].ShortCut2 = 0 then
            SubItems.Add(Menus.ShortCutToText(FKeystrokes[x].ShortCut))
          else
            SubItems.Add(Menus.ShortCutToText(FKeystrokes[x].ShortCut)+ ' '+
                         Menus.ShortCutToText(FKeystrokes[x].ShortCut2));
      end;
    end;
  finally
    KeyCmdList.Items.EndUpdate;
  end;
end;

procedure TmwKeystrokesEditorForm.FormResize(Sender: TObject);
var
  x: integer;
begin
  for x := 0 to ControlCount-1 do
    if Controls[x] is TButton then
    begin
      Controls[x].Left := ClientWidth - Controls[x].Width - 7;
      if Controls[x] = btnOK then
        Controls[x].Top := ClientHeight - (Controls[x].Height * 2) - 10;
      if Controls[x] = btnCancel then
        Controls[x].Top := ClientHeight - Controls[x].Height - 3;
    end else if Controls[x] is TListView then
    begin
      Controls[x].Width := ClientWidth - 96;
      Controls[x].Height := ClientHeight - 8;
    end;
end;

procedure TmwKeystrokesEditorForm.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
begin
  inherited;
  Msg.MinMaxInfo.ptMinTrackSize := Point(300, 225);
end;

procedure TmwKeystrokesEditorForm.btnAddClick(Sender: TObject);
var
  NewStroke: TmwKeystroke;
begin
  with TmwKeystrokeEditorForm.Create(Self) do
    try
      Command := ecNone;
      Keystroke := 0;
      Keystroke2 := 0;
      if ShowModal = mrOK then
      begin
        NewStroke := FKeystrokes.Add;
        NewStroke.Command := Command;
        try
          NewStroke.ShortCut := Keystroke;
          NewStroke.ShortCut2 := Keystroke2;
        except
          on EmwKeyError do
            begin
              // Shortcut already exists in the collection!
              MessageDlg(Format(MWS_DuplicateShortcutMsg,
                                [Menus.ShortCutToText(Keystroke)]),
                         mtError, [mbOK], 0);

              NewStroke.Free;
              exit;
            end;
          // Some other kind of exception, we don't deal with it...
        end;

        with KeyCmdList.Items.Add do
        begin
          Caption := EditorCommandToCodeString(NewStroke.Command);
          if NewStroke.ShortCut = 0 then
            SubItems.Add(MWS_ShortcutNone)
          else
          if NewStroke.ShortCut2 = 0 then
            SubItems.Add(Menus.ShortCutToText(NewStroke.ShortCut))
          else
            SubItems.Add(Menus.ShortCutToText(NewStroke.ShortCut)+ ' '+
                         Menus.ShortCutToText(NewStroke.ShortCut2));
        end;
      end;
    finally
      Free;
    end;
end;

procedure TmwKeystrokesEditorForm.btnEditClick(Sender: TObject);
var
  SelItem: TListItem;
  OldShortcut: TShortcut;
  OldShortcut2: TShortcut;
begin
  SelItem := KeyCmdList.Selected;
  if SelItem = NIL then
  begin
    MessageBeep(1);
    exit;
  end;
  with TmwKeystrokeEditorForm.Create(Self) do
    try
      Command := FKeystrokes[SelItem.Index].Command;
      Keystroke := FKeystrokes[SelItem.Index].Shortcut;
      Keystroke2 := FKeystrokes[SelItem.Index].Shortcut2;
      if ShowModal = mrOK then
      begin
        FKeystrokes[SelItem.Index].Command := Command;
        OldShortCut := FKeystrokes[SelItem.Index].ShortCut;
        OldShortCut2 := FKeystrokes[SelItem.Index].ShortCut2;
        try
          FKeystrokes[SelItem.Index].ShortCut := Keystroke;
          FKeystrokes[SelItem.Index].ShortCut2 := Keystroke2;
        except
          on EmwKeyError do
            begin
              // Shortcut already exists in the collection!
              MessageDlg(Format(MWS_DuplicateShortcutMsg2,
                                [Menus.ShortCutToText(Keystroke)]),
                         mtError, [mbOK], 0);

              FKeystrokes[SelItem.Index].ShortCut := OldShortCut;
              FKeystrokes[SelItem.Index].ShortCut2 := OldShortCut2;
            end;
          // Some other kind of exception, we don't deal with it...
        end;

        KeyCmdList.Items.BeginUpdate;
        try
          with SelItem do
          begin
            Caption := EditorCommandToCodeString(FKeystrokes[Index].Command);
            if FKeystrokes[Index].ShortCut = 0 then
              SubItems[0] := MWS_ShortcutNone
            else
              if FKeystrokes[Index].ShortCut2 = 0 then
                SubItems[0] := Menus.ShortCutToText(FKeystrokes[Index].ShortCut)
              else
                SubItems[0] := Menus.ShortCutToText(FKeystrokes[Index].ShortCut)+ ' '+
                         Menus.ShortCutToText(FKeystrokes[Index].ShortCut2);
          end;
        finally
          KeyCmdList.Items.EndUpdate;
        end;
      end;
    finally
      Free;
    end;
end;

procedure TmwKeystrokesEditorForm.btnDeleteClick(Sender: TObject);
var
  SelItem: TListItem;
begin
  SelItem := KeyCmdList.Selected;
  if SelItem = NIL then
  begin
    MessageBeep(1);
    exit;
  end;
  FKeystrokes[SelItem.Index].Free;
  KeyCmdList.Items.Delete(SelItem.Index);
end;

procedure TmwKeystrokesEditorForm.btnResetClick(Sender: TObject);
begin
  FKeystrokes.ResetDefaults;
  UpdateKeystrokesList;
end;

procedure TmwKeystrokesEditorForm.FormCreate(Sender: TObject);
begin
  {$IFDEF MWE_COMPILER_3_UP}
  KeyCmdList.RowSelect := TRUE;
  {$ENDIF}
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?