Delphi 选择当前聚焦/活动窗体上的组件

Delphi 选择当前聚焦/活动窗体上的组件,delphi,components,procedures,Delphi,Components,Procedures,我需要选择当前聚焦/活动表单上的组件,但无法完全找到这样做的方法。 所以,我有一个delphi单元,上面有所有的通用程序,所以我从其他表单调用它们。 现在,问题是,在其中一个过程中,我调用组件show action,但是,由于组件被放置在每个表单上(找不到放置一个组件的方法,它可以被所有表单使用,但我认为这不可能实现。我错了吗?),我需要为当前活动表单上的组件调用show事件,否则,我从中调用组件的指定表单将处于活动状态并聚焦 到目前为止,我已经尝试通过Screen.ActiveForm和Scr

我需要选择当前聚焦/活动表单上的组件,但无法完全找到这样做的方法。 所以,我有一个delphi单元,上面有所有的通用程序,所以我从其他表单调用它们。 现在,问题是,在其中一个过程中,我调用组件show action,但是,由于组件被放置在每个表单上(找不到放置一个组件的方法,它可以被所有表单使用,但我认为这不可能实现。我错了吗?),我需要为当前活动表单上的组件调用show事件,否则,我从中调用组件的指定表单将处于活动状态并聚焦

到目前为止,我已经尝试通过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中工作,因为需要多个监视器


David的完整代码:

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:当我把问题编辑得更清楚时,我不认为有理由否决这个问题……

这是可以做到的。这在某种程度上取决于组件在表单上的设置方式,比如它们是否具有相同的名称和类型。例如,这里有两种方法:

procedure TfrmSiteMapMain.dummy();
Var
  comp : TComponent;
begin
  // Find component by Name
  comp := screen.ActiveForm.FindComponent('btnMyButtonName');
  if comp <> nil then TButton(comp).Click;
end;
过程TfrmSiteMapMain.dummy();
变量
组件:t组件;
开始
//按名称查找组件
comp:=screen.ActiveForm.FindComponent('btnMyButtonName');
如果comp nil,则t按钮(comp)。单击;
结束;

过程TfrmSiteMapMain.dummy();
变量
comp:t控制;
i:整数;
frm:TForm;
开始
frm:=screen.ActiveForm;
对于i:=0到frm.ControlCount-1,开始
成分:=首次控制[i];
//如果您有多个组件,您可以在这里检查其名称、标记等
如果comp.classname为('TButton'),则开始
打破
结束;
结束;
如果comp nil,则t按钮(comp)。单击;
结束;
请注意,表单具有控件集合和组件集合

编辑以添加: 考虑到您上面发布的代码,您可以这样做:(我没有键盘组件,但我猜它是TKeyboard)

如果Key=VK_F9,则切换键盘;
程序切换键盘;
变量
frm:TForm;
组件:t组件;
开始
frm:=Screen.ActiveForm;
如果frm为零,则开始
组件:=frm.FindComponent(“键盘1”);
如果comp nil,则开始
TKeyboard(comp).Visible:=非TKeyboard(comp).Visible;//切换它
结束;
结束;
结束;

我很失望你在这里发布了假代码。请永远不要那样做。始终发布真实代码。我也不知道PS是什么意思。请试着一次问一个问题。这是真实的,不是伪造的代码,但它是真实的,它只是其中的一部分。我确实使用Keyboard1而不是AdvPoputTouchKeyboard1,因为它很长,对我来说这样做没有意义。。。将在整个过程代码下面作为答案发布,这样您就可以看到我遗漏了什么以及为什么。。。没有恶意,但我不想隐藏任何东西…这不是真正的代码。例如,事件处理程序不是这样的。它看起来像
过程TMyFormClass.EventName
。而且,
CurrentForm:=Screen.ActiveForm.Name
的类型不匹配。发布您正在使用的确切代码非常重要。即使这意味着调整它以适合于一个问题。你只有在有答案的情况下才能回答。更新原始问题是可以的,事实上是值得鼓励的。很抱歉给您带来不便。有趣的例子。我也会试试这个。谢谢,由于评论不支持代码,请参阅上面编辑的答案。不,请不要发布您的代码。它对未来的游客没有价值。迈克的回答解决了你的问题。够了。结束了。我们对您的特定代码的血淋淋的细节不感兴趣。我们不需要知道切换所需的精确语法。你需要知道,你已经解决了。好吧,好吧。。。天哪,我是不是杀了什么人或什么的…?马克,你看起来会从读一本德尔福的大书中获益,我建议你去买一本。这里欢迎初学者,但如果您在尝试构建某些东西之前多阅读和学习一些,那就太好了。当变量、类、单元、表单和数据模块的基础知识仍然无法掌握时,我想知道有人会如何帮助你,这让我头疼不已。
procedure TfrmSiteMapMain.dummy();
Var
  comp : TControl;
  i : integer;
  frm : TForm;
begin
  frm := screen.ActiveForm;
  for i := 0 to frm.ControlCount -1 do begin
    comp := frm.Controls[i];
    // If you had multiple components, here's where you could check its name, tag, etc
    if comp.ClassNameIs('TButton') then begin
      Break;
    end;
  end;
  if comp <> nil then TButton(comp).Click;
end;
if Key = VK_F9 then ToggleKeyboard;

procedure ToggleKeyboard;
Var
  frm : TForm;
  comp : TComponent;
begin
  frm := Screen.ActiveForm;
  if frm <> nil then begin
    comp := frm.FindComponent('Keyboard1');
    if comp <> nil then begin
      TKeyboard(comp).Visible := not TKeyboard(comp).Visible; // toggle it
    end;
  end;
end;