如何捕获Firemonkey中的活动控件?

时间:2015-09-03 20:13:36

标签: delphi firemonkey

我正在将VCL应用程序迁移到FMX。我需要知道具有焦点的控件的类。该应用程序适用于各种动态创建的帧,具有多个输入控件 在VCL中,我使用VCL.Forms.TScreen.OnActiveControlChange,因为这是一致地捕获活动控件的地方。此事件在FMX.Forms.TScreen中不可用。什么是FMX的替代方法?

2 个答案:

答案 0 :(得分:1)

在Delphi 10.3中,不幸的是,@ iamjoosy概述的方法在某些情况下(特别是当TabControls / TabItems用作其他控件的容器时)因“访问冲突”而严重失败。

我正在使用的代码:

<script type="text/javascript">
$(document).ready(function(){
    $('#select_all').on('click',function(){
        if(this.checked){
            $('.checkbox').each(function(){
                this.checked = true;
            });
        }else{
             $('.checkbox').each(function(){
                this.checked = false;
            });
        }
    });

    $('.checkbox').on('click',function(){
        if($('.checkbox:checked').length == $('.checkbox').length){
            $('#select_all').prop('checked',true);
        }else{
            $('#select_all').prop('checked',false);
        }
    });
});
</script>
<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js'></script>


<ul class="main">
    <li><input type="checkbox" id="select_all" /> Select all</li>
    <ul>
        <li><input type="checkbox" class="checkbox" value="1"/>Item 1</li>
        <li><input type="checkbox" class="checkbox" value="2"/>Item 2</li>
        <li><input type="checkbox" class="checkbox" value="3"/>Item 3</li>
        <li><input type="checkbox" class="checkbox" value="4"/>Item 4</li>
        <li><input type="checkbox" class="checkbox" value="5"/>Item 5</li>
    </ul>
</ul>

但要增加一点吸引力,如果出现以下情况,上述方法将恢复正常工作:

1)没有TabControl / TabItem对象

2)如果我将以下事件处理程序添加到每个子按钮(例如,将焦点设置回其父TabItem):

procedure TForm1.FormFocusChanged(Sender: TObject);

var

Control : iControl;
MyControl : TFMXObject;

begin

  Control := form1.focused;

  try

      MyControl := TFmxObject(Control.GetObject);
      form1.Caption := MyControl.Name + ' of type ' + MyControl.ClassName;

  finally

    MyControl := nil;
    Control := nil;

  end;

end;

希望有人可以提供有关我是否在做愚蠢的事情,或者是否遇到了FMX错误的建议。

答案 1 :(得分:0)

FMX中最类似的方法是收听TForm.OnFocusChanged事件。然后,您可以在事件处理程序中查找TForm.Focused属性。