我有一个从主窗体打开非模态窗体的应用程序。非模态表单上有一个 TMemo。主窗体菜单使用“空格”作为其加速字符之一。
当非模态表单打开并且备忘录具有焦点时,每次我尝试在非模态表单上的备忘录中输入空格时,“空格”快捷方式的主表单事件都会触发!
我尝试在另一个表单打开但没有骰子时将 MainForm.KeyPreview := false 变为。
有任何想法吗?
当备忘录有焦点时禁用主窗体上的菜单项,并在备忘录丢失时重新启用它。您可以从TMemo.OnEnter
和TMemo.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
和类型转换是为了防止在子表单中对表单变量名进行硬编码。
这可能是一个老话题,但我刚才遇到了同样的问题并寻找了一个合适的解决方案。你的话题出现了,但没有我想使用的解决方案。
我的问题是:我有一个带有很多快捷方式(Backspace、Delete 等)的主表单和一个带有编辑框的第二个表单。编辑框没有得到任何按键动作,由主表单快捷方式处理。
我的解决方案:设置子表单 OnShortCut,它将在快捷方式被主表单解释之前捕获快捷方式:
procedure ChildForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
Handled := True;
Self.DefaultHandler(Msg);
end;
这对我有用,子窗体捕获快捷方式并将它们作为常用键消息处理。编辑框可以按预期使用。
如果您有许多菜单项或许多控件,则可能很难威胁到每个选项的问题。相反,您可以在主窗口的 FormActivate() 和 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;