我需要在当前聚焦/活动表单上选择组件,但无法完全找到这样做的方法。所以,我有一个包含所有常用程序的 delphi 单元,所以我从其他形式调用它们。现在,问题是,使用其中一个程序我称之为组件显示动作,但是,由于组件被放置在每个表单上(找不到放置一个组件的方法,它可以被所有表单使用,但是我认为这在某种程度上无法做到。我错了吗?),我需要在当前活动的表单上为组件调用一个显示事件,否则我调用组件的指定表单会变得活跃和集中。
到目前为止,我已经尝试通过 Screen.ActiveForm 和 Screen.ActiveForm.Name 获取当前表单名称,但这些都不起作用,因为编译器无法编译,因为未定义组件父级(出现错误“'TForm'不包含名为“KeyBoard1”的成员“...)
这是程序代码:
procedure KeyDownEvents(var Key: Word; Shift: TShiftState);
begin
CurrentForm:=Screen.ActiveForm.Name;
if Key = VK_F9 then CurrentForm.KeyBoard1.Show;
end;
使用全局变量
var CurrentForm: TForm;
由于我尝试了 10 种不同的组合,我在哪里以及缺少什么......?
谢谢,
马克。
Ps:如上所述,有没有办法放置或调用组件,在任何表单上都处于活动状态,或者应该将它放置在每个表单中,所以不会改变焦点......?我知道在 MDI 中我可以使用主要形式的组件(据我所知......),但我在 SDI 工作,因为需要多个监视器......
大卫的完整代码:
unit CommonProcedures;
interface
uses Classes, Dialogs, StdCtrls, Math, Winapi.Windows, Winapi.Messages,
Vcl.Controls, Vcl.Forms, AdvTouchKeyboard;
procedure KeyDownEvents(var Key: Word; Shift: TShiftState);
var
CurrentForm: TComponentName;
KeyBoard1Visible: Boolean;
implementation
uses Startup, Main, Controller, Settings, Patch, Output, StageVisual, FixturesEditor,
FixturesEditorGlobal;
procedure KeyDownEvents(var Key: Word; Shift: TShiftState);
begin
CurrentForm:=Screen.ActiveForm.Name;
if ((ssAlt in Shift) and (Key = VK_F4)) then Key:=0;
if Key = VK_F1 then Main1.Show;
if Key = VK_F2 then Controller1.Show;
if Key = VK_F3 then Settings1.Show;
if Key = VK_F4 then Patch1.Show;
if Key = VK_F5 then Output1.Show;
if Key = VK_F6 then StageVisual1.Show;
if Key = VK_F7 then FixturesEditor1.Show;
if Key = VK_F8 then FixturesEditor2.Show;
if Key = VK_F9 then
begin
if KeyBoard1Visible=False
then
begin
KeyBoard1Visible:=True;
CurrentForm.KeyBoard1.Show;
end
else
begin
KeyBoard1Visible:=False;
CurrentForm.KeyBoard1.Hide;
end;
end;
end;
结尾。
在那里你可以看到,我只省略了所有其他键事件,因为它们完全不重要,但我也省略了检查键盘是显示还是隐藏的过程,因此 VK_F9 表现为切换键。
到目前为止,这是本单元中唯一的程序,因为我几天前才开始创建程序,所以它仍然处于第一垒,所以说...是的,正如你所看到和猜测的那样,它有点轻-显示控制器程序,我大四的项目。
Ps:当我将问题编辑得更清楚时,看不到拒绝投票的理由......