-2

現在フォーカスされている/アクティブなフォームでコンポーネントを選択する必要がありますが、これを完全に行う方法を理解できません。それで、私はすべての一般的な手順を備えたデルファイユニットを持っているので、他の形式からそれらを呼び出します。さて、私がコンポーネントshow actionと呼ぶ手順の1つでは、コンポーネントが各フォームに配置されているため(すべてのフォームで使用できる1つのコンポーネントを配置する方法が見つかりませんでしたが、これはどういうわけかできないと思います。間違っていますか?)、現在アクティブなフォームでコンポーネントの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の異なる組み合わせのように試したので、どこで何が欠けていますか...?

ありがとう、

マーク

追伸:上記のように、コンポーネントを配置または呼び出す方法はありますか、任意のフォームでアクティブにするか、各フォームに配置する必要があるため、フォーカスは変更されません...?私は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はトグルキーとして動作します。

数日前にプログラムを作成し始めたばかりなので、これまでのところ、これがこのユニットの唯一の手順です。まだ一塁手にあるので、そう言いました...そうです、ご覧のとおり、それは一種の軽いものです。 -私の4年生のプロジェクトであるコントローラープログラムを表示します。

追伸:質問をさらに明確にするために編集したときに、質問に反対票を投じる理由がわかりません...

4

1 に答える 1

1

それはできます。同じ名前とタイプであるかどうかなど、フォーム上でコンポーネントがどのように設定されているかによって異なります。たとえば、次の2つの方法があります。

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;
于 2013-03-04T15:37:53.820 に答える