0

我有一个从主窗体打开非模态窗体的应用程序。非模态表单上有一个 TMemo。主窗体菜单使用“空格”作为其加速字符之一。

当非模态表单打开并且备忘录具有焦点时,每次我尝试在非模态表单上的备忘录中输入空格时,“空格”快捷方式的主表单事件都会触发!

我尝试在另一个表单打开但没有骰子时将 MainForm.KeyPreview := false 变为。

有任何想法吗?

4

3 回答 3

2

当备忘录有焦点时禁用主窗体上的菜单项,并在备忘录丢失时重新启用它。您可以从TMemo.OnEnterTMemo.OnExit事件中执行此操作。

procedure TOtherForm.Memo1Enter(Sender: TObject);
begin
  if Application.MainForm is TYourMainForm then
    TYourMainForm(Application.MainForm).MenuItemWithSpace. Enabled := False;
end;

procedure TOtherForm.Memo1Exit(Sender: TObject);
begin
  if Application.MainForm is TYourMainForm then
    TYourMainForm(Application.MainForm).MenuItemWithSpace. Enabled := True;
end;

使用Application.MainForm和类型转换是为了防止在子表单中对表单变量名进行硬编码。

于 2010-04-21T12:48:46.050 回答
2

这可能是一个老话题,但我刚才遇到了同样的问题并寻找了一个合适的解决方案。你的话题出现了,但没有我想使用的解决方案。

我的问题是:我有一个带有很多快捷方式(Backspace、Delete 等)的主表单和一个带有编辑框的第二个表单。编辑框没有得到任何按键动作,由主表单快捷方式处理。

我的解决方案:设置子表单 OnShortCut,它将在快捷方式被主表单解释之前捕获快捷方式:

procedure ChildForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := True;
  Self.DefaultHandler(Msg);
end;

这对我有用,子窗体捕获快捷方式并将它们作为常用键消息处理。编辑框可以按预期使用。

于 2014-05-06T15:57:18.323 回答
0

如果您有许多菜单项或许多控件,则可能很难威胁到每个选项的问题。相反,您可以在主窗口的 F​​ormActivate() 和 FormDeActivate() 方法中使用一个函数,以便以简单的方式清理和恢复所有快捷方式:

var sstore : TStrings;

procedure Tmain_form.FormActivate(Sender: TObject);
begin
    if (sstore <> NIL) then tratta_shortcuts_menu(main_menu, {read_shortcuts}FALSE, sstore)
end;

procedure Tmain_form.FormDeactivate(Sender: TObject);
begin
    tratta_shortcuts_menu(main_menu, {read_shortcuts}TRUE, sstore)
end;

procedure tratta_shortcuts_menu(menu : TMainMenu;bo_read_shortcuts : boolean;var sstore : TStrings);
{ if BO_READ_SHORTCUTS then 1) read shortcuts 2) save them on SSTORE (Shortcuts STORE) 3) delete them from menu;
ELSE restore all shortcuts from SSTORE  }

procedure sostituisci(im : TMenuItem);
const INDICATORE_SHORTCUT = '~ ';
begin
    if bo_read_shortcuts then begin
        if (im.ShortCut <> 0) then begin
            sstore.Add(im.name);
            sstore.Add(INDICATORE_SHORTCUT + menus.ShortCutToText(im.ShortCut));    
            im.ShortCut := 0
        end
    end
    else begin
        var i : smallint := sstore.indexof(im.Name);
        if (i <> -1) then begin
            im.ShortCut := menus.TextToShortCut(copy(sstore[i + 1], length(INDICATORE_SHORTCUT) + 1, MAXINT))
        end
    end
end;

procedure tratta(im : TMenuItem);
begin
    sostituisci(im);
    for var i : smallint := 0 to im.Count-1 do tratta(im.Items[i])
end;

begin
    if (menu = NIL) then exit;

    if bo_read_shortcuts then begin if (sstore = NIL) then sstore := TStringList.Create else sstore.Clear end;
    for var i : smallint := 0 to menu.Items.Count-1 do tratta(menu.Items[i]);
    if NOT bo_read_shortcuts then begin sstore.Free;sstore := NIL end
end;
于 2021-10-03T00:23:43.607 回答