选择当前聚焦/活动表单上的组件

时间:2013-03-04 14:41:09

标签: delphi components procedures

我需要选择当前聚焦/活动表单上的组件,但无法完全理解这一点。 所以,我有一个包含所有常用程序的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:当我编辑这个问题时,看不清楚这个问题的原因是为了更清楚......

1 个答案:

答案 0 :(得分:1)

可以做到。它确实取决于如何在表单上设置组件,就像它们是否是相同的名称和类型一样。例如,这里有两种方法:

procedure TfrmSiteMapMain.dummy();
Var
  comp : TComponent;
begin
  // Find component by Name
  comp := screen.ActiveForm.FindComponent('btnMyButtonName');
  if comp <> nil then TButton(comp).Click;
end;

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;

请注意,表单有一个Controls集合和一个Component集合。

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

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;